JavaWeb——Day10_1

来源:互联网 发布:java cache 编辑:程序博客网 时间:2024/06/11 01:31

*1.JDBC快速入门



如何在java代码中操作数据库?



Sun公司为简化数据库开发,定义了一套jdbc接口,这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jdbc加载具体的驱动,就可以操作数据库。




例子:用java程序查询数据库信息

1.导包


2.



一、JDBC
数据库驱动:
数据库厂商为了方便开发人员从程序中操作数据库而提供的一套jar包,通过导入这个jar包就可以调用其中的方法操作数据库,这样的jar包就叫做数据库驱动
JDBC:
sun定义的一套标准,本质上是一大堆的操作数据库的接口,所有数据库厂商为java设计的数据库驱动都实现过这套接口,这样一来同一了不同数据库驱动的方法,开发人员只需要学习JDBC就会使用任意数据库驱动了

六个步骤实现JDBC:
//1.注册数据库驱动
DriverManager.registerDriver(new Driver());
//2.获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day10", "root", "root");
//3.获取传输器对象
Statement stat = conn.createStatement();
//4.利用传输器传输sql语句到数据库中执行,获取结果集对象
ResultSet rs = stat.executeQuery("select * from user");
//5.遍历结果集获取查询结果
while(rs.next()){
String name = rs.getString("name");
System.out.println(name);
}
//6.关闭资源
rs.close();
stat.close();
conn.close();









如果数据库链接的是本机,可以省写localhost,如果是默认端口可以省写3306,



*2.JDBC细节















package com.itheima.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class JDBCDemo1 {public static void main(String[] args){Connection conn = null;Statement stat = null;ResultSet rs = null;try{//1.注册数据库驱动//--由于mysql在Driver类的实现中自己注册了一次,而我们又注册了一次,于是会导致MySql驱动被注册两次//--创建MySql的Driver对象时,导致了程序和具体的Mysql驱动绑死在了一起,在切换数据库时需要改动java代码//DriverManager.registerDriver(new Driver());Class.forName("com.mysql.jdbc.Driver");//2.获取数据库连接conn = DriverManager.getConnection("jdbc:mysql:///day10?user=root&password=root");//3.获取传输器对象stat = conn.createStatement();//4.利用传输器传输sql语句到数据库中执行,获取结果集对象rs = stat.executeQuery("select * from user");//5.遍历结果集获取查询结果while(rs.next()){String name = rs.getString("name");System.out.println(name);}}catch (Exception e) {e.printStackTrace();}finally{//6.关闭资源if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}finally{rs = null;}}if(stat!=null){try {stat.close();} catch (SQLException e) {e.printStackTrace();}finally{stat = null;}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}finally{conn = null;}}}}}


*3.JDBC增删改查



jdbcutils:

package com.itheima.util;import java.io.FileReader;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;public class JDBCUtils {private static Properties prop = null;private JDBCUtils() {}static{try{prop = new Properties();prop.load(new FileReader(JDBCUtils.class.getClassLoader().getResource("config.properties").getPath()));}catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}/** * 获取连接 * @throws ClassNotFoundException  * @throws SQLException  */public static Connection getConn() throws ClassNotFoundException, SQLException{// 1.注册数据库驱动Class.forName(prop.getProperty("driver"));// 2.获取连接return DriverManager.getConnection(prop.getProperty("url"), prop.getProperty("user"), prop.getProperty("password"));}/** * 关闭连接 */public static void close(ResultSet rs, Statement stat,Connection conn){if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}finally{rs = null;}}if(stat!=null){try {stat.close();} catch (SQLException e) {e.printStackTrace();}finally{stat = null;}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}finally{conn = null;}}}}


JunitTest:

package com.itheima.jdbc;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;import com.itheima.util.JDBCUtils;public class JDBCDemo2 {@Testpublic void delete(){Connection conn = null;Statement stat = null;ResultSet rs = null;try{conn = JDBCUtils.getConn();stat =  conn.createStatement();stat.executeUpdate("delete from user where name='zhaoliu'");}catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.close(rs, stat, conn);}}@Testpublic void find(){Connection conn = null;Statement stat = null;ResultSet rs = null;try{conn = JDBCUtils.getConn();stat =  conn.createStatement();rs = stat.executeQuery("select * from user where name='zhaoliu'");while(rs.next()){String name = rs.getString("name");String password = rs.getString("password");System.out.println(name+":"+password);}}catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.close(rs, stat, conn);}}@Testpublic void update() {Connection conn = null;Statement stat = null;try{conn = JDBCUtils.getConn();stat =  conn.createStatement();stat.executeUpdate("update user set password=999 where name='zhaoliu'");}catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.close(null, stat, conn);}}@Testpublic void add() {Connection conn = null;Statement stat = null;try {// 1.注册数据库驱动// 2.获取连接conn = JDBCUtils.getConn();// 3.获取传输器对象stat = conn.createStatement();// 4.执行sql语句int count = stat.executeUpdate("insert into user values (null,'zhaoliu','123456','zhaoliu@qq.com','1999-09-09')");// 5.处理结果if (count > 0) {System.out.println("执行成功!影响到的行数为" + count);} else {System.out.println("执行失败!!");}} catch (Exception e) {e.printStackTrace();} finally {//6.关闭资源JDBCUtils.close(null, stat, conn);}}}


*4.改造User案例

创建表-在数据库里面。



2.导包。

3.改代码












这样切换数据库dao不好!

软件分层的好处:

一、为什么:要分层使软件具有结构性,便于开发、维护和管理。将不同功能模块独立,在需要替换某一模块时不需要改动其他模块,方便代码的复用、替换二、层与层耦合的概念,利用工厂类解耦在分层结构中,我们希望将各个功能约束在各自的模块(层)当中的,而当属于某一层的对象、方法“入侵”到了其他层,如将web层的ServletContext对象传入service层,或service层调用XMLDao独有的方法,就会导致层与层之间的关系过于“紧密”,当需要修改某一层时不可避免的要修改其他关联的层,这和我们软件分层最初的设想-----层与层分离,一个层尽量不依赖其他层存在,当修改一层时无需修改另一层的设想是违背的。这种“入侵”造成的“紧密”关系就早做层与层之间发生的“耦合”,而去掉这种耦合性的过程就叫做层与层之间“解耦”利用工厂类可以实现解耦的功能三、如何判断一项功能到底属于哪一层某一项功能属于哪一层,往往是不能明确确定出来的,这时可以参考如下标准进行判断:此项功能在业务逻辑上更贴近与哪一层,放在哪一层更能较少耦合此项功能是否必须使用某一层特有的对象如果放在哪一层都可以,那么放在哪一层更方便技术上的实现,及方便代码的编写和维护四、异常的处理如果一个异常抛给上一层会增加程序的耦合性,请当场解决:如将xml解析错误抛给service层,那么当换成mysqldao时,还需要修改service去掉xml解析异常的处理如果上一层明确需要此异常进行代码的流转,请抛出:如当查找一个用户信息而用户找不到时,可以抛出一个用户找不到异常,明确要求上一层处理如果这一层和上一层都能解决尽量在这一层解决掉如果这一层不能解决,而上一层能解决抛给上一层如果所有层都不能解决,则应抛出给虚拟机使线程停止,但是如果直接抛出这个异常,则还需要调用者一级一级继续往上抛出最后才能抛给虚拟机,所以还不如在出现异常的位置直接trycatch住后转换为RuntimeException抛出。:如读取配置文件出错,任何层都不能解决,转为RuntimeException抛出,停止线程。



package com.itheima.factory;import java.io.FileReader;import java.util.Properties;import com.itheima.dao.UserDao;public class DaoFactory {private static DaoFactory factory = new DaoFactory();private static Properties prop = null;static{try{prop = new Properties();prop.load(new FileReader(DaoFactory.class.getClassLoader().getResource("config.properties").getPath()));}catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}private DaoFactory() {}public static DaoFactory getFactory(){return factory;}public UserDao getDao(){try{String clazz = prop.getProperty("UserDao");return  (UserDao) Class.forName(clazz).newInstance();}catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}}




SQL注入攻击



SQL注入攻击:
由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,这样的攻击方式就叫做sql注入攻击

利用下面的就可以解决这个sql注入攻击,下篇讲。




0 0
原创粉丝点击