DBUtils 基础
DBUtils
DbUtils介绍
DbUtils库是一套小巧的用来简化 JDBC 调用的库。JDBC源代码库单调且易出错,所以DBUtils 类抽象出所有简单的任务,让你更专注于使用JDBC做Query和Update的工作。
DbUtils的优势:
Some of the advantages of using DbUtils are:
不会资源泄露。更正JDBC代码并不困难,但是却非常耗时且单调。这通常会造成难以追踪的Connection泄露。
清爽整洁的代码。访问数据库的代码会大量的减少。剩下的代码更简介的表达了你的意图。
JavaBean属性自动从ResultSet中填充值。不用手动调用setXxx为属性赋值。
在使用JDBC访问数据库是,有大量重复的代码(注册驱动,获取连接,访问数据库,处理结果集,释放资源等)DbUtils抽象并封装了这些操作,方便开发人员DAO操作。
整个dbutils总共才3个包:
-
包org.apache.commons.dbutils
接口摘要
ResultSetHandler 将ResultSet转换为别的对象的工具。
RowProcessor 将ResultSet行转换为别的对象的工具。类摘要
BasicRowProcessor RowProcessor接口的基本实现类。
BeanProcessor BeanProcessor匹配列明到Bean属性名,并转换结果集列到Bean对象的属性中。
DbUtils 一个JDBC辅助工具集合。
ProxyFactory 产生JDBC接口的代理实现。
QueryLoader 属性文件加载器,主要用于加载属性文件中的 SQL 到内存中。
QueryRunner 使用可插拔的策略执行SQL查询并处理结果集。
ResultSetIterator 包装结果集为一个迭代器。 -
包org.apache.commons.dbutils.handlers
ResultSetHandler接口的实现类类摘要
AbstractListHandler 将ResultSet转为List的抽象类
ArrayHandler 将ResultSet转为一个Object[]的ResultSetHandler实现类
ArrayListHandler 将ResultSet转换为List<Object[]>的ResultSetHandler实现类
BeanHandler 将ResultSet行转换为一个JavaBean的ResultSetHandler实现类
BeanListHandler 将ResultSet转换为List<JavaBean>的ResultSetHandler实现类
ColumnListHandler 将ResultSet的一个列转换为List<Object>的ResultSetHandler实现类
KeyedHandler 将ResultSet转换为Map<Map>的ResultSetHandler实现类
MapHandler 将ResultSet的首行转换为一个Map的ResultSetHandler实现类
MapListHandler 将ResultSet转换为List<Map>的ResultSetHandler实现类
ScalarHandler 将ResultSet的一个列到一个对象。 -
包org.apache.commons.dbutils.wrappers
添加java.sql类中功能包装类。类摘要
SqlNullCheckedResultSet 在每个getXXX方法上检查SQL NULL值的ResultSet包装类。
StringTrimmedResultSet 取出结果集中字符串左右空格的ResultSet包装类。
DBUtils核心类
-
DbUtils:连接数据库对象----jdbc辅助方法的集合类,线程安全
构造方法:DbUtils(),都是static方法,可以不需要new对象
作用:控制连接,控制事务,控制驱动加载一个类。 -
QueryRunner
对数据库进行操作构造方法:
- QueryRunner()
创建一个与数据库无关的QueryRunner对象,后期再操作数据库的会后,需要手动给一个Connection对象,它可以手动控制事务。
Connection.setAutoCommit(false); 设置手动管理事务
Connection.commit(); 提交事务 - QueryRunner(DataSource ds)
QueryRunner(DataSource ds):创建一个与数据库关联的queryRunner对象,后期再操作数据库的时候,不需要Connection对象,自动管理事务。
DataSource:数据库连接池对象。
主要使用QueryRunner的 update 和
update()增删改操作
updata.pngquery()查询
query.png - QueryRunner()
-
结果集ResultSetHandler<T>接口
封装数据的策略对象------将封装结果集中的数据,转换到另一个对象
策略:封装数据到对象的方式(示例:将数据库保存在User、保存到数组、保存到集合)ResultSetHandler的各个实现类:
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List<Map>),再把这些map再存到一个map里,其key为指定的列。
ScalarHandler:将结果集第一行的某一列放到某个对象中。
实例
增删改
QueryRunner使用无参构造的情况,QueryRunner中没有DataSource维护数据库的连接,在调用方法时就要选择传入Connection
@Test
public void test() {
QueryRunner qr = new QueryRunner();
String sql = "insert into t_user (uname,password) values (?,?)";
try {
//返回受影响的行数
int update = qr.update(JdbcUtils.getConnetion(), sql,"leex123",123);
} catch (SQLException e) {
e.printStackTrace();
}
}
查
QueryRunner使用有参构造,传入DataSource,new ComboPooledDataSource()是C3P0数据库连接池
class RSHandlerDemo {
//--7.ScalarHandler:将查询的结果的第一行的某一列放到一个对象中;精确定位到某个值;
@Test
public void query7() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
String name=(String)runner.query("select * from t_user",new ScalarHandler(2));
System.out.println(name);
}
//--6.MapListHandler:将查询的结果的每一行存入到一个map中,键为列名,值为各列值;然后再将map存入list中;
@Test
public void query6() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
List<java.util.Map<String, Object>> map=runner.query("select * from t_user",new MapListHandler());
for (java.util.Map<String, Object> map2 : map) {
System.out.print(map2.get("uid"));
System.out.print(map2.get("uname"));
System.out.print(map2.get("password"));
System.out.println();
}
}
//--5.MapHandler:将查询的结果的第一行存入到一个map中,键为列名,值为各列值;
@Test
public void query5() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
HashMap<String, Object> map=(HashMap<String, Object>) runner.query("select * from t_user",new MapHandler());
System.out.print(map.get("uid"));
System.out.print(map.get("uname"));
System.out.println(map.get("password"));
}
//--4.BeanListHandler:将查询的结果的每一行封装到一个javabean对象中,然后再将这些对象存入list中;
@Test
public void query4() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
List<User> list=runner.query("select * from t_user",new BeanListHandler<User>(User.class));
System.out.println(list);
}
//--3.BeanHandler:将查询的结果的第一行封装到一份javabean对象中;
@Test
public void query3() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
User User=runner.query("select * from t_user",new BeanHandler<User>(User.class));
System.out.println(User);
}
//--2.ArrayListHandler:将查询的结果的每一行放到一个数组中,然后再将数组放到集合中;
@Test
public void query2() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
List<Object[]> list=runner.query("select * from t_user",new ArrayListHandler());
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
}
//--1.ArrayHandler:将查询的结果的第一行放到一个数组中
@Test
public void query1() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
Object[] array=runner.query("select * from t_user",new ArrayHandler());
System.out.println(Arrays.toString(array));
}
}