1. 程式人生 > >解決:DButils QueryRunner count(*) JavaBean裡封裝的結果集 返回null 或者返回 0

解決:DButils QueryRunner count(*) JavaBean裡封裝的結果集 返回null 或者返回 0

當你的結果集是一下兩種情況時:
化妝品:0
家電:0
服飾:0
化妝品:null
家電:null
服飾:null
你可能出現這個錯誤:
JavaBean中的欄位名與資料庫中欄位名不一致。
我要:使用聚合函式,返回每一個分類裡的商品數。下圖這種效果。
化妝品1
家電3
服飾1
輸出:結果集為文章開頭那兩種。
存在Bug程式碼:count(*) 改成count(*) as num
   @Test
public void TestCount(){
//    核心類
QueryRunner queryRunner = new QueryRunner(getDataSource());
//        Sql
String 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;
}
}