2011-10-05 62 views
1

也許我錯過了一些明顯的東西,但我無法獲得一個簡單的映射插入語句執行成功。Mybatis 3.0.5多輸入插入/更新語句映射

使用下面的接口

public interface CustomItemMapper 
{ 
    Integer insert(CustomItem item, @Param("extra") String someparam); 
} 

和下面的XML映射

<insert id="insert" useGeneratedKeys="false" parameterType="map" keyProperty="id"> 
    insert into CustomItem (id, column2, column3, column4, column5, column6) 
     values (#{id}, #{field2}, #{field3}, #{field4}, #{field5}, #{extra}) 
    </insert> 

和驗證碼

SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) servletContext.getAttribute("SqlSessionFactory"); 
SqlSession session = sqlSessionFactory.openSession(); 
try 
{ 
    CustomItemMapper mapper = session.getMapper(CustomItemMapper.class); 
    mapper.update(item); 
    session.commit(); 
} 
finally 
{ 
    session.close(); 
} 

我得到以下調試輸出:

Checked out connection 368716606 from pool. 
ooo Connection Opened 
==> Executing: insert into CustomItem (id, column2, column3, column4, column5, column6) values (?, ?, ?, ?, ?, ?) 
==> Parameters: null, null, null, null, null, actual_value_of_extra(String) 
xxx Connection Closed 
Returned connection 368716606 to pool. 

後跟SQL異常(無法在id列中輸入null)。

所以正確傳入的唯一值是額外提供的字符串。我已驗證字段名稱是否正確,並且此時對象不爲空,且字段已正確填充。

我也嘗試使用parameterType="CustomItem"而不是parameterType="map",但結果並沒有改變。

如果有人能讓我知道我在這裏失蹤,我將不勝感激。

在此先感謝。 PS:我也遇到了與插入語句相同的問題。

回答

5

您需要在映射器方法中指定其他參數的名稱。我假設CustomItem是一個Java bean,併爲field1等獲取方法。如前所述,更改您的參數類型,以便它不是Map。

從MyBatis的documentation

您可以將多個參數傳遞給一個映射器的方法。如果你這樣做,他們 默認情況下將按其在參數列表中的位置命名,例如: 示例:#{1},#{2}等。如果您想更改 參數的名稱(僅限多個)那麼你可以在參數上使用@Param(「paramName」) 註釋。

因此,改變你的映射,

public interface CustomItemMapper 
{ 
    Integer insert(@Param("item")CustomItem item, @Param("extra") String someparam); 
} 

,改變你的XML,

<insert id="insert" useGeneratedKeys="false" parameterType="map" keyProperty="id"> 
    insert into CustomItem (id, column2, column3, column4, column5, column6) 
     values (#{id}, #{item.field1}, #{item.field2}, #{item.field3}, #{item.field4}, #{extra}) 
    </insert> 
+0

非常感謝!我已經看過手冊中的這一部分,並想到了界面的變化。我無法想到的是第二部分(即xml中'item'的表示)。 – alokoko

+0

np,它是OGNL。在用戶指南中搜索動態SQL以獲取更多信息。 – Andy

0

如果您傳遞的CustomItem一個實例爲update()呼叫,則parameterType絕對應該是類的完全合格的名稱,而不是"map" - 你只會如果你傳遞一個java.util.Map到使用後者insert()方法。

+0

手冊(第25頁)說參數類型要麼是一個完全合格的名稱或別名。我嘗試了兩個「map」(因爲這是多個參數傳遞給'select'語句的方式),而別名的結果是相同的。爲了消除任何疑問,我剛纔嘗試了完全合格的名字,沒有任何改變。 – alokoko