我有一个像这样的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也会发生这种情况。
我过去在另一个系统配置中使用过这种方法没有问题。
答案 0 :(得分:3)
您可以通过两种方式解决问题:
- 对SQL中的列名称进行别名,使它们与Java名称匹配:从person选择social_sec#as 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
。
或者
根据第二个解决方案,您可以使用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 }