Вопрос по apache-commons-dbutils, javabeans, java, mysql – DBUtils не может заполнить поля Java Bean

1

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

Когда вы пишете свои запросы и бины, вы гарантируете, что либо поля в вашем бине имеют имена, совпадающие с столбцами вашей базы данных, либо переименовываете ваши столбцы в соответствии с тем, что находится в бине? Вы не сказали, какие поля не заполнены, но я подозреваю, что это может быть первое поле, которое вы можете, например, назвать в camelCase в коде Java при использовании подчеркиваний в операторе SQL. aelfric5578
Вы должны поделиться Java-кодом SezioneMenu.class, чтобы проверить правильность имени вашего поля или нет? erhun

Ваш Ответ

2   ответа
2

Вы можете исправить это двумя способами:

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

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

Или же

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

GenerousBeanProcessor доступен с версии 1.6Викисклада 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());
}
0

Я столкнулся с той же проблемой, что и BeanHandler / BeanHandlerList, возвращающий ноль или 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

    }

Похожие вопросы