JavawebApache的DBUtils框架学习
一、commons-dbutils简介
commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
commons-dbutilsAPI介绍:
org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler
工具类
org.apache.commons.dbutils.DbUtils
二、QueryRunner类使用讲解
该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造方法:
默认的构造方法
需要一个javax.sql.DataSource来作参数的构造方法。
2.1、QueryRunner类的主要方法
publicObjectquery(Connectionconn,Stringsql,Object[]params,ResultSetHandlerrsh)throwsSQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理PreparedStatement和ResultSet的创建和关闭。
publicObjectquery(Stringsql,Object[]params,ResultSetHandlerrsh)throwsSQLException:几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource)或使用的setDataSource方法中重新获得Connection。
publicObjectquery(Connectionconn,Stringsql,ResultSetHandlerrsh)throwsSQLException:执行一个不需要置换参数的查询操作。
publicintupdate(Connectionconn,Stringsql,Object[]params)throwsSQLException:用来执行一个更新(插入、更新或删除)操作。
publicintupdate(Connectionconn,Stringsql)throwsSQLException:用来执行一个不需要置换参数的更新操作。
2.2、使用QueryRunner类实现CRUD
复制代码
1packageme.gacl.test;
2
3importjava.util.Date;
4importjava.util.List;
5importjava.io.File;
6importjava.io.FileReader;
7importjava.io.IOException;
8importjava.sql.SQLException;
9importjavax.sql.rowset.serial.SerialClob;
10importme.gacl.domain.User;
11importme.gacl.util.JdbcUtils;
12importorg.apache.commons.dbutils.QueryRunner;
13importorg.apache.commons.dbutils.handlers.BeanHandler;
14importorg.apache.commons.dbutils.handlers.BeanListHandler;
15importorg.junit.Test;
16
17/
18@ClassName:DBUtilsCRUDTest
19@Description:使用dbutils框架的QueryRunner类完成CRUD,以及批处理
20@author:孤傲苍狼
21@date:2014-10-5下午4:56:44
22
23/
24publicclassQueryRunnerCRUDTest{
25
26/
27测试表
28createtableusers(
29idintprimarykeyauto_increment,
30namevarchar(40),
31passwordvarchar(40),
32emailvarchar(60),
33birthdaydate
34);
35/
36
37@Test
38publicvoidadd()throwsSQLException{
39//将数据源传递给QueryRunner,QueryRunner内部通过数据源获取数据库连接
40QueryRunnerqr=newQueryRunner(JdbcUtils.getDataSource());
41Stringsql="insertintousers(name,password,email,birthday)values(?,?,?,?)";
42Objectparams[]={"孤傲苍狼","123","gacl@sina.com",newDate()};
43//Objectparams[]={"白虎神皇","123","gacl@sina.com","1988-05-07"};
44qr.update(sql,params);
45}
46
47@Test
48publicvoiddelete()throwsSQLException{
49
50QueryRunnerqr=newQueryRunner(JdbcUtils.getDataSource());
51Stringsql="deletefromuserswhereid=?";
52qr.update(sql,1);
53
54}
55
56@Test
57publicvoidupdate()throwsSQLException{
58QueryRunnerqr=newQueryRunner(JdbcUtils.getDataSource());
59Stringsql="updateuserssetname=?whereid=?";
60Objectparams[]={"ddd",5};
61qr.update(sql,params);
62}
63
64@Test
65publicvoidfind()throwsSQLException{
66QueryRunnerqr=newQueryRunner(JdbcUtils.getDataSource());
67Stringsql="selectfromuserswhereid=?";
68Objectparams[]={2};
69Useruser=(User)qr.query(sql,params,newBeanHandler(User.class));
70System.out.println(user.getBirthday());
71}
72
73@Test
74publicvoidgetAll()throwsSQLException{
75QueryRunnerqr=newQueryRunner(JdbcUtils.getDataSource());
76Stringsql="selectfromusers";
77Listlist=(List)qr.query(sql,newBeanListHandler(User.class));
78System.out.println(list.size());
79}
80
81/
82@Method:testBatch
83@Description:批处理
84@Anthor:孤傲苍狼
85
86@throwsSQLException
87/
88@Test
89publicvoidtestBatch()throwsSQLException{
90QueryRunnerqr=newQueryRunner(JdbcUtils.getDataSource());
91Stringsql="insertintousers(name,password,email,birthday)values(?,?,?,?)";
92Objectparams[][]=newObject[10][];
93for(inti=0;i<10;i++){
94params[i]=newObject[]{"aa"+i,"123","aa@sina.com",
95newDate()};
96}
97qr.batch(sql,params);
98}
99
100//用dbutils完成大数据(不建议用)
101/
102createtabletestclob
103(
104idintprimarykeyauto_increment,
105resumetext
106);
107/
108@Test
109publicvoidtestclob()throwsSQLException,IOException{
110QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());
111Stringsql="insertintotestclob(resume)values(?)";//clob
112//这种方式获取的路径,其中的空格会被使用“%20”代替
113Stringpath=QueryRunnerCRUDTest.class.getClassLoader().getResource("data.txt").getPath();
114//将“%20”替换回空格
115path=path.replaceAll("%20","");
116FileReaderin=newFileReader(path);
117char[]buffer=newchar[(int)newFile(path).length()];
118in.read(buffer);
119SerialClobclob=newSerialClob(buffer);
120Objectparams[]={clob};
121runner.update(sql,params);
122}
123}
复制代码
三、ResultSetHandler接口使用讲解
该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。
ResultSetHandler接口提供了一个单独的方法:Objecthandle(java.sql.ResultSet.rs)
3.1、ResultSetHandler接口的实现类
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
3.2、测试dbutils各种类型的处理器
复制代码
1packageme.gacl.test;
2
3importjava.sql.SQLException;
4importjava.util.Arrays;
5importjava.util.List;
6importjava.util.Map;
7importme.gacl.util.JdbcUtils;
8importorg.apache.commons.dbutils.QueryRunner;
9importorg.apache.commons.dbutils.handlers.ArrayHandler;
10importorg.apache.commons.dbutils.handlers.ArrayListHandler;
11importorg.apache.commons.dbutils.handlers.ColumnListHandler;
12importorg.apache.commons.dbutils.handlers.KeyedHandler;
13importorg.apache.commons.dbutils.handlers.MapHandler;
14importorg.apache.commons.dbutils.handlers.MapListHandler;
15importorg.apache.commons.dbutils.handlers.ScalarHandler;
16importorg.junit.Test;
17
18/
19@ClassName:ResultSetHandlerTest
20@Description:测试dbutils各种类型的处理器
21@author:孤傲苍狼
22@date:2014-10-6上午8:39:14
23
24/
25publicclassResultSetHandlerTest{
26
27@Test
28publicvoidtestArrayHandler()throwsSQLException{
29QueryRunnerqr=newQueryRunner(JdbcUtils.getDataSource());
30Stringsql="selectfromusers";
31Objectresult[]=(Object[])qr.query(sql,newArrayHandler());
32System.out.println(Arrays.asList(result));//listtoString()
33}
34
35@Test
36publicvoidtestArrayListHandler()throwsSQLException{
37
38QueryRunnerqr=newQueryRunner(JdbcUtils.getDataSource());
39Stringsql="selectfromusers";
40List |
|