2

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

4

2 回答 2

4

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

根据 dbutils 文档,

  1. 别名 SQL 中的列名,使其与 Java 名称匹配:select social_sec# as socialSecurityNumber from person
  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

或者

基于第二种解决方案,您可以使用GenerousBeanProcessor它的子类,BeanProcessor它会忽略列名中的下划线和区分大小写。您不必实现自己的自定义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());
}
于 2017-11-08T07:24:20.323 回答
0

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

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

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

    公共类 SezioneMenuBean{

    int id_sezione_menu;
    字符串名称;
    按顺序;

    公共 SezioneMenuBean(){
    }

    // bean 值的 getter 和 setter

    }

于 2015-09-22T12:10:53.007 回答