解决:DButils QueryRunner count(*) JavaBean里封装的结果集 返回null 或者返回 0

来源:互联网 发布:淘宝有国际版 编辑:程序博客网 时间:2024/05/16 03:25
当你的结果集是一下两种情况时:
化妆品: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;    }}
阅读全文
0 0
原创粉丝点击