Yuque Archive
寻常的路

JDBC与常用工具类

JDBC

基本使用

JDBC操作数据库一般有这样几个步骤:

  1. 加载驱动类
  2. 获取数据库连接对象
  3. 获取数据库操作对象(由连接对象生成)
  4. 编写SQL语句
  5. 使用操作对象执行语句
  6. 对执行结果进行处理
  7. 关闭各操作对象

用代码来完整描述这一过程:

上面直接使用了Statement接口。PreparedStatement是Statement的子接口,属于预处理操作,会在调用时直接将SQL语句提交给数据库进行编译,得到的PreparedStatement句柄是预编译好的SQL语句。

使用预编译的执行效率要比直接提交高,而且不会引起SQL注入的安全问题。

事务控制

JDBC实现事务控制,需要在添加批量操作addBatch()之前关闭事务的自动提交,并在执行事务的时候,手动提交。

数据库连接池

为避免每次访问数据库都重新建立和释放连接,使用数据库连接池来负责管理数据库连接,当池中有多余连接,则使用池中已有的连接对象。

如果要自己简单实现连接池,可以使用列表来储存连接对象,当需要时返回存在的资源即可。

从文件读取配置

配置文件和JDBC并没有必然的联系。

在资源目录下新建任意文件,文件后缀不限,内容为:

在JAVA中获取配置:

通过这样的方式,可结合到JDBC中,将配置与执行过程分离。

另外ResourceBundle对象也可用于读取配置文件,其要求文件后缀名为.properties,然后这样来取值:

DBCP

DBCP是一个提供数据库连接池的工具类,这里使用的版本是2.5.0。使用DBCP需要依赖PoolLogging,它们都是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使得结果集高度可定制,可用来处理比较复杂的返回结果,将其封装为自定义的对象类型。