2

Spring 2.5.6 で CRUD 操作を行う方法を学ぼうとしています。データベースに、id と name の 2 つのフィールドを持つ、companys というテーブルを作成しました。私がやりたいことは、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(...)1行が見つかり、それ以外の場合は例外が発生すると想定していると思います。データベースにパラメータを持つ行が含まれていますか?id=1

queryForObject()たとえば、クエリ文字列をパラメーターと連結する代わりに、パラメーター化されたバージョンを使用する必要があります。

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

select.queryForList春からのメソッドを使用するだけです。うまくいけば、例が役に立ちます。

Spring 構成 xml ファイルから、データ ソースを定義します。ほとんどすべての有効な select ステートメントが機能します。あなたが望むものの出発点としてこれを使用してください。

<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 に答える