2

我正在尝试学习如何在 Spring 2.5.6 中进行 CRUD 操作。我在我的数据库中创建了一个名为 Companies 的表,其中包含 2 个字段:id 和 name。我想要做的是使用 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的工作方式有关吗?

附带问题:是否有任何好的资源可以演示如何在 Spring 中进行 CRUD 操作?到目前为止,我拥有的唯一资源就是这个这个,它们并没有真正为我提供足够的例子来让我做任何事情。

4

2 回答 2

1

我认为这getSimpleJdbcTemplate().queryForObject(...)是假设它恰好找到具有给定查询的一行,否则会引发异常。您确定您的数据库包含带有参数的行id=1吗?

例如,您应该使用参数化版本queryForObject()而不是将查询字符串与参数连接起来。

getSimpleJdbcTemplate().queryForObject(
            "SELECT id, name FROM companies WHERE id = ?",
            new CompanyMapper(), id)
于 2011-04-12T20:28:45.447 回答
1

只需使用select.queryForListspring 中的方法即可。希望一个例子会有所帮助。

从 spring 配置 xml 文件中,您可以定义数据源。几乎任何有效的选择语句都可以工作。将此作为您想要的起点。

<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);
}
于 2011-04-12T20:39:59.490 回答