1.Apache-DBUtils简介
commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
API介绍:
- org.apache.commons.dbutils.QueryRunner
- org.apache.commons.dbutils.ResultSetHandler
- 工具类:org.apache.commons.dbutils.DbUtils
2.主要API的使用
DbUtils:提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:
- public static void close(…) throws java.sql.SQLException : DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet
- public static void closeQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。
- public static void commitAndClose(Connection conn)throws SQLException: 用来提交连接的事务,然后关闭连接
- public static void commitAndCloseQuietly(Connection conn): 用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。
- public static void rollback(Connection conn)throws SQLException:允许conn为null,因为方法内部做了判断
- public static void rollbackAndClose(Connection conn)throws SQLException
- rollbackAndCloseQuietly(Connection)
- public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。
3.QueryRunner类
该类简化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造器:
默认的构造方法。
需要一个javax.sql.DataSource来作参数的构造器。
QueryRunner类的主要方法:
- public int update(Connection connection,String sql, Object …args) throws SQLException:用来执行一个更新(插入、更新、删除)操作。
- public Object query(Connection connection ,String sql ,ResultSetHandler resultSetHandler,Object…args)thorws SQLException
4.ResultSetHandler接口及实现类
该接口用于处理 java.sql.ResultSet,将数据按要求转换成另一种形式。
- ResultSetHandler接口提供了一个单独的方法:Object handle (java.sql.Result.rs)。
接口的主要实现类: - BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中
- BeanListHandler:将结果集中的每一行数据都封装到一个对应的javaBean实例中,然后存放到List里。
- MapHandler:将结果集中的第一行数据封装到一个Map里,key为列名,value就是对应的值
- MapListHandler:将结果集中的每一行数据都封装到一个Map中,然后存放到List中
- ScalarHandler:查询单个值对象。
BaseDao
package dao.impl;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import utils.JdbcUtils;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
/**
* @ClassName : BaseDao //类名
* @Description : 对数据的基本操作 //描述
* @Author : Gao //作者
* @Date: 2021/11/3 22:03
*/
public abstract class BaseDao {
//使用DbUtils操作数据库
private QueryRunner queryRunner = new QueryRunner();
/**
* update() 方法用来执行 update delete insert语句
*
* @return 如果返回-1表示执行失败,返回其他表示影响的行数
*/
public int update(String sql, Object... args) {
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.update(connection, sql, args);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
/**
* 查询返回一个javaBean的sql语句
*
* @return
* @paramt type 返回的对象类型
* @paramt SQL 执行的sql语句
* @paramt args SQL对应的参数值
* @paramt <T>返回的类型的泛型
*/
public <T> T queryForOne(Class<T> type, String sql, Object... args) {
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.query(connection, sql, new BeanHandler<>(type), args);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
/**
* 查询返回多个javaBean的SQL语句
* @param type 返回的对象类型
* @param sql 执行的SQL语句
* @param args sql对应的参数值
* @param <T> 返回的类型泛型
* @return
*/
public <T> List<T> queryForList(Class<T> type,String sql,Object ...args){
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.query(connection,sql,new BeanListHandler<T>(type),args);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
/**
* 执行返回一行一列的sql语句
* @param sql 执行的SQL语句
* @param args sql对应的数值
* @return
*/
public Object queryForSingleValue(String sql,Object ...args){
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.query(connection,sql,new ScalarHandler(),args);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
}