欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java.sql.SQLException: Cannot create xxx 解决办法

程序员文章站 2022-06-15 09:10:59
...

java.sql.SQLException: Cannot create xxx 解决办法


前言:纪念第一篇博客:一直想试着写写博客,苦于不知道该写什么,最近在学Java框架,正好逮着一个机会,废话不多说,上代码

//使用DbUtils里的QueryRunner操作数据库
private QueryRunner queryRunner = new QueryRunner();

/**
 * 查询返回一个javaBean的sql语句
 *
 * @param type 返回的对象类型
 * @param sql  执行的sql语句
 * @param args sql对应的参数值
 * @param <T>  返回的类型的泛型
 * @return
 */
public <T> T queryForOne(Class<T> type, String sql, Object... args) {
    Connection con = JdbcUtils.getConnection();
    try {
        return queryRunner.query(con, sql, new BeanHandler<T>(type), args);
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JdbcUtils.close(con);
    }
    return null;
}

String sql = "select `id` , `name` , `author` , `price` , `sales` , `stock` , `img_path` from t_book where id = ?";
System.out.println(queryForOne(Book.class, sql, id));

对应的JavaBean类

public class Book {
    private Integer id;
    private String name;
    private String author;
    private BigDecimal price;
    private Integer sales;
    private Integer stock;
    private String imgPath;
}

代码很简单,通过传入JavaBean类,sql语句和语句中的参数,将sql语句查询的结果封装成对应的JavaBean对象,return该对象。

遇到的问题如下,说是不能创建对应的对象

java.sql.SQLException: Cannot create xxx 解决办法

最初怀疑问题出在sql语句上,也就是数据库里的属性名和JavaBean里的私有变量名不一致,而我参考的代码,数据库的最后一个属性叫“img_path”,JavaBean类里的变量名是“imgPath”,还真就不一样,一个按照python命名规范命名,一个按照Java命名规范命名,于是修改sql语句如下

String sql = "select `id` , `name` , `author` , `price` , `sales` , `stock` , `img_path` imgPath from t_book where id = ?";

在查询时将最后一个属性改一个别名,改成对应JavaBean类里的变量名。结果还是一样报错。

最后终于找到答案,JavaBean类里没写无参构造,因为创建Bean对象的过程使用的是newInstance()方法,该方法只能调用无参构造,类中没写无参构造,当然也就不能创建对象。当初写JavaBean类的时候,写完变量,右键getter,setter,constructor,就完事了。现在知道问题所在了,加上无参构造之后,代码没bug,楼下大爷看了都说好,又可以愉快地学习了。