解决: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 list = queryRunner.query(sql,new BeanListHandler<>(CountJavaBean.class));
            for (CountJavaBean countJavaBean :list){
                System.out.println(countJavaBean);
            }
//            使用MapMapListHandler
//           List> list = queryRunner.query(sql,new MapListHandler());
//            for (Map 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 rs = queryRunner.query(sql, new ArrayListHandler());
//
            //            for (Object[] getObjParamRs : rs){
//                for (Object getObj :getObjParamRs){
//                    System.out.print(getObj);
//                }
//                System.out.println();
//            }

//            通过BeanListHandler获取对象
            List rs = queryRunner.query(sql,new BeanListHandler(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());
            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 list = queryRunner.query(sql,new BeanListHandler<>(CountJavaBean.class));
            for (CountJavaBean countJavaBean :list){
                System.out.println(countJavaBean);
            }
//            使用MapMapListHandler
//           List> list = queryRunner.query(sql,new MapListHandler());
//            for (Map 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;
    }
}
 
  
 
  
 
 

你可能感兴趣的:(java)