TxQueryRunner-JDBC小工具

來源:互聯網
上載者:User

標籤:補充   com   條件   ast   person   單元   new   ddr   object   

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     @Override40 40     public String toString() {41 41         return "Person [pid=" + pid + ", pname=" + pname + ", page=" + page42 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 SQLException109      */110     @Test111     public void testQuery1() throws SQLException112     {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      * 使用BeanListHandler125      * 把多行結果集映射到List<Bean>中,即多個javaBean對象126      * 一行結果映射到一個javaBean對象中,多行結果映射到List<Bean>中。127      * @throws SQLException128      */129     @Test130     public void testQuery2() throws SQLException131     {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      * Map145      * 使用MapHandler將單行結果集映射到Map中146      * @throws SQLException147      */148     @Test149     public void testQuery3() throws SQLException150     {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 SQLException166      */167     @Test168     public void testQuery4() throws SQLException169     {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 SQLException184      */185     @Test186     public void testQuery5() throws SQLException187     {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     @Test11     public void testQuery6() throws SQLException12     {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     @Override52     public String toString() {53         return "Address [aid=" + aid + ", province=" + province + ", city="54                 + city + ", street=" + street + "]";55     }56     57     58 }

 

在資料庫中建立t_address表。

TxQueryRunner-JDBC小工具

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.