JDBC与常用工具类
JDBC
基本使用
JDBC操作数据库一般有这样几个步骤:
- 加载驱动类
- 获取数据库连接对象
- 获取数据库操作对象(由连接对象生成)
- 编写SQL语句
- 使用操作对象执行语句
- 对执行结果进行处理
- 关闭各操作对象
用代码来完整描述这一过程:
上面直接使用了Statement接口。PreparedStatement是Statement的子接口,属于预处理操作,会在调用时直接将SQL语句提交给数据库进行编译,得到的PreparedStatement句柄是预编译好的SQL语句。
使用预编译的执行效率要比直接提交高,而且不会引起SQL注入的安全问题。
事务控制
JDBC实现事务控制,需要在添加批量操作addBatch()之前关闭事务的自动提交,并在执行事务的时候,手动提交。
数据库连接池
为避免每次访问数据库都重新建立和释放连接,使用数据库连接池来负责管理数据库连接,当池中有多余连接,则使用池中已有的连接对象。
如果要自己简单实现连接池,可以使用列表来储存连接对象,当需要时返回存在的资源即可。
从文件读取配置
配置文件和JDBC并没有必然的联系。
在资源目录下新建任意文件,文件后缀不限,内容为:
在JAVA中获取配置:
通过这样的方式,可结合到JDBC中,将配置与执行过程分离。
另外ResourceBundle对象也可用于读取配置文件,其要求文件后缀名为.properties,然后这样来取值:
DBCP
DBCP是一个提供数据库连接池的工具类,这里使用的版本是2.5.0。使用DBCP需要依赖Pool和Logging,它们都是Apache Commons系列的组件。
这是一个没有使用DBCP的例子,仅仅使用到了标准JDBC的API:
接下来通过DBCP提供的连接池完成上面的操作,与例子不同的只是setupDataSource()方法,因为是从资源对象中获取连接,现在加入了连接池进行管理:
官方提供的示例中还包含了驱动池的示例。
C3P0
C3P0是另一个数据库连接池工具类,下面的例子简单使用了C3P0:
和DBCP相比,C3P0在使用上更加简洁明了。
DbUtils
DbUtils也是Apache Commons系列的组件之一,是一个数据库操作的工具类,比较常用的是其提供的QueryRunner对象:
因为创建QueryRunner对象需要使用BasicDataSource,所以要先获取资源对象。
QueryRunner对象的query方法,第一个参数是SQL语句,第二个参数是匿名类。上面的示例中使用了lambda表达式,直接打印出查询结果。rs的类型即为sql包中的ResultSet。
下面是官网提供的示例,直接使用匿名类,打印出了数据库中第一行的所有字段:
QueryRunner使得结果集高度可定制,可用来处理比较复杂的返回结果,将其封装为自定义的对象类型。