什么是javabean
简单理解:JavaBean 就是一个类, 开发中通常用于封装数据
javabean具备的特征
1、所有属性为private
2、提供默认构造方法
3、提供getter和setter
4、实现serializable接口
使用DBUtils处理查询结果时的BeanHandler和BeanListHandler
BeanHandler:将结果集中第一条记录封装到一个指定的javaBean中
BeanListHandler:将结果集中每一条记录封装到指定的javaBean中,再将这些javaBean在封装到List集合中
看下面具体使用场景
//需求2: 获取订单编号为 order001的订单中的所有商品信息
//最好不要采用连接查询,避免增加查询次数
public List<Product> getProductsByOId(String oid) throws SQLException {
//1、创建QueryRunner对象
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2、编写sql:先根据oid查询订单项目表中的pid
String sql = "select pid from orderitem where oid = ?";
//3、执行sql:查询oid对应的pid
List<String> pids = qr.query(sql, new BeanListHandler<String>(String.class), oid);
//4、根据查询到的pid查询商品并放入集合中
List<Product> products = new ArrayList<>();
ProductDao productDao = new ProductDao(); //用来查询pid对应的商品
for (String pid : pids) {
Product productById = productDao.getProductById(pid);
//将查询到的添加进集合中
products.add(productById);
}
//5、返回获取到的products集合
return products;
}
List<String> pids = qr.query(sql, new BeanListHandler<String>(String.class), oid);
上面的这行代码会导致集合中元素都为null,我们要特别注意,将查询结果放入ResultSet实现类中时(如BeanHandler和BeanListHandler)指定的是要放入的结果实体,而不是类型。也就是说,我们指定的实体应该是一个容器,这个容器中应该包含有查询到的数据的各个字段
所以该行代码出错的原因就是因为String类型作为一个javabean中内部是没有包含String类型的一个pid让查询到的pid字段进行匹配存放的。不要误以为是查询到的pid是String类型这里就指定为String类型,这和泛型还是不一样的。应该改为
//需求2: 获取订单编号为 order001的订单中的所有商品信息
//最好不要采用连接查询,避免增加查询次数
public List<Product> getProductsByOId(String oid) throws SQLException {
//1、创建QueryRunner对象
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2、编写sql:先根据oid查询订单项目表中的pid
String sql = "select pid from orderitem where oid = ?";
//3、执行sql:查询oid对应的pid
List<OrderItem> orderItems = qr.query(sql, new BeanListHandler<OrderItem>(OrderItem.class), oid);
//4、根据查询到的pid查询商品并放入集合中
List<Product> products = new ArrayList<>();
ProductDao productDao = new ProductDao(); //用来查询pid对应的商品
for (OrderItem orderItem : orderItems) {
String pid = orderItem.getPid();
Product productById = productDao.getProductById(pid);
//将查询到的添加进集合中
products.add(productById);
}
//5、返回获取到的products集合
return products;
}