解決:DButils QueryRunner count(*) JavaBean裡封裝的結果集 返回null 或者返回 0
阿新 • • 發佈:2019-01-03
當你的結果集是一下兩種情況時:
化妝品:0
家電:0 服飾:0
或
化妝品:null 家電:null 服飾:null
你可能出現這個錯誤:
JavaBean中的欄位名與資料庫中欄位名不一致。
我要:使用聚合函式,返回每一個分類裡的商品數。下圖這種效果。
化妝品 | 1 |
家電 | 3 |
服飾 | 1 |
輸出:結果集為文章開頭那兩種。
存在Bug程式碼:count(*) 改成count(*) as num
@Test public void TestCount(){ // 核心類 QueryRunner queryRunner = new QueryRunner(getDataSource()); // SqlString sql = "select cname ,count(*) from product inner join category on category_id=cid group by cname;"; // 執行 try { // 使用javabean List<CountJavaBean> list = queryRunner.query(sql,new BeanListHandler<>(CountJavaBean.class)); for (CountJavaBean countJavaBean :list){ System.out.println(countJavaBean); } // 使用MapMapListHandler // List<Map<String,Object>> list = queryRunner.query(sql,new MapListHandler()); // for (Map<String,Object> getKey : list){ // for(String rsKey : getKey.keySet()){ // Object value = getKey.get(rsKey);// System.out.print(value+" "); // } // System.out.println(); // } } catch (SQLException e) { e.printStackTrace(); } }
JavaBean:結果集出現null,是因為JavaBean欄位num型別設定為Object,而資料庫裡沒有num這個欄位,所以只能返回null
結果集出現0,是因為JavaBean欄位num型別設定為int,而資料庫裡沒有num這個欄位,所以只能返回0.
package jUnit; import java.io.Serializable; public class CountJavaBean implements Serializable{ private String cname; // get經驗 // javabean裡的欄位名必須跟資料庫裡的欄位名一樣.至於javabean裡的欄位型別,隨你咯,只要你開心用什麼型別無所謂了. // 比如count(*)在資料庫裡返回的值對應java裡的long型別 // 但是我有JavaBean大哥,只要我的欄位名和資料庫裡的一樣,至於傳成什麼型別,看大哥JavaBean的欄位型別.聽大哥的話.好辦事. private Object num; public CountJavaBean(){ super(); } public void setCname(String cname) { this.cname = cname; } public void setNum(Object num) { this.num = num; } public String getCname() { return cname; } public Object getNum() { return num; } @Override public String toString() { return cname+":"+num; } }
修改後:
package jUnit; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.*; import org.junit.Test; import java.sql.SQLException; import java.util.List; import java.util.Map; import java.util.Set; import static toolutils.DBCPUtils.getDataSource; /* * dbutils工具類測試 * */ public class DBUtilsTest { @Test /*查詢一條記錄*/ public void select(){ // 核心類 QueryRunner queryRunner = new QueryRunner(getDataSource()); // sql String sql = "select pid , pname from product where pid = ?"; // 引數 Object[] param = {"p001"}; // 執行 try { Object[] result = queryRunner.query(sql, new ArrayHandler(),param); for (Object obj : result){ System.out.print(obj); } } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("查詢失敗"+e); } } @Test /*插入*/ public void insert(){ // 核心類 QueryRunner queryRunner = new QueryRunner(getDataSource()); // sql String sql = "insert into product values(?,?,?,?)"; // 引數 Object[] param = {"null","山大地維","3500","c004"}; // 執行 try { int row = queryRunner.update(sql,param); System.out.println("插入成功"+row+"條"); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("插入失敗"+e); } } @Test /*刪除*/ public void delete(){ // 核心類 QueryRunner queryRunner = new QueryRunner(getDataSource()); // Sql String sql = "delete from product where pid=?"; // 引數 String param = "null"; // 執行 try { int row = queryRunner.update(sql,param); System.out.println("刪除"+row+"行"); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("刪除失敗"+e); } } @Test /* * 查詢所有記錄*/ public void selectAll(){ // 核心類 QueryRunner queryRunner = new QueryRunner(getDataSource()); // sql String sql = "select pid,pname,price,category_id from product"; // 執行 try { // 獲取Object // List<Object[]> rs = queryRunner.query(sql, new ArrayListHandler()); // // for (Object[] getObjParamRs : rs){ // for (Object getObj :getObjParamRs){ // System.out.print(getObj); // } // System.out.println(); // } // 通過BeanListHandler獲取物件 List<Product> rs = queryRunner.query(sql,new BeanListHandler<Product>(Product.class)); for (Product getRs : rs){ System.out.println(getRs); } } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("查詢所有失敗"+e); } } @Test /*總記錄數 * */ public void count(){ // 核心類 QueryRunner queryRunner = new QueryRunner(getDataSource()); // sql String sql = "select count(*) from product"; // 執行 try { Long num = queryRunner.query(sql,new ScalarHandler<Long>()); System.out.println(num); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("count查詢失敗"+e); } } @Test public void TestCount(){ // 核心類 QueryRunner queryRunner = new QueryRunner(getDataSource()); // Sql String sql = "select cname ,count(*)as num from product inner join category on category_id=cid group by cname;"; // 執行 try { // 使用javabean List<CountJavaBean> list = queryRunner.query(sql,new BeanListHandler<>(CountJavaBean.class)); for (CountJavaBean countJavaBean :list){ System.out.println(countJavaBean); } // 使用MapMapListHandler // List<Map<String,Object>> list = queryRunner.query(sql,new MapListHandler()); // for (Map<String,Object> getKey : list){ // for(String rsKey : getKey.keySet()){ // Object value = getKey.get(rsKey); // System.out.print(value+" "); // } // System.out.println(); // } } catch (SQLException e) { e.printStackTrace(); } } }
package jUnit; import java.io.Serializable; public class CountJavaBean implements Serializable{ private String cname; // get經驗 // javabean裡的欄位名必須跟資料庫裡的欄位名一樣.至於javabean裡的欄位型別,隨你咯,只要你開心用什麼型別無所謂了. // 比如count(*)在資料庫裡返回的值對應java裡的long型別 // 但是我有JavaBean大哥,只要我的欄位名和資料庫裡的一樣,至於傳成什麼型別,看大哥JavaBean的欄位型別.聽大哥的話.好辦事. private int num; public CountJavaBean(){ super(); } public void setCname(String cname) { this.cname = cname; } public void setNum(int num) { this.num = num; } public String getCname() { return cname; } public int getNum() { return num; } @Override public String toString() { return cname+":"+num; } }