dbutils 库中的 BeanListHandler 无法从数据库结果集中创建 java 类对象
Posted
技术标签:
【中文标题】dbutils 库中的 BeanListHandler 无法从数据库结果集中创建 java 类对象【英文标题】:BeanListHandler from dbutils library cannot create java class objects from a database resultset 【发布时间】:2017-04-16 23:25:21 【问题描述】:我在 apache derby 数据库中创建了一个名为 Product 的类和一个具有相同名称 (Product) 的表。现在,每当我使用 BeanListHandler 从数据库中检索行时,我都想获取相应的 Product 对象,但总是出错。我几乎到处都在寻找解决方案,之后我仍然看不到我的代码哪里出错了。有人可以告诉我我错在哪里。我的代码如下所示。
public class Product
private long uniqueId; //Auto increment
private String productCode;
private String productName;
private String productCategory;
private boolean available;
private double productPrice;
private int quantityOnHand;
public Product(long uniqueId, String productCode, String productName, String productCategory, boolean available, double productPrice, int quantityOnHand)
this.uniqueId = uniqueId; //Auto increment
this.productCode = productCode;
this.productName = productName;
this.productCategory = productCategory;
this.available = available;
this.productPrice = productPrice;
this.quantityOnHand = quantityOnHand;
@Override
public String toString()
return "Product" + "uniqueId=" + uniqueId + ", productCode=" + productCode + ", productName=" + productName + ", productCategory=" + productCategory + ", available=" + available + ", productPrice=" + productPrice + ", quantityOnHand=" + quantityOnHand + '';
public long getUniqueId()
return uniqueId;
public String getProductCode()
return productCode;
public String getProductName()
return productName;
public String getProductCategory()
return productCategory;
public boolean isAvailable()
return available;
public double getProductPrice()
return productPrice;
public int getQuantityOnHand()
return quantityOnHand;
public void setUniqueId(long uniqueId)
this.uniqueId = uniqueId;
public void setProductCode(String productCode)
this.productCode = productCode;
public void setProductName(String productName)
this.productName = productName;
public void setProductCategory(String productCategory)
this.productCategory = productCategory;
public void setAvailable(boolean available)
this.available = available;
public void setProductPrice(double productPrice)
this.productPrice = productPrice;
public void setQuantityOnHand(int quantityOnHand)
this.quantityOnHand = quantityOnHand;
@Override
public int hashCode()
int hash = 5;
hash = 53 * hash + (int) (this.uniqueId ^ (this.uniqueId >>> 32));
hash = 53 * hash + Objects.hashCode(this.productCode);
hash = 53 * hash + Objects.hashCode(this.productName);
hash = 53 * hash + Objects.hashCode(this.productCategory);
hash = 53 * hash + (this.available ? 1 : 0);
hash = 53 * hash + (int) (Double.doubleToLongBits(this.productPrice) ^ (Double.doubleToLongBits(this.productPrice) >>> 32));
hash = 53 * hash + this.quantityOnHand;
return hash;
@Override
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Product other = (Product) obj;
if (!Objects.equals(this.productCode, other.productCode))
return false;
if (!Objects.equals(this.productName, other.productName))
return false;
if (!Objects.equals(this.productCategory, other.productCategory))
return false;
return true;
以下是检索产品行并将其转换为产品对象的方法。我已经导入并创建了建立连接和执行查询所需的每个组件(例如 private QueryRunner queryRunner=new QueryRunner(); 私有静态最终列表 EMPTY_PRODUCT_LIST=new ArrayList();等)
public List<Product> searchAllProducts()
ResultSetHandler<List<Product>> p = new BeanListHandler<>(Product.class);
try
return (List<Product>) queryRunner.query(connection, "SELECT * FROM PRODUCT", p);
catch(SQLException e)
e.printStackTrace();
finally
try
DbUtils.close(connection);
catch (SQLException ex)
Logger.getLogger(ProductDatabaseHandler.class.getName()).log(Level.SEVERE, null, ex);
return EMPTY_PRODUCT_LIST;
下面是我得到的错误。
Fri Dec 02 20:05:35 EAT 2016 : Apache Derby Network Server - 10.11.1.2 - (1629631) started and ready to accept connections on port 1555
java.sql.SQLException: Cannot create main.java.models.Product:
main.java.models.Product Query: SELECT * FROM PRODUCT Parameters: []
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:392)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:351)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:226)
at main.java.database.ProductDatabaseHandler.searchAllProducts(ProductDatabaseHandler.java:226)
【问题讨论】:
尝试在您的问题中包含完整的异常堆栈跟踪。 【参考方案1】:我认为您需要为您的 Product
类使用适当的 setter 方法的无参数构造函数。
BeanProcessor
负责将Resultset
转换为 bean,下面是它创建新 bean 实例的代码。
protected <T> T newInstance(Class<T> c) throws SQLException
try
return c.newInstance();
catch (InstantiationException e)
throw new SQLException(
"Cannot create " + c.getName() + ": " + e.getMessage());
显然它需要一个无参数的构造函数
【讨论】:
以上是关于dbutils 库中的 BeanListHandler 无法从数据库结果集中创建 java 类对象的主要内容,如果未能解决你的问题,请参考以下文章
DBUtiles中的简单使用(QueryRunner和ResultSetHandler的手动实现)