Как получить строку в базе данных и преобразовать ее в объект в Spring? - PullRequest
2 голосов
/ 24 февраля 2011

Я пытаюсь научиться выполнять операции CRUD в Spring 2.5.6. Я сделал таблицу в моей базе данных под названием компании, которая имеет 2 поля: идентификатор и имя. Я хочу извлечь строку из таблицы, используя поле id. Это то, что я сделал для этого.

public class JdbcCompanyDao extends SimpleJdbcDaoSupport implements CompanyDao {
    protected final Log logger = LogFactory.getLog(getClass());

    public Company getCompany(int id) {
        logger.info("Getting company with id = " + id);
        Company company = getSimpleJdbcTemplate().queryForObject(
                "SELECT id, name FROM companies WHERE id = " + id,
                new CompanyMapper());
        return company;
    }

    private static class CompanyMapper implements ParameterizedRowMapper<Company> {
        public Company mapRow(ResultSet rs, int rowNum) throws SQLException {
            Company company = new Company();
            company.setId(rs.getInt("id"));
            company.setName(rs.getString("name"));
            return company;
        }
    }
}

Я сделал тестовый модуль, чтобы проверить, правильно ли я это сделал:

public class JdbcCompanyDaoTests extends AbstractTransactionalDataSourceSpringContextTests {
    private CompanyDao companyDao;

    public void setCompanyDao(CompanyDao companyDao) {
        this.companyDao = companyDao;
    }

    @Override
    protected String[] getConfigLocations() {
        return new String[] {"classpath:test-context.xml"};
    }

    @Override
    protected void onSetUpInTransaction() throws Exception {
        super.deleteFromTables(new String[] {"companies"});
        super.executeSqlScript("file:db/load_data.sql", true);
    }

    public void testGetCompany() {
        Company company = companyDao.getCompany(1);

        assertEquals("SomeRandomCompany", company.getName());
    }
}

Когда я запускаю тест, я получаю следующую ошибку:

org.springframework.dao.EmptyResultDataAccessException: Неверный размер результата: ожидается 1, фактический 0

Я не могу найти причину, по которой getCompany () возвращает пустой набор результатов. Сейчас я понятия не имею, что мне нужно делать, и я все еще не понимаю, как работает Spring. Это как-то связано с тем, как AbstractTransactionalDataSourceSpringContextTests работает?

Дополнительный вопрос: есть ли хорошие ресурсы, которые демонстрируют, как выполнять операции CRUD в Spring? Пока что у меня есть только ресурсы: , это и , это , и они не дают достаточно примеров, чтобы я мог что-то сделать.

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Просто используйте метод select.queryForList из весны. Надеюсь, пример поможет.

Из XML-файла конфигурации Spring вы определяете свой источник данных. Практически любой действительный оператор выбора будет работать. Используйте это как отправную точку для того, что вы хотите.

<bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="${mysql.url}"/>
    <property name="username" value="${mysql.username}"/>
    <property name="password" value="${mysql.password}"/>
</bean>

Фактический метод, используемый для извлечения данных, действительно довольно прост ...

public List<Map<String, Object>> showTables() {

    String sql = "select name from MYTABLE..sysobjects where xtype = 'U';";

    JdbcTemplate select = new JdbcTemplate(sqlDataSource);

    return select.queryForList(sql);
}
1 голос
/ 13 апреля 2011

Я думаю, что getSimpleJdbcTemplate().queryForObject(...) предполагает, что он находит точно одну строку с данным запросом и в противном случае вызывает исключение.Вы уверены, что ваша база данных содержит строку с параметром id=1?

Вы должны использовать параметризованную версию queryForObject() вместо объединения строки запроса с параметрами, например.

getSimpleJdbcTemplate().queryForObject(
            "SELECT id, name FROM companies WHERE id = ?",
            new CompanyMapper(), id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...