1.封装JDBC工具类的步骤 ---JdbcUtils
1)准备配置文件 jdbc.properties url=jdbc:mysql://localhost:3306/库名 driverClass=com.mysql.jdbc.Driver user=root password=123456 2) 当前类中提供静态代码块 static{ 1)读取配置文件 InputStream inputStream = 前类名.class.getClassLoader().getResourceAsStream("jdbc.properties") ; 2)创建属性集合列表 Properties prop = new Properties() ; //3)加载字节输入流对象到属性集合列表中 prop.load(inputStream) ; //4)通过key获取value //public String getProperty(String key) 获取四个key----给成员变量进行赋值 5)加载驱动 Class.forName(驱动类的全限定名称获取到); } 3)静态方法----获取Connection Connection conn = DriverManager.getConnection(三个参数直接传进去) ; 4)静态方法--->释放资源 针对DML语句 释放Statment以及Connection 针对DQL语句:释放ResultSet Statement,Connection
2.单元测试的使用步骤
1)导入jar包 junit核心包 以及依赖包 2)针对某个类进行---- 单元测试---测试功能 书写方法,上面标记是单元测试方法 @Test---->执行单元测试之前,可以完成初始化操作 @Before标记方法 执行单元测试方法执行,释放资源 @After标记的方法中
3.Statement执行对象操作DQL的步骤
//1)通过工具类获取连接对象 Connection conn = JdbcUtils.getConnection(); //2)sql String sql = "select * from emp " ; //3)创建执行对象 Statement stmt = conn.createStatement() ; //4)执行sql ResultSet rs = stmt.executeQuery(sql) ; //5)遍历结果集 while(rs.next()){ //获取数据 //通过列的索引值获取,第一列就是1,./.. //第一个id字段 int // int id = rs.getInt(1) ; //获取通过列的名称获取 int id =rs.getInt("id") ; }
4.如何获取src下面的配置文件.properties内容
InputStream inputStrema = 前类名.class.getClassLoader().getResourceAsStream("jdbc.properties") ; // 2)创建属性集合列表 Properties prop = new Properties() ; //3)加载字节输入流对象到属性集合列表中 prop.load(inputStream) ; //4)通过key获取value //public String getProperty(String key)
今日内容
1. 通过 JDBC 员工表---->通过接口方式---使用单元测试---添加员工类---给员工表插入数据(日期的处理)
2.Statement和PreparedStatement预编译的区别
PreparedStatement使用步骤 ------------以后全部都是用预编译 键盘录入用户名和密码,模拟登录操作 如果一致,登录成功;否则,提示登录失败 SQL注入 通过sql的拼接存在一些问题 用户名和密码存在拼接,非常不安全的行为! select * from user where username = 'xxx' and password = 'or '1'='1' ;
-
之前通过sql指令的方式控制事务 (事务:让同时执行多个sql语句要么一块成功,要么一块失败!)
-
1)开启事务 :start transaction ;
-
2)执行多个sql语句/或者多张表的sql--添加/删除/修改
-
3)如果有问题,回滚事务 rollback;
-
没有问题,提交事务 最终 commit ; * *
-
JDBC方式控制事务
-
java.sql.Connection:
-
void setAutoCommit(boolean autoCommit) throws SQLException 设置提交模式
-
参数为false,表示禁用自动提交;为true,默认就是自动提交
-
void rollback() throws SQLException 事务回滚,撤销之前的所有更新操作; (前提必须处于手动提交)
-
void commit() throws SQLException 提交事务,将数据永久保存!
3.频繁的去使用DriverManager.getConnection(xx)--->优化
数据库的连接池:------->sun公司同一个接口java.sql.DataSource代替DriverManager dbcp c3p0 druid:德鲁伊 阿里提供的插件 (使用这个,为监控而生!) DruidDataSource 实现java.sql.DataSource接口 连接池要使用----jdbc.properties文件内容改变了,key的名称必须满足druid连接池中的参数
4.加入连接池之后的JdbcUtils工具类的优化!(最终版)
模拟线程场景,每一个线程都是用自己的连接对象!ThreadLocal<T>
5.开源插件---Commons-DbUtils (项目中使用这个插件)
Apache组织提供 一种开源的原生jdbc的简易封装!---->书写更简单 导入jar包---版本1.6---下一次1.7
面试题
Statement和PreparedStatement预编译的区别
Statement执行sql的效率相对PreparedStatement非常低 1)每次书写一条sql就需要通过Statmeent将sql语句发送给数据库,效率低;同时,数据库的压力大! 2)发送的sql语句存在字符串拼接,就会出现安全问题--->SQL注入,恶意攻击数据库,造成安全漏洞! PreparedStatement执行sql语句效率相对来说很高 1)将一条参数化 的sql语句发送给数据库,进行预编译将编译结果存储在预编译对象中,下一次直接赋值, 而且赋值很多次,发送一次sql,执行不同的参数! 2)参数化的sql语句不存在支持拼接,有效防止SQL注入,开发中使用PreparedStatement来对数据库CRUD
#德鲁伊的加载驱动的名称driverClassName driverClassName=com.mysql.jdbc.Driver #连接的库的地址 url=jdbc:mysql://localhost:3306/ee_2211_02 #用户名 username=root #密码 password=123456 #连接池启用之后初始化的连接数量5个 initialSize=5 #连接池中最大激活数量10个 maxActive=10 #最大等待时间 3000毫秒(3秒),当连接池如果中的连接数数量超过了最大就激活数量,等待3秒中连接,如果超过3秒,拒绝连接对象进入连接池 maxWait=3000