DBUtils无法填充Java Bean的字段 [英] DBUtils fails to fill fields of a Java Bean

查看:156
本文介绍了DBUtils无法填充Java Bean的字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个像这样的mysql表:

I have a mysql table like this:

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查询我的数据库,使用以下方法:

I use apache dbutils to query my database, with these methods:

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。
我过去在另一个系统配置中使用过这种方法没有问题。

Now, if i run my application, it doesn't throw exception, but some fields (not all!) of my java bean SezioneMenu are empty (integer field equals zero and string field equals empty string). This happen also with other tables and beans. I used this method in the past in another system configuration without problems.

推荐答案

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

You can fix it in two ways:

按照dbutils doc,



  1. 别名SQL中的列名,以便它们与Java名称匹配:从person选择social_sec#as socialSecurityNumber

  2. 子类BeanProcessor并覆盖mapColumnsToProperties()方法以去除有问题的字符。


如果你要保留这样的课程

If you are keeping a class like this

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

As per first solution write your queries something like this SELECT id_sezione_menu AS idSezioneMenu, name, ordine FROM sezione_menu.

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

Based on second solution you can use GenerousBeanProcessor which is a subclass of BeanProcessor it ignores underscore & case sensitivity from column name. You don't have to implement your own custom BeanProcessor

GenerousBeanProcessor commons-dbutils 的1.6版本开始提供。

GenerousBeanProcessor is available since version 1.6 of commons-dbutils.

用法:

// 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());
}

这篇关于DBUtils无法填充Java Bean的字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆