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