Java回炉学习(十一)
1. JDBC介绍
-
JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。
-
Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。
-
说明JDBC是Java提供一套用于数据库操作的接口API, ava程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。
-
获取数据库连接的五种方式:方式 4: 使用 Class.forName 自动完成注册驱动,简化代码 //这种方式获取连接是使用的最多,推荐使用
Class.forName("com.mysql.jdbc.Driver");
//使用反射加载了 Driver类 //在加载 Driver类时,完成注册 源码: 1. 静态代码块,在类加载时,会执行一次. 2. DriverManager.registerDriver(new Driver()); 3. 因此注册driver的工作已经完成 static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }
2. ResultSet数据集:
- 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成
- ResultSet对象保持个光标指向其当前的数据行。最初, 光标位于第一行之前next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false,因此可以在while循环中使用循环来遍历结果集
- 底层是一个arraylist存储每一行,每一行为一个elementdata数组
3. PreparedStatement
- PreparedStatement执行的SQL语句中的参数用问号(?)来表示,调用PreparedStatement对象的setXxx()方法来设置这些参数. setXxx()方法有两个参数,第一一个参数是要设置的SQL语句中的参数的索引(从1开始),第二个是设置的SQL语句中的参数的值
- 调用executeQuery),返回ResultSet对象
- 调用executeUpdate():执行更新,包括增、删、修改
- 预处理的好处:1. 不再使用+拼接sq|语句,减少语法错误 2. 有效的解决了sql注入问题! 3. 大大减少了编译次数,效率较高
4. JDBC小结
5. 事务
- JDBC程序中当一个Connection对象创建时,默认情况下是自动提交事务:每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
- JDBC程序中为了让多个SQL语句作为一个整体执行,需要使用事务调用Connection的setAutoCommit(false)可以取消自动提交事务
- 在所有的SQL语句都成功执行后,调用Connection的commit();方法提交事务
- 在其中某个操作失败或出现异常时,调用Connection的rollback();方法回滚事务
- 批处理:
- 当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。
- 许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。addBatch(:添加需要批量处理的SQL语句或参数;executeBatch(:执行批量处理语句: clearBatch():清空批处理包的语句
- JDBC连接MySQL时,如果要使用批处理功能,请再url中加参数?rewriteBatchedStatements-true
- 批处理往往和PreparedStatement-起搭配使用,可以既减少编译次数,又减少运行次数,效率大大提高
6. 数据库连接池
- 传统的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再验证IP地址,用户名和密码(0.05S ~ 1s时间)。需要数据库连接的时候,就向数据库要求一个,频繁的进行数据库连接操作将占用很多的系统资源,容易造成服务器崩溃。
- 每一次数据库连接,使用完后都得断开,如果程序出现异常而未能关闭,将导致数据库内存泄漏,最终将导致重启数据库。
- 传统获取连接的方式,不能控制创建的连接数量,如连接过多,也可能导致内存泄漏,MySQL崩溃。
- 解决传统开发中的数据库连接问题,可以采用数据库连接池技术( connection pool)
- JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由第三方提供实现[提供jar]
- C3P0数据库连接池,速度相对较慢,稳定性不错(hibernate, spring);DBCP数据库连接池,速度相对c3p0较快,但不稳定
- Proxool数据库连接池,有监控连接池状态的功能,稳定性较c3p0差点;BoneCP数据库连接池,速度快
- Druid(德鲁伊)是阿里提供的数据库连接池,集DBCP、C3P0、 Proxool优点于一身的数据库连接池
7. Apache-DBUtils
-
关闭connection后, resultSet结果集无法使用resultSet不利于数据的管理
-
commons-dbutils是Apache组织提供的一个开源JDBCI具类库,它是对JDBC的封装,使用dbutils能极大简化jdbc编码的工作量
-
QueryRunner类:该类封装了SQL的执行,是线程安全的。可以实现增、删、改、查、批处理使用QueryRunner类实现查询
-
ResultSetHandler接口:该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。
-
apache- dbutils + Druid简化了JDBC开发,但还有不足:
- SQL语句是固定,不能通过参数传入,通用性不好,需要进行改进,更方便执行增删改查
- 对于select操作,如果有返回值,返回类型不能固定,需要使用泛型
- 将来的表很多,业务需求复杂,不可能只靠一个Java类完成
- 引出=》BasicDAO画出示意图,看看在实际开发中,应该如何处理