【问题标题】:DBUtils fails to fill fields of a Java BeanDBUtils 无法填充 Java Bean 的字段
【发布时间】:2014-08-25 03:49:44
【问题描述】:

我有一个这样的mysql表:

CREATE TABLE `sezione_menu` (
 `id_sezione_menu` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `nome` varchar(256) NOT NULL DEFAULT '',
 `ordine` int(11) DEFAULT NULL,
    PRIMARY KEY (`id_sezione_menu`)
 )ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

我使用 apache dbutils 来查询我的数据库,使用这些方法:

public static List<SezioneMenu> getSezioniMenu() {
    String sql = "SELECT * FROM sezione_menu";  
    try {
        QueryRunner qr = new QueryRunner(createDataSource());
        ResultSetHandler rsh = new BeanListHandler(SezioneMenu.class);
        List<SezioneMenu> sezioni = (List<SezioneMenu>)qr.query(sql, rsh);
        return sezioni;
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;  
}

private static DataSource createDataSource() {
        BasicDataSource d = new BasicDataSource();
        d.setDriverClassName(DRIVER);
        d.setUsername(USERNAME);
        d.setPassword(PASSWORD);
        d.setUrl(DB_URL);
        return d;
    }

现在,如果我运行我的应用程序,它不会抛出异常,但是我的 java bean SezioneMenu 的某些字段(不是全部!)是空的(整数字段等于零,字符串字段等于空字符串)。 这也发生在其他表和 bean 上。 我过去在另一个系统配置中使用过这种方法,没有问题。

【问题讨论】:

  • 在编写查询和 bean 时,是否确保 bean 中的字段与数据库列的名称相同,或者重命名列以匹配 bean 中的内容?您没有说哪些字段未填写,但我怀疑它可能是第一个字段,例如,您可能在 Java 代码中以驼峰式命名,同时在 SQL 语句中使用下划线。跨度>
  • 您应该分享 SezioneMenu.class java 代码来检查您的字段名称是否正确?

标签: java mysql javabeans apache-commons-dbutils


【解决方案1】:

您可以通过两种方式修复它:

As per dbutils doc,

  1. 为 SQL 中的列名起别名,使其与 Java 名称匹配:select social_sec# as socialSecurityNumber from person
  2. 子类 BeanProcessor 并重写 mapColumnsToProperties() 方法以去除有问题的字符。

如果你保持这样的课程

public class SezioneMenuBean implements Serializable {

    private int idSezioneMenu;

    private String nome;

    private int ordine;

    public SezioneMenuBean() {
    }

    // Getters and setters for bean values

}

根据第一个解决方案,将您的查询写成类似SELECT id_sezione_menu AS idSezioneMenu, name, ordine FROM sezione_menu

或者

基于第二种解决方案,您可以使用GenerousBeanProcessor,它是BeanProcessor 的子类,它忽略列名中的下划线和区分大小写。您不必实现自己的自定义BeanProcessor

GenerousBeanProcessorcommons-dbutils 的 1.6 版开始可用。

用法:

// TODO initialize
QueryRunner queryRunner = null;

ResultSetHandler<List<SezioneMenuBean>> resultSetHandler =
                new BeanListHandler<SezioneMenuBean>(SezioneMenuBean.class, new BasicRowProcessor(new GenerousBeanProcessor()));

// best practice is specifying only required columns in the query
// SELECT id_sezione_menu, name, ordine FROM sezione_menu
final List<SezioneMenuBean> sezioneMenuBeans = queryRunner.query("SELECT * FROM sezione_menu", resultSetHandler);

for (SezioneMenuBean sezioneMenuBean : sezioneMenuBeans) {
    System.out.println(sezioneMenuBean.getIdSezioneMenu());
}

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,即 BeanHandler/BeanHandlerList 为数据库列返回 null 或 0。

    正如@aelfric5578 在评论中提到的,我已经更新了与数据库同名的Bean 类,DBUtils 正确返回了值。

    这样定义 BeanClass 将解决您的问题。

    公共类 SezioneMenuBean{ int id_sezione_menu; 字符串名称; 按顺序; 公共 SezioneMenuBean(){ } // bean 值的 getter 和 setter }

    【讨论】:

      猜你喜欢
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 2017-03-15
      • 2020-11-29
      • 1970-01-01
      相关资源
      最近更新 更多