Apache-DBUtils简介
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,帮我们简化了CRUD
的代码。其中的主要API,如QueryRunner类简化了SQL查询,它与ResultSetHandler接口(或其实现类)组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
主要API简述:
QueryRunner类:提供了数据库操作的一系列重载的update()和query()操作。
ResultSetHandler接口:用于处理数据库查询操作得到的结果集。还可通过不用结果集的情况,由其不同的子类来实现。
DbUtils:提供如关闭连接、装载JDBC驱动程序等常规工作的工具类。
1)public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。该方法需要手动编码判断所提供的参数是不是NULL,如果不是的话,就关闭Connection、Statement和ResultSet。
2)public static void closeQuietly(…): 这一类方法能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。
代码使用测试
1.导入支持的jar包(commons-dbutils-1.6.jar)
2.使用DBUtils对数据表进行CRUD操作
写法一使用带参数(DataSource)的QueryRunner构造器,可以通过在工具类(JDBCUtils.java)添加一个静态的获取数据源的方法,避免写重复代码
写法二使用QueryRunner默认的构造器时,执行CRUD操作带入的参数要有一个连接,连接的获取通过数据库连接池来获取数据库连接的工具类(JDBCUtils.java)来实现。
public class TestDBUtils {
//测试增删改
@Test
public void testCUD() throws Exception{
//得到数据库连接池
Properties pros = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
pros.load(is);
DataSource createDataSource = DruidDataSourceFactory.createDataSource(pros);
//写法一:使用带参数(DataSource)的QueryRunner构造器,会从DataSource中自动获取连接
QueryRunner queryRunner = new QueryRunner(createDataSource);
//增
String insertSql = "insert into t_students values(null,?,?,?)";
int insertNum = queryRunner.update(insertSql,"123",18,"男");
System.out.println("添加了" + insertNum + "条记录");
//删
String deleteSql = "delete from t_students where id=?";
int deleteNum = queryRunner.update(deleteSql,1);
System.out.println("删除了" + deleteNum + "条记录");
//改
String updateSql = "update t_students set name=? where id=?";
int updateNum = queryRunner.update(updateSql,"9999",8);
System.out.println("更新了" + updateNum + "条记录");
// //写法二:使用QueryRunner默认的构造器方法
// QueryRunner queryRunner2 = new QueryRunner();
// //需要获取用于运行增删改查的连接
// Connection conn = JDBCUtils.getConnection1();
// String insertSql = "insert into t_students values(null,?,?,?)";
// //把连接带入增删改查的方法
// int insertNum = queryRunner.update(conn,insertSql,"128",10,"男");
// System.out.println("添加了" + insertNum + "条记录");
}
//测试查(使用ResultSetHandler接口的匿名实现类,自己封装)
@Test
public void testR() throws Exception{
//得到数据库连接池
Properties pros = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
pros.load(is);
DataSource createDataSource = DruidDataSourceFactory.createDataSource(pros);
//得到QueryRunner
QueryRunner queryRunner = new QueryRunner(createDataSource);
//查(使用ResultSetHandler接口的匿名实现类,自己封装)
String selectSql = "select * from t_students where id=?";
//执行查询,查询到的数据存放在ResultSet里面。 然后调用handle方法,自己手动去封装。
Student student = queryRunner.query(selectSql, new ResultSetHandler<Student>(){
@Override
public Student handle(ResultSet rs) throws SQLException {
Student student = new Student();
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String sex = rs.getString("sex");
student.setId(id);
student.setName(name);
student.setAge(age);
student.setSex(sex);
}
return student;
}
},9);
System.out.println(student.toString());
}
//测试查(使用ResultSetHandler接口的实现类,官方封装好了)
@Test
public void testR2() throws Exception{
//得到数据库连接池
Properties pros = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
pros.load(is);
DataSource createDataSource = DruidDataSourceFactory.createDataSource(pros);
//得到QueryRunner
QueryRunner queryRunner = new QueryRunner(createDataSource);
//查询单个对象(使用ResultSetHandler的实现类:BeanHandler)
String selectSql = "select * from t_students where id=?";
//BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
//Student.class:通过类的字节码得到该类的实例(JavaBean)
Student student = queryRunner.query(selectSql, new BeanHandler<Student>(Student.class), 8);
System.out.println(student.toString());
System.out.println("-----------------------------------------------------");
//查询多个对象构成的集合(使用ResultSetHandler的实现类:BeanListHandler)
String selectSql2 = "select id,name,age from t_students where id < ?";
//BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
//Student.class:通过类的字节码得到该类的实例(JavaBean)
List<Student> studentList = queryRunner.query(selectSql2, new BeanListHandler<>(Student.class), 8);
for (Student student2 : studentList) {
System.out.println(student2.toString());
}
System.out.println("------------------------------------------------------");
//查询最大的,最小的,平均的,总和,个数相关的数据(使用ResultSetHandler的实现类:ScalarHandler)
String selectSql3 = "select max(age) from t_students";
//ScalarHandler:查询单个值对象
int maxAge = (int) queryRunner.query(selectSql3, new ScalarHandler());
System.out.println("最大年龄:"+maxAge);
}
}
把DbUtils类提供的关闭连接与资源的相关操作封装到工具类(JDBCUtils.java)
一个较完整的JDBCUtils工具类
public class JDBCUtils {
//使用C3P0的数据库连接池技术获取数据库连接
private static ComboPooledDataSource comboPooledDataSource=new ComboPooledDataSource();
public static Connection getConnection() throws SQLException{
return comboPooledDataSource.getConnection();
}
//使用Druid数据库连接池技术获取数据库连接
private static DataSource createDataSource;
static{
try {
Properties pros = new Properties();
InputStream is = JDBCUtils.class.getResourceAsStream("/druid.properties");
//InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
pros.load(is);
createDataSource = DruidDataSourceFactory.createDataSource(pros);
} catch (Exception e) {
e.printStackTrace();
}
}
//得到连接的方法
public static Connection getConnection1() throws SQLException{
return createDataSource.getConnection();
}
//得到数据源的方法
public static DataSource getDataSource() {
return createDataSource;
}
//使用dbutils.jar中提供的DbUtils工具类,实现资源的关闭
public static void closeResource1(Connection conn,Statement ps,ResultSet rs){
// try {
// DbUtils.close(conn);
// } catch (SQLException e) {
// e.printStackTrace();
// }
// try {
// DbUtils.close(ps);
// } catch (SQLException e) {
// e.printStackTrace();
// }
// try {
// DbUtils.close(rs);
// } catch (SQLException e) {
// e.printStackTrace();
// }
DbUtils.closeQuietly(conn);
DbUtils.closeQuietly(ps);
DbUtils.closeQuietly(rs);
}
//实现资源的关闭的方法说明:
//public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。该方法需要手动编码判断所提供的参数是不是NULL,如果不是的话,就关闭Connection、Statement和ResultSet。
//public static void closeQuietly(…): 这一类方法能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。
}