2011-10-05 57 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