私はmybatisを新しいプロジェクトに使用しようと決めました。私はまさにSQLに精通しており、私は最近、休止状態でいくつかの悪い経験をしてきましたので、私はDAOへのより低レベルのアプローチを探しています。mybatisでコレクションを保存/更新するのは一般的な方法ですか?
1つのこと以外はすごくいいと思われます。それはコレクションを処理しています。
私は多対多である2つのPOJO、グループとユーザーを持っています。コレクションを持つPOJOは、保存するときにテーブル間のM-M関係を更新するだけでよいという設計哲学を決めました。たとえば、ユーザーの集まりを持つグループオブジェクトを保存する場合、設計思想ではユーザーは既に保存されている必要があり、グループとgroup_userの関係をデータベースに保存するだけで済みます。
ので、インタフェースのセーブグループ機能のために、私はMyBatisのために、このXMLマッピングを行った。
<insert id="saveGroup" keyColumn="id"
parameterType="se.myapp.domain.Group">
<choose>
<when test="id == null">
INSERT INTO myapp_group (name, description)
VALUES
(#{username}, #{password});
</when>
<otherwise>
UPDATE myapp_group set name=#{name}, description=#{description}
where id=#{id};
</otherwise>
</choose>
<if test="users != null">
create temporary table tmpnewgroups (group_id integer, user_id integer);
insert into tmpnewgroups (group_id, user_id) values (
<foreach collection="users" item="user" open="" close="" separator="),()">
#{id},#{user.id}
</foreach>
);
insert into myapp_user_group(group_id, user_id)
select tmp.group_id, tmp.user_id
from tmpnewgroups tmp
left outer join myapp_user_group ug
on ug.group_id = tmp.group_id and ug.user_id = tmp.user_id
where ug.group_id is null;
delete from myapp_user_group
where group_id = #{id} and user_id not in (select user_id from tmpnewgroups);
</if>
</insert>
意図したとおりこれは、仕事をする(挿入/グループを更新し、関係として、ユーザーのコレクションを保存しますデータベース内で)。しかし、私はこれがベストプラクティスだとは思わない。必要に応じて休止状態に切り替えることができるようにアプリケーションが作られているので、コレクションを保存するためのロジックはデータベースレイヤーにあることが望ましいです。私が気付いていないマイバティスには、このような業務を合理化できるいくつかの「魔法」がありますか?
これを改善する方法についてのご意見はありますか?または、アプリケーションの設計を再考し、モデルのコレクションの処理をさらにモデル化する必要がありますか?
「」とその「」を使用して多くの関係を記述すると問題がありましたか? –
Gus
よくある結果マップは、データを取得するためのもので、データを保存するものではありません。コレクションを入手することは問題ありません。私は煩わしいことが分かっています。 – Dytut
[MyBatis Generator](https://code.google.com/p/mybatis/wiki/Generator)を使用してみましたか?それはあなたのための基本的なCRUD操作を生成します。複雑な結合などを書くだけで済むように、大量の手作業でコード化されたSQLを保存します。DAOで生成されたコードを使用して、 DAOへのあなたのXML。 – clav