標籤:補充 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小工具