DBUtils无法填充Java Bean的字段

时间:2014-07-03 21:29:00

标签: java mysql javabeans apache-commons-dbutils

我有一个像这样的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也会发生这种情况。 我过去在另一个系统配置中使用过这种方法没有问题。

2 个答案:

答案 0 :(得分:3)

您可以通过两种方式解决问题:

As per dbutils doc,

  
      
  1. 对SQL中的列名称进行别名,使它们与Java名称匹配:从person选择social_sec#as socialSecurityNumber
  2.   
  3. 子类BeanProcessor并覆盖mapColumnsToProperties()方法以去除有问题的字符。
  4.   

如果你要保持这样的课程

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的子类,它会忽略下划线和&amp;列名称的区分大小写。您不必实施自己的自定义BeanProcessor

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

答案 1 :(得分:0)

我面临同样的问题,BeanHandler / BeanHandlerList为数据库列返回null或0。

正如@ aelfric5578在评论中所提到的,我更新了Bean类,其名称与Database相同,DBUtils正确返回值。

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


    public class SezioneMenuBean{

    int id_sezione_menu;
    String nome;
    int ordine;

    public SezioneMenuBean(){
    }

    // Getters and setters for bean values

    }