JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题,程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作

- ResultSet
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成,ResultSet对象保持一个光标指向其当前的数据行,最初,光标位于第一行之前,next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false,因此可以在while循环中使用循环来遍历结果集
- Statement
statement对象是用于执行静态SQL语句并返回其生成的结果的对象,在连接建立后,需要对数据库进行访问,执行命名或是SQL语句,可以通过Statement【存在SQL注入问题】,PreparedStatement【预处理】,CallableStatement【存储过程】
SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库,要防范SQL注入,只要用PreparedStatement取代Statement就可以了

- 批处理
当需要成批插入或者更新记录时,可以采用java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理,通常情况下比单独提交处理更有效率。
JDBC的批量处理语句包括下面方法:
- addBatch():添加需要批量处理的SQL语句或参数
- executeBatch():清空批处理包的语句
- clearBatch():清空批处理包的语句
JDBC连接MySQL时,如果要使用批处理功能需在url中加参数**?rewriteBatchedStatements=true**
批处理往往和PreparedStatement一起搭配使用,可以既减少编译次数,又减少运行次数,效率大大提高
- 数据库连接池

数据库连接池:
- 预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从"缓冲池"中取出一个,使用完毕之后再放回去。
- 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
- 当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中
通俗的讲:数据库连接池=数据库界的共享单车系统,让连接可以循环使用,省时省力又高效。
- 数据库连接池种类
- JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由第三方提供实现
- C3P0数据库连接池,速度相对较慢(比传统的JDBC肯定要快),稳定性不错(hibernate,spring)
- DBCP数据库连接池,速度相对c3p0较快,但不稳定
- Proxool数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点
- BoneCP数据库连接池,速度快
- **Druid(德鲁伊)**是阿里提供的数据库连接池,集DBCP、C3P0、Proxool优点于一身的数据库连接池
- Apache-DBUtils
一个问题,当我们使用ResultSet返回结果集时,结果集和connection是关联的,如果我们关闭连接,就不能再使用结果集,但是我们的connection又不能不关闭,所以在这种情况下结果集不利于数据的管理,需要使用返回的信息时也不方便,为了解决这个情况引入了Apache-DBUtils
commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的封装,使用dbutils能极大简化jdbc编码的工作量
DbUtils类

- BasicDao
虽然apache-dbutils+Druid简化了JDBC开发,但还有不足:sql语句是固定的,不能通过参数传入,通用性不好,需要进行改进,更方便执行增删改查;对于select操作,如果有返回值,返回类型不能固定,需要使用泛型,将来的表很多,业务需求复杂,不可能只靠一个java类完成,因此有了BasicDao
DAO(data access object 数据访问对象),这样的通用类,称为BasicDao。是专门和数据库交互的,即完成对数据库(表)的crud操作,