我决定尝试将 mybatis 用于一个新项目。我对 SQL 相当熟悉,最近我在使用 hibernate 时遇到了一些不好的经历,所以我正在寻找一种更底层的 DAO 方法。
除了一件事,这似乎是相当不错的,那就是处理集合。
我有两个 POJO,组和用户,它们是多对多的。我已经决定了一种设计理念,即具有集合的 POJO 应该只在保存时更新表之间的 MM 关系。因此,例如,当我保存一个包含用户集合的组对象时,设计理念规定用户应该已经保存,我只需将组和 group_user 关系保存在数据库中。
所以,对于界面中的 saveGroup 函数,我为 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>
这确实按预期工作(插入/更新组,将用户集合保存为数据库中的关系)。但我真的不觉得这是最佳实践。应用程序是为了让我可以在需要时切换到休眠状态,所以保存集合的逻辑最好在数据库层中。mybatis中是否有一些我不知道的“魔法”可以简化这样的操作?
关于如何改善这一点的任何想法?还是我应该重新考虑应用程序设计并将集合的处理放在模型中的更高级?