DBUtils无法填充Java Bean的字段

我有一个像这样的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 getSezioniMenu() { String sql = "SELECT * FROM sezione_menu"; try { QueryRunner qr = new QueryRunner(createDataSource()); ResultSetHandler rsh = new BeanListHandler(SezioneMenu.class); List sezioni = (List)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; } 

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

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

根据dbutils doc,

  1. 在SQL中为列名称别名,使它们与Java名称匹配:从person选择social_sec#作为socialSecurityNumber
  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

要么

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

commons-dbutils的 1.6版本开始, GenerousBeanProcessor就可用了

用法:

 // TODO initialize QueryRunner queryRunner = null; ResultSetHandler> resultSetHandler = new BeanListHandler(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 sezioneMenuBeans = queryRunner.query("SELECT * FROM sezione_menu", resultSetHandler); for (SezioneMenuBean sezioneMenuBean : sezioneMenuBeans) { System.out.println(sezioneMenuBean.getIdSezioneMenu()); } 

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

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

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


    公共类SezioneMenuBean {

     int id_sezione_menu;
     String nome;
     int ordine;

     public SezioneMenuBean(){
     }

     // bean值的getter和setter

     }