TxQueryRunner-JDBC小工具
阿新 • • 發佈:2017-09-02
我們 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小工具