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】

 package com.lxf.myCommonUtils;

 import java.sql.Connection;
import java.sql.SQLException; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler; public class TxQueryRunner extends QueryRunner
{
/**
* 1.批处理
*/
@Override
public int[]batch(String sql,Object[][] params)throws SQLException
{
//获取连接
Connection con = JdbcUtils.getConnection();
//操作
int[] result = super.batch(con, sql, params);
//释放连接
JdbcUtils.releaseConnection(con);
return result;
} /**
* 2.带有查询条件的query()方法。
* 单行查询
*/
@Override
public <T> T query(String sql,ResultSetHandler<T> rsh,Object... params)
throws SQLException
{
//获取连接
Connection con = JdbcUtils.getConnection();
//操作
T result = super.query(con, sql, rsh, params);
//释放连接
JdbcUtils.releaseConnection(con);
return result;
} /**
* 3.多行查询
*/
@Override
public <T> T query(String sql,ResultSetHandler<T> rsh)
throws SQLException
{
//获取连接
Connection con = JdbcUtils.getConnection();
//操作
T result = super.query(con, sql, rsh);
//释放连接
JdbcUtils.releaseConnection(con);
return result;
} /**
* 4.不带参数的update()
*/
@Override
public int update(String sql)throws SQLException
{
//获取连接
Connection con = JdbcUtils.getConnection();
//操作
int result = super.update(con, sql);
//释放连接
JdbcUtils.releaseConnection(con);
return result;
} /**
* 带有一个参数的uodate()
*/
@Override
public int update(String sql,Object param)throws SQLException
{
//获取连接
Connection con = JdbcUtils.getConnection();
//操作
int result = super.update(con, sql, param);
//释放连接
JdbcUtils.releaseConnection(con);
return result;
} @Override
public int update(String sql,Object... params)throws SQLException
{
//获取连接
Connection con = JdbcUtils.getConnection();
//操作
int result = super.update(con, sql, params);
//释放连接
JdbcUtils.releaseConnection(con);
return result;
} }

3.TxQueryRunner的单元测试

3.1--准备工作 

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

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

 - 数据库表的建立

       

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

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

3.2单元测试

这里主要测试的方法有:

- 测试update的相关方法

- 测试查询的相关方法

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

 package com.lxf.test;

 import java.sql.SQLException;
import java.util.List;
import java.util.Map; 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.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test; import com.lxf.bean.Person;
import com.lxf.myCommonUtils.JdbcUtils; import cn.itcast.jdbc.TxQueryRunner; /**
* TxQueryRunner类是common-dbutils下QueryRunner的子类,是用来简化JDBC操作的。
* 所以要导入common-dbutils的jar包
* TxQueryRunner底层是使用了JdbcUtils的。
* 它里面主要涉及3个方法:
* 1.update -->insert、delete、update
* 2.query -->select
* 3.批处理
* @author Administrator
*
*/
public class TxQueryRunnerTest
{
/**
* 测试update方法,用来执行insert、delete、update语句。
* @throws SQLException
*/
@Test
public void testUpdate() throws SQLException
{
String sql = "insert into person(pid,pname,page,sex)values(?,?,?,?)";
//给sql中对应的参数赋值
Object[] params = {"3","p3","3","男"};
QueryRunner qr = new TxQueryRunner();
qr.update(sql, params);
} /**
* 使用事务
* @throws SQLException
*/
@Test
public void testUpdate2() throws Exception
{ try
{
//1.开启事务
JdbcUtils.beginTransaction(); //2.多次操作
String sql = "insert into person(pid,pname,page,sex)values(?,?,?,?)";
//给sql中对应的参数赋值
Object[] params = {"4","p4","4","women"};
QueryRunner qr = new TxQueryRunner();
//执行
qr.update(sql, params); if(false)
{
throw new Exception();
} params = new Object[]{"5","p5","5","women"};
//执行
qr.update(sql,params); //3.提交事务
JdbcUtils.commitTransaction(); }catch(Exception e)
{
try
{
//4.回滚事务
JdbcUtils.rollbackTransaction();
}
catch (SQLException e1)
{
e1.printStackTrace();
}
throw e;
}
} /**
*测试查询方法
*JDBC查询的结果是ResultSet;
*而QueryRunner查询的结果是通过 ResultSet映射后的数据。
*转换结果:
* 1.javaBean:把结果集封装到javaBean中;
* 2.Map:把结果集封装到Map中。
* 3.把结果集封装到Object中(结果集是单行单列)
* @throws SQLException
*/ /**
* 单行结果集映射到javaBean中
* @throws SQLException
*/
@Test
public void testQuery1() throws SQLException
{
String sql = "select * from person where pid = ?";
QueryRunner qr = new TxQueryRunner();
/*
*第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
*BeanHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
*/
Person p = qr.query(sql, new BeanHandler<Person>(Person.class),"1");
System.out.println(p);
} /**
* 使用BeanListHandler
* 把多行结果集映射到List<Bean>中,即多个javaBean对象
* 一行结果映射到一个javaBean对象中,多行结果映射到List<Bean>中。
* @throws SQLException
*/
@Test
public void testQuery2() throws SQLException
{
//相比单行映射名只需要把条件去掉即可
String sql = "select * from person ";
QueryRunner qr = new TxQueryRunner();
/*
*第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
*BeanListHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
*/
List<Person> list = qr.query(sql, new BeanListHandler<Person>(Person.class));
System.out.println(list);
} /**
* Map
* 使用MapHandler将单行结果集映射到Map中
* @throws SQLException
*/
@Test
public void testQuery3() throws SQLException
{
//相比单行映射名只需要把条件去掉即可
String sql = "select * from person where pid = ?";
QueryRunner qr = new TxQueryRunner();
/*
*第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
*MapHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
*/
Map map = qr.query(sql, new MapHandler(),"1");
System.out.println(map);
} /**
* 使用MapListHandler将多行结果集映射到MapList中,
* 即一行结果集映射到Map中,多行结果集映射到MapList中。
* @throws SQLException
*/
@Test
public void testQuery4() throws SQLException
{
//相比单行映射名只需要把条件去掉即可
String sql = "select * from person";
QueryRunner qr = new TxQueryRunner();
/*
*第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
*MapHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
*/
List<Map<String,Object>> mapList = qr.query(sql, new MapListHandler());
System.out.println(mapList);
} /**
* 使用ScalarHandler将单行单列的结果集映射到Object中
* @throws SQLException
*/
@Test
public void testQuery5() throws SQLException
{
//相比单行映射名只需要把条件去掉即可
String sql = "select count(*) from person";
QueryRunner qr = new TxQueryRunner();
/*
*第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
*MapHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
*/
Object obj = qr.query(sql, new ScalarHandler());
Number number = (Number)obj;
long count = number.longValue();
System.out.println(count);
} }

4.后期补充

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

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

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

【Address实体类】

 package com.lxf.bean;

 /**
* 地址类
* @author Administrator
*
*/
public class Address
{
//编号,省份,城市,街道
private String aid; private String province; private String city; private String street; public String getAid() {
return aid;
} public void setAid(String aid) {
this.aid = aid;
} public String getProvince() {
return province;
} public void setProvince(String province) {
this.province = province;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} public String getStreet() {
return street;
} public void setStreet(String street) {
this.street = street;
} @Override
public String toString() {
return "Address [aid=" + aid + ", province=" + province + ", city="
+ city + ", street=" + street + "]";
} }

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

JDBC小工具--TxQueryRunner及其单元测试的更多相关文章

  1. javaWeb开发小工具---MailUtils及其单元测试

    本次介绍的是,在javaWeb开发中,我们不免会遇到发送邮件的需求,比如:用户注册账号,需要激活登录,以及服务器定期向会员发送礼品信息等.所以参考有关资料,写了这个MailUtils工具类. 1.Ma ...

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

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

  3. 2014年Windows平台软件推荐:神器小工具(骨灰级

    原文  http://www.wtoutiao.com/a/120621.html 底层工具 “If you know how to use Process Monitor competently, ...

  4. Windows平台软件推荐:神器小工具(骨灰级)

    底层工具 "If you know how to use Process Monitor competently, people of both sexes will immediately ...

  5. TxQueryRunner-JDBC小工具

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

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

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

  7. 【JDBC】工具类的抽取

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

  8. sharedb结合elementUi编写的实时小工具

    我是使用sharedb 作为后端 ,然后前端使用的elementUI样式,编写的一个值班小工具.接下来,让我们先来了解一下sharedb是什么吧? sharedb工具 github地址:https:/ ...

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

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

随机推荐

  1. JavaScript DOM编程艺术读书笔记(三)

    第七章 动态创建标记 在web浏览器中往文档添加标记,先回顾下过去使用的技术: <body> <script type="text/javascript"> ...

  2. 介绍开源的.net通信框架NetworkComms框架之四 消息边界

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  3. 【NoSql】Redis

    [NoSql]Redis 一. 文档 1. 官网 2. Windows 安装包 3. C# Driver a. ServiceStack.Redis 最新版本是收费的 b. StackExchange ...

  4. 发现 git忽略没用

    git rm --cached GuoJiWeb/Properties/PublishProfiles/Profile1.pubxml

  5. 自用debug单元

    将之前的内存查看单元小幅修改,加上文件操作和计时,组成了一个自用debug单元,使用方法如示例. 此单元便捷之处在于直接将#define DEBUG注释掉而无需改动源码,即可取消debug模式. #d ...

  6. json对象

    //数组var arr=[1,2,3,3];//json对象var obj={width:'200px',height:'200px',background:'green'}; alert(obj[' ...

  7. 寒冰王座 hdu 1248(背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1248 #include <stdio.h> #include <stdlib.h> #i ...

  8. $.each与$().each

    在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法.两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点. $().each,对于这个方法,在d ...

  9. 对CPU做下性能测试

    任务管理器里把pi.exe优先级调到“高” I5-4308U  (2.80Ghz)     PI-1M最佳成绩11.719秒(MACBOOK PRO 13inch,插电,电源选择高性能模式) G202 ...

  10. 初试Nodejs——使用keystonejs创建博客网站2(修改模板)

    上一篇(初试Nodejs——使用keystonejs创建博客网站1(安装keystonejs))讲了keystonejs的安装.安装完成后,已经具备了基本的功能,我们需要对页面进行初步修改,比如,增加 ...