1.TxQueryRunner的简介(需要相关jar包的请留言)

TxQueryRunner类是common-dbutils下QueryRunner的子类,是用来简化JDBC操作的,所以要导入common-dbutils的jar包。

TxQueryRunner底层是使用了JdbcUtils。可以使用JdbcUtils.getConnection()来获取连接。使用JdbcUtils.releaseConnection()来关闭连接。

2.TxQueryRunner中的方法

TxQueryRunner主要涉及3个方法:
1.update() -->insert、delete、update

2.query()   -->select

3.batch()  -->批处理

TxQueryRunner的【代码清单--0】

  1 package com.lxf.myCommonUtils;
2
3 import java.sql.Connection;
4 import java.sql.SQLException;
5
6 import org.apache.commons.dbutils.QueryRunner;
7 import org.apache.commons.dbutils.ResultSetHandler;
8
9 public class TxQueryRunner extends QueryRunner
10 {
11 /**
12 * 1.批处理
13 */
14 @Override
15 public int[]batch(String sql,Object[][] params)throws SQLException
16 {
17 //获取连接
18 Connection con = JdbcUtils.getConnection();
19 //操作
20 int[] result = super.batch(con, sql, params);
21 //释放连接
22 JdbcUtils.releaseConnection(con);
23 return result;
24 }
25
26 /**
27 * 2.带有查询条件的query()方法。
28 * 单行查询
29 */
30 @Override
31 public <T> T query(String sql,ResultSetHandler<T> rsh,Object... params)
32 throws SQLException
33 {
34 //获取连接
35 Connection con = JdbcUtils.getConnection();
36 //操作
37 T result = super.query(con, sql, rsh, params);
38 //释放连接
39 JdbcUtils.releaseConnection(con);
40 return result;
41 }
42
43 /**
44 * 3.多行查询
45 */
46 @Override
47 public <T> T query(String sql,ResultSetHandler<T> rsh)
48 throws SQLException
49 {
50 //获取连接
51 Connection con = JdbcUtils.getConnection();
52 //操作
53 T result = super.query(con, sql, rsh);
54 //释放连接
55 JdbcUtils.releaseConnection(con);
56 return result;
57 }
58
59 /**
60 * 4.不带参数的update()
61 */
62 @Override
63 public int update(String sql)throws SQLException
64 {
65 //获取连接
66 Connection con = JdbcUtils.getConnection();
67 //操作
68 int result = super.update(con, sql);
69 //释放连接
70 JdbcUtils.releaseConnection(con);
71 return result;
72 }
73
74 /**
75 * 带有一个参数的uodate()
76 */
77 @Override
78 public int update(String sql,Object param)throws SQLException
79 {
80 //获取连接
81 Connection con = JdbcUtils.getConnection();
82 //操作
83 int result = super.update(con, sql, param);
84 //释放连接
85 JdbcUtils.releaseConnection(con);
86 return result;
87 }
88
89 @Override
90 public int update(String sql,Object... params)throws SQLException
91 {
92 //获取连接
93 Connection con = JdbcUtils.getConnection();
94 //操作
95 int result = super.update(con, sql, params);
96 //释放连接
97 JdbcUtils.releaseConnection(con);
98 return result;
99 }
100
101 }

3.TxQueryRunner的单元测试

3.1--准备工作 

  为了进行TxQueryRunner的单元测试,我们需要在数据库中建立一张表(此处我建立的是person表)。另外还需要创建一个Person实体类。

注意:表中的字段名必须和Person实体类的属性名保持一致。

 - 数据库表的建立

       

  - Person实体类【代码清单--1】

 1  1 package com.lxf.bean;
2 2
3 3 /**
4 4 * Person实体类
5 5 * @author Administrator
6 6 *
7 7 */
8 8 public class Person
9 9 {
10 10 private String pid;
11 11 private String pname;
12 12 private int page;
13 13 private String sex;
14 14
15 15 public String getPid() {
16 16 return pid;
17 17 }
18 18 public void setPid(String pid) {
19 19 this.pid = pid;
20 20 }
21 21 public String getPname() {
22 22 return pname;
23 23 }
24 24 public void setPname(String pname) {
25 25 this.pname = pname;
26 26 }
27 27 public int getPage() {
28 28 return page;
29 29 }
30 30 public void setPage(int page) {
31 31 this.page = page;
32 32 }
33 33 public String getSex() {
34 34 return sex;
35 35 }
36 36 public void setSex(String sex) {
37 37 this.sex = sex;
38 38 }
39 39 @Override
40 40 public String toString() {
41 41 return "Person [pid=" + pid + ", pname=" + pname + ", page=" + page
42 42 + ", sex=" + sex + "]";
43 43 }
44 44
45 45 }

3.2单元测试

这里主要测试的方法有:

- 测试update的相关方法

- 测试查询的相关方法

具体见【代码清单--2】

  1 package com.lxf.test;
2
3 import java.sql.SQLException;
4 import java.util.List;
5 import java.util.Map;
6
7 import org.apache.commons.dbutils.QueryRunner;
8 import org.apache.commons.dbutils.handlers.BeanHandler;
9 import org.apache.commons.dbutils.handlers.BeanListHandler;
10 import org.apache.commons.dbutils.handlers.MapHandler;
11 import org.apache.commons.dbutils.handlers.MapListHandler;
12 import org.apache.commons.dbutils.handlers.ScalarHandler;
13 import org.junit.Test;
14
15 import com.lxf.bean.Person;
16 import com.lxf.myCommonUtils.JdbcUtils;
17
18 import cn.itcast.jdbc.TxQueryRunner;
19
20 /**
21 * TxQueryRunner类是common-dbutils下QueryRunner的子类,是用来简化JDBC操作的。
22 * 所以要导入common-dbutils的jar包
23 * TxQueryRunner底层是使用了JdbcUtils的。
24 * 它里面主要涉及3个方法:
25 * 1.update -->insert、delete、update
26 * 2.query -->select
27 * 3.批处理
28 * @author Administrator
29 *
30 */
31 public class TxQueryRunnerTest
32 {
33 /**
34 * 测试update方法,用来执行insert、delete、update语句。
35 * @throws SQLException
36 */
37 @Test
38 public void testUpdate() throws SQLException
39 {
40 String sql = "insert into person(pid,pname,page,sex)values(?,?,?,?)";
41 //给sql中对应的参数赋值
42 Object[] params = {"3","p3","3","男"};
43 QueryRunner qr = new TxQueryRunner();
44 qr.update(sql, params);
45 }
46
47 /**
48 * 使用事务
49 * @throws SQLException
50 */
51 @Test
52 public void testUpdate2() throws Exception
53 {
54
55 try
56 {
57 //1.开启事务
58 JdbcUtils.beginTransaction();
59
60 //2.多次操作
61 String sql = "insert into person(pid,pname,page,sex)values(?,?,?,?)";
62 //给sql中对应的参数赋值
63 Object[] params = {"4","p4","4","women"};
64 QueryRunner qr = new TxQueryRunner();
65 //执行
66 qr.update(sql, params);
67
68 if(false)
69 {
70 throw new Exception();
71 }
72
73 params = new Object[]{"5","p5","5","women"};
74 //执行
75 qr.update(sql,params);
76
77 //3.提交事务
78 JdbcUtils.commitTransaction();
79
80 }catch(Exception e)
81 {
82 try
83 {
84 //4.回滚事务
85 JdbcUtils.rollbackTransaction();
86 }
87 catch (SQLException e1)
88 {
89 e1.printStackTrace();
90 }
91 throw e;
92 }
93 }
94
95 /**
96 *测试查询方法
97 *JDBC查询的结果是ResultSet;
98 *而QueryRunner查询的结果是通过 ResultSet映射后的数据。
99 *转换结果:
100 * 1.javaBean:把结果集封装到javaBean中;
101 * 2.Map:把结果集封装到Map中。
102 * 3.把结果集封装到Object中(结果集是单行单列)
103 * @throws SQLException
104 */
105
106 /**
107 * 单行结果集映射到javaBean中
108 * @throws SQLException
109 */
110 @Test
111 public void testQuery1() throws SQLException
112 {
113 String sql = "select * from person where pid = ?";
114 QueryRunner qr = new TxQueryRunner();
115 /*
116 *第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
117 *BeanHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
118 */
119 Person p = qr.query(sql, new BeanHandler<Person>(Person.class),"1");
120 System.out.println(p);
121 }
122
123 /**
124 * 使用BeanListHandler
125 * 把多行结果集映射到List<Bean>中,即多个javaBean对象
126 * 一行结果映射到一个javaBean对象中,多行结果映射到List<Bean>中。
127 * @throws SQLException
128 */
129 @Test
130 public void testQuery2() throws SQLException
131 {
132 //相比单行映射名只需要把条件去掉即可
133 String sql = "select * from person ";
134 QueryRunner qr = new TxQueryRunner();
135 /*
136 *第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
137 *BeanListHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
138 */
139 List<Person> list = qr.query(sql, new BeanListHandler<Person>(Person.class));
140 System.out.println(list);
141 }
142
143 /**
144 * Map
145 * 使用MapHandler将单行结果集映射到Map中
146 * @throws SQLException
147 */
148 @Test
149 public void testQuery3() throws SQLException
150 {
151 //相比单行映射名只需要把条件去掉即可
152 String sql = "select * from person where pid = ?";
153 QueryRunner qr = new TxQueryRunner();
154 /*
155 *第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
156 *MapHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
157 */
158 Map map = qr.query(sql, new MapHandler(),"1");
159 System.out.println(map);
160 }
161
162 /**
163 * 使用MapListHandler将多行结果集映射到MapList中,
164 * 即一行结果集映射到Map中,多行结果集映射到MapList中。
165 * @throws SQLException
166 */
167 @Test
168 public void testQuery4() throws SQLException
169 {
170 //相比单行映射名只需要把条件去掉即可
171 String sql = "select * from person";
172 QueryRunner qr = new TxQueryRunner();
173 /*
174 *第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
175 *MapHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
176 */
177 List<Map<String,Object>> mapList = qr.query(sql, new MapListHandler());
178 System.out.println(mapList);
179 }
180
181 /**
182 * 使用ScalarHandler将单行单列的结果集映射到Object中
183 * @throws SQLException
184 */
185 @Test
186 public void testQuery5() throws SQLException
187 {
188 //相比单行映射名只需要把条件去掉即可
189 String sql = "select count(*) from person";
190 QueryRunner qr = new TxQueryRunner();
191 /*
192 *第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
193 *MapHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
194 */
195 Object obj = qr.query(sql, new ScalarHandler());
196 Number number = (Number)obj;
197 long count = number.longValue();
198 System.out.println(count);
199 }
200
201
202 }

4.后期补充

新增【多表映射,代码清单--4】

 1 /**
2 * 多表映射
3 * 一行结果集中包含两张表的数据
4 * 使用MapHnadler来处理数据
5 * 把数据封装到Map中,
6 * 使用Map分别生成Person和Address对象
7 * 将两个对象建立联系
8 * @throws SQLException
9 */
10 @Test
11 public void testQuery6() throws SQLException
12 {
13 //相比单行映射名只需要把条件去掉即可
14 String sql = "select * from person t , t_address b where t.pid = b.aid and t.pid = ?";
15 QueryRunner qr = new TxQueryRunner();
16 Map map = qr.query(sql, new MapHandler(),"1");
17 //生成Person对象
18 Person p = CommonUtils.toBean(map, Person.class);
19 //生成Address对象
20 Address a = CommonUtils.toBean(map, Address.class);
21 //建立联系
22 p.setAddr(a);
23 System.out.println(p);
24 }

此时,需要在bean中新建一个Address实体类,并且在Person类中引用。以此来建立联系。

【Address实体类】

 1 package com.lxf.bean;
2
3 /**
4 * 地址类
5 * @author Administrator
6 *
7 */
8 public class Address
9 {
10 //编号,省份,城市,街道
11 private String aid;
12
13 private String province;
14
15 private String city;
16
17 private String street;
18
19 public String getAid() {
20 return aid;
21 }
22
23 public void setAid(String aid) {
24 this.aid = aid;
25 }
26
27 public String getProvince() {
28 return province;
29 }
30
31 public void setProvince(String province) {
32 this.province = province;
33 }
34
35 public String getCity() {
36 return city;
37 }
38
39 public void setCity(String city) {
40 this.city = city;
41 }
42
43 public String getStreet() {
44 return street;
45 }
46
47 public void setStreet(String street) {
48 this.street = street;
49 }
50
51 @Override
52 public String toString() {
53 return "Address [aid=" + aid + ", province=" + province + ", city="
54 + city + ", street=" + street + "]";
55 }
56
57
58 }

在数据库中建立t_address表。如图:

TxQueryRunner-JDBC小工具的更多相关文章

  1. JDBC小工具--TxQueryRunner及其单元测试

    1.TxQueryRunner的简介(需要相关jar包的请留言) TxQueryRunner类是common-dbutils下QueryRunner的子类,是用来简化JDBC操作的,所以要导入comm ...

  2. 数据库表转换成javaBean对象小工具

    package test.utils; import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter; ...

  3. 限时购校验小工具&dubbo异步调用实现限

    本文来自网易云社区 作者:张伟 背景 限时购是网易考拉目前比较常用的促销形式,但是前期创建一个限时购活动时需要各个BU按照指定的Excel格式进行选品提报,为了保证提报数据准确,运营需要人肉校验很多信 ...

  4. 【JDBC】工具类的抽取

    jdbc.properties属性文件 driverClass=com.mysql.jdbc.Driver url=jdbc:mysql:///jdbctest username=root passw ...

  5. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  6. 【原】得心应手小工具开发——IE代理快速切换工具

    一.引入 因为公司里上外网要经常换IE代理地址,每次切换地址都要进到Internet Options里去设置一番,经常切换的话很是麻烦,由于用了点时间作个小工具来方便自己. 二.实现思路 其实思路很简 ...

  7. ContentProvider域名替换小工具

    开发项目域名想怎么换就怎么换,就是这么任性! 这是一个很有意思的小工具! 这是一个方便开发人员和测试人员的小工具!! 吐槽: 一直在做Android开发,一直总有一个问题存在:做自己公司的apk开发时 ...

  8. c 小工具的使用

    1. 这是一个gps 数据过滤的小工具,目的是过滤到gps数据中不符合要求的数据,然后转为json 数据 需要两个小工具 bermuda.c   ------>  过滤一定范围的数据 geo2j ...

  9. 偷懒小工具 - SSO单点登录通用类(可跨域)

    写在前面的话 上次发布过一篇同样标题的文章.但是因为跨域方面做得不太理想.我进行了修改,并重新分享给大家. 如果这篇文章对您有所帮助,请您点击一下推荐.以便有动力分享出更多的"偷懒小工具&q ...

  10. [原创] Delphi小工具(Windows资源管理器右键菜单扩展)

    两个小工具 1. 项目临时文件清理 2. Android Ndk 编译 c/c++ jni 源码工具. 下载后,点击Reg.bat就可以完成注册安装.不需要时点击 UnReg.Bat 就可以删除菜单. ...

随机推荐

  1. mysql慢查询监控及sql优化

    在my.ini添加如下代码,即可查看那个sql语句执行慢了 log-slow-queries = d:/log/mysql-slow.log long_query_time = 1 打开日志 log ...

  2. 自定义PreferenceActivity和PreferenceFragment的样式

    感谢:http://blog.csdn.net/luck_apple/article/details/7064004 这篇文章讲的是如何定义fragment的样式,基本布局都是从源码中弄过来的.通过设 ...

  3. MySql清空所有表数据【慎用】

    CREATE PROCEDURE `up_truncate_all_table`() BEGIN ; ); DECLARE cur1 CURSOR FOR SELECT table_name from ...

  4. 修改VIM恶心的注释自动格式化

    我复制一段代码,里面有// 只有一行,但是复制到vim中就下面全部都有//了.我要取消这个功能 vim ~/.vimrc set nu! "set formatoptions=croql 这 ...

  5. macOS Sierra10.12.5 显示允许任何来源

    在终端输入:sudo spctl --master-disable即可.

  6. Visio中方向键不能移动物件而是滚动画布

    不知怎么的, 我的Visio中按方向键不能移动目标对象, 效果却是移动整个画布. 上网查了一下, 找到了原因. 因为不知怎么的错按了键盘上的Scroll Lock键, 再按一下就好了.     参考资 ...

  7. 以快板之名说Android 应用程序电源管理

    当里个当,当里个当.Android开发UE(用户体验)为导向,首要任务便是省电量. 当里个当,当里个当.有一设备立足于墙边,这个设备唤固定电话.你的app造成这样,用户很快把你弃墙角.你咆哮耗电奈何与 ...

  8. Get file extention in XSLT

      When working with data view web parts or data form web parts in SharePoint, you might want to use ...

  9. Idea卡在Maven导入工程

    Idea卡在Maven导入工程的解决办法 1.看日志 tail -100f cd ~/Library/Logs/IntelliJIdea2017.2/idea.log 你可以换下路径中Idea的版本或 ...

  10. jchat-windows-master 编译输出日志

    第一个项目成功生成的输出日志 >------ 已启动全部重新生成: 项目: QxOrm, 配置: Debug x64 ------ >Moc'ing IxModel.h... >Mo ...