2011-02-24 22 views
2

我正試圖學習如何在Spring 2.5.6中執行CRUD操作。我在我的數據庫中創建了一個名爲公司的表格,其中有兩個字段:id和name。我想要做的是使用id字段從表中檢索一行。這是我爲它做的。如何檢索數據庫中的行並將其轉換爲Spring中的對象?

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: Incorrect result size: expected 1, actual 0

我可以找不到getCompany()返回空結果集的原因。現在,我不知道我需要做什麼,我仍然對Spring的工作方式感到困惑。這與AbstractTransactionalDataSourceSpringContextTests如何工作有關嗎?

旁邊的問題:有沒有什麼好的資源可以演示如何在Spring中執行CRUD操作?到目前爲止,我擁有的唯一資源是thisthis,他們並沒有提供足夠的例子讓我做任何事情。

+0

請問如果你改變onSetUpInTransaction()來onSetUp()工作? – Ritesh 2011-02-24 09:30:33

+0

@Ritesh,不。我只是按照我在教程中看到的內容(http://static.springsource.org/docs/Spring-MVC-step-by-step/index.html)嘗試添加一些我自己的。除了我的測試方法外,教程中的所有內容都可以工如果你想知道的話,當我把它們粘貼到這個問題上時,我會從這兩個類中刪除其他方法,因爲它們是有用的,這些方法都是不相關的,並且是教程的一部分。 – 2011-02-24 09:36:00

+0

爲什麼從Spring 2.5開始Spring 3已經過了一年了? – 2011-02-24 10:50:44

回答

1

只需使用select.queryForList從春季的方法。希望有一個例子會有所幫助。

從彈簧配置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); 
} 
1

我認爲getSimpleJdbcTemplate().queryForObject(...)假設它發現恰好是與給定的查詢一行,否則引發異常。你確定你的數據庫包含一個參數爲id=1的行嗎?例如,您應該使用queryForObject()的參數化版本,而不是將查詢字符串與參數連接起來。

getSimpleJdbcTemplate().queryForObject(
      "SELECT id, name FROM companies WHERE id = ?", 
      new CompanyMapper(), id) 
相關問題