当你的结果集是一下两种情况时:
化妆品:0
家电:0
服饰:0
或
化妆品:null
家电:null
服饰:null
你可能出现这个错误:
JavaBean中的字段名与数据库中字段名不一致。
我要:使用聚合函数,返回每一个分类里的商品数。下图这种效果。
输出:结果集为文章开头那两种。
存在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 ;
}
}