1

也许我遗漏了一些明显的东西,但我无法成功执行简单的映射插入语句。

使用以下界面

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:我也遇到了与插入语句相同的问题。

4

2 回答 2

5

您需要在映射器方法中指定其他参数的名称。我假设 CustomItem 是一个 Java bean,具有 field1 的 get 方法等。如前所述,更改您的参数类型,使其不是 Map。

从 mybatis文档中,

您可以将多个参数传递给映射器方法。如果这样做,默认情况下它们将按照它们在参数列表中的位置命名,例如:#{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>
于 2011-10-05T20:59:35.487 回答
0

如果您将一个实例传递CustomItemupdate()调用中,那么parameterType绝对应该是类的完全限定名称,而不是"map"- 只有当您将 a 传递java.util.Mapinsert()方法时,您才会使用后者。

于 2011-10-05T20:51:19.480 回答