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<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 пусты (целочисленное поле равно нулю, а строковое поле равно пустой строке). Это происходит и с другими таблицами и компонентами. Я использовал этот метод в прошлом в другой конфигурации системы без проблем.


person nap.gab    schedule 03.07.2014    source источник
comment
Когда вы пишете свои запросы и bean-компоненты, гарантируете ли вы, что либо поля в вашем bean-компоненте названы так же, как столбцы вашей базы данных, либо переименовываете свои столбцы в соответствии с тем, что находится в bean-компоненте? Вы не сказали, какие поля не заполнены, но я подозреваю, что это может быть первое поле, которое вы можете назвать, например, в camelCase в коде Java при использовании символов подчеркивания в операторе SQL.   -  person aelfric5578    schedule 21.12.2014
comment
Вы должны поделиться java-кодом SezioneMenu.class, чтобы проверить правильность имени вашего поля или нет?   -  person erhun    schedule 10.05.2015


Ответы (2)


Исправить можно двумя способами:

Согласно документу dbutils,

  1. Псевдонимы имен столбцов в SQL, чтобы они соответствовали именам Java: выберите 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.

Or

На основе второго решения вы можете использовать GenerousBeanProcessor, который является подклассом BeanProcessor, он игнорирует подчеркивание и чувствительность к регистру из имени столбца. Вам не нужно реализовывать свои собственные BeanProcessor

GenerousBeanProcessor доступен, начиная с версии 1.6 commons-dbutils.

Применение:

// 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());
}
person Visruth    schedule 08.11.2017

Я столкнулся с той же проблемой, когда BeanHandler/BeanHandlerList возвращает null или 0 для столбцов базы данных.

Как упоминалось в комментарии @aelfric5578, я обновил класс Bean с теми же именами, что и в базе данных, DBUtils правильно возвращал значения.

Определение BeanClass таким образом решит вашу проблему.


    public class SezioneMenuBean{

    int id_sezione_menu;
    String nome;
    int ordine;

    public SezioneMenuBean(){
    }

    // Getters and setters for bean values

    }

person parishodak    schedule 22.09.2015