文章目录
dbutils使用
QueryRunner(query_update)、BeanList\BeanHandler、MapList\MapHandler、ScalarHandler
- ResultSetHandler 的作用: QueryRunner 的 query 方法的返回值最终取决于query方法的 ResultHandler 参数的 handle 方法的返回值。
- BeanListHandler: 把结果集转为一个 Bean 的 List, 并返回. Bean 的类型在创建BeanListHanlder 对象时以 Class 对象的方式传入,可以适应列的别名来映射JavaBean 的属性名: String sql = “SELECT id, name customerName, email, birth FROM customers WHERE id = ?”;
BeanListHandler(Class< T > type) - BeanHandler: 把结果集转为一个 Bean, 并返回. Bean 的类型在创建 BeanHandler对象时以 Class 对象的方式传入BeanHandler(Class< T > type)
- MapHandler: 把结果集转为一个 Map 对象, 并返回。若结果集中有多条记录, 仅返回第一条记录对应的 Map 对象. Map 的键: 列名(而非列的别名), 值: 列的值。注意代表列的 key 不区分大小写。
- MapListHandler: 把结果集转为一个 Map 对象的集合, 并返回。Map 的键: 列名(而非列的别名), 值: 列的值。
- ScalarHandler: 可以返回指定列的一个值或返回一个统计函数的值,比如count(1)。
- ScalarHandler< T > 用于获取结果集中第一行某列的数据并转换成 T 表示的实际对象。
- ArrayHandler 用于获取结果集中的第一行数据,并将其封装到一个数组中,一列值对应一个数组元素。
单行数据处理:ScalarHandler,ArrayHandler,MapHandler,BeanHandler
多行数据处理:BeanListHandler,AbstractListHandler(ArrayListHandler,MapListHandler,ColumnListHandler),AbstractKeyedHandler(KeyedHandler,BeanMapHandler)
可供扩展的类:BaseResultSetHandler
对数据进行增删查改的简单工具类:
注意导包:commons-dbutils-1.3.jar
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.util.List;
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 util.JdbcUtil;
/**
* 这个一个dao称里的基本类,在于被具体的dao类,UserDao去继承它来用,不能new BaseDao()来直接用
* 针对要操作各张数据表映射到java工程里java类,Product,...
*/
public class BaseDao<T> {
// 简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量
QueryRunner queryRunner = new QueryRunner();
private Class<T> clazz;
public BaseDao() {
// 用baseDao的构造方法初始化clazz属性
Type superType = this.getClass().getGenericSuperclass();//拿到调用者的父类的类型
if(superType instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) superType;
Type[] tarry = pt.getActualTypeArguments();// 返回一个类型数组,要第一个元素
if(tarry[0] instanceof Class) {
clazz = (Class<T>) tarry[0];
}
}
}
/**
* 查询数据表,取出sql语句结果集的第一条数据,封装成一个类的对象返回,支持事务
*/
public T get(String sql,Object... args) {
Connection conn = null;
T entity = null;
try {
conn = JdbcUtil.getConnection();
entity = queryRunner.query(conn,sql,new BeanHandler<T>(clazz),args);
} catch (Exception e) {
e.printStackTrace();
}
return entity;
}
/**
* 获取多条记录的通用方法,用泛型实现通用
*/
public List<T> getList(String sql,Object... args) {
Connection conn = null;
List<T> list = null;
try {
conn = JdbcUtil.getConnection();
list = queryRunner.query(conn, sql, new BeanListHandler<>(clazz), args);
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.clossAll();
}
return list;
}
/**
* 实现insert,update,delete通用方法
*/
public int update(String sql,Object... args) {
Connection conn = null;
int rows = 0;
try {
conn = JdbcUtil.getConnection();
rows = queryRunner.update(conn, sql,args);
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.clossAll();
}
return rows;
}
/**
* 通用的放回sql语句的结果只有一个数值的类型的查询,用户个数,count(id)
*/
public Object getValue(String sql,Object... args) {
Connection conn = null;
Object obj = null;
try {
conn = JdbcUtil.getConnection();
obj = queryRunner.query(conn,sql, new ScalarHandler(),args);
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.clossAll();
}
return obj;
}
}
各个方法实现的增删改查:
参考博客:https://blog.csdn.net/u013210620/article/details/52739897