1. 程式人生 > >TxQueryRunner-JDBC小工具

TxQueryRunner-JDBC小工具

我們 nds 兩個 映射 alt delete cti apach 小工具

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小工具