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.

idその後に SQL 例外が続きます (列に null を入力することはできません)。

したがって、適切に渡された唯一の値は、追加で提供された文字列です。この時点で、フィールド名が正しく、オブジェクトが null ではなく、フィールドが適切に入力されていることを確認しました。

parameterType="CustomItem"の代わりにも使ってみparameterType="map"ましたが結果は変わりませんでした。

ここで何が欠けているのか誰かが教えてくれれば幸いです。

前もって感謝します。

PS:insert ステートメントでも同じ問題が発生します。

4

2 に答える 2

5

マッパー メソッドで他のパラメーターの名前を指定する必要があります。CustomItem は、field1 などの get メソッドを備えた Java Bean であると想定しています。

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

CustomItemのインスタンスをupdate()呼び出しに渡す場合、parameterType絶対にクラスの完全修飾名にする必要があります。メソッドに aを"map"渡す場合にのみ、後者を使用します。java.util.Mapinsert()

于 2011-10-05T20:51:19.480 に答える