JDBC小工具--TxQueryRunner及其单元测试
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及其单元测试的更多相关文章
- javaWeb开发小工具---MailUtils及其单元测试
本次介绍的是,在javaWeb开发中,我们不免会遇到发送邮件的需求,比如:用户注册账号,需要激活登录,以及服务器定期向会员发送礼品信息等.所以参考有关资料,写了这个MailUtils工具类. 1.Ma ...
- 数据库表转换成javaBean对象小工具
package test.utils; import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter; ...
- 2014年Windows平台软件推荐:神器小工具(骨灰级
原文 http://www.wtoutiao.com/a/120621.html 底层工具 “If you know how to use Process Monitor competently, ...
- Windows平台软件推荐:神器小工具(骨灰级)
底层工具 "If you know how to use Process Monitor competently, people of both sexes will immediately ...
- TxQueryRunner-JDBC小工具
1.TxQueryRunner的简介(需要相关jar包的请留言) TxQueryRunner类是common-dbutils下QueryRunner的子类,是用来简化JDBC操作的,所以要导入comm ...
- 限时购校验小工具&dubbo异步调用实现限
本文来自网易云社区 作者:张伟 背景 限时购是网易考拉目前比较常用的促销形式,但是前期创建一个限时购活动时需要各个BU按照指定的Excel格式进行选品提报,为了保证提报数据准确,运营需要人肉校验很多信 ...
- 【JDBC】工具类的抽取
jdbc.properties属性文件 driverClass=com.mysql.jdbc.Driver url=jdbc:mysql:///jdbctest username=root passw ...
- sharedb结合elementUi编写的实时小工具
我是使用sharedb 作为后端 ,然后前端使用的elementUI样式,编写的一个值班小工具.接下来,让我们先来了解一下sharedb是什么吧? sharedb工具 github地址:https:/ ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
随机推荐
- poj1157LITTLE SHOP OF FLOWERS
Description You want to arrange the window of your flower shop in a most pleasant way. You have F bu ...
- Python全栈考试-部分试题(精选)
Python全栈考试(一) Python全栈考试(一) 1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py ...
- 关于checkbox复选框
1.复选框后面为什么会有间距,如图 首先这肯定不是空格.实际上是这样的,在Firefox,chrome,Safari等现代浏览器下复选框与文字的间隔确实是由margin引起的,也就是默认情况下,che ...
- 使用MLeaksFinder检测项目中的内存泄露
github地址:https://github.com/Zepo/MLeaksFinder MLeaksFinder使用简单方便,可以帮助你在开发时发现内存泄露你的iOS应用.它可以自动发现和UIVi ...
- JS正则表达式验证账号、手机号、电话和邮箱
JS正则表达式验证账号.手机号.电话和邮箱 效果体验:http://keleyi.com/keleyi/phtml/jstexiao/15.htm 验证帐号是否合法 验证规则:字母.数字.下划线组成, ...
- mac升级后提示pod: command not found
问题:升级mac到10.12使用pod,提示pod: command not found 解决方法:sudo gem install -n /usr/local/bin cocoapods 如 ...
- Glide 加载图片
//通过model获取到图片的url,将Url转换成bitmap对象: //设置不保存内存和硬盘缓存, 1 Glide.with(mContext).load(model.getVideoUrl()) ...
- 第三节 Hello world --python初体验
祭旗--hello world 据说简单优雅.功能强大是python的魅力所在,这里看到简单了,优雅是什么样的,接下来的学习中慢慢体会吧! print ("Hello world" ...
- chVsprintf
#if LINUX_SYSTEM int chVsprintf(LPSTR buffer, int nCount, LPCSTR format, va_list argptr) { return vs ...
- 在Android开发中如何判读当前设备是否连接网络
1:前言: 我们在Android开发的过程中,很多实现是要向远程服务器拿数据的,但是未必当前设备一定连接了网络啊,那么此时我们就是要进行判断的了, 如果是有网络的话,那么此时就去向远程服务器去拿数据, ...