使用Mybatis解决N+1问题时的烦恼??

xmut 发布于 2012/11/23 15:46
阅读 4K+
收藏 2

用<resultMap>标签可以解决复杂查询时的对象映射问题,比如查询一个用户User时也返回其所属部门Department,对应的查询SQL:

select a.user_id,
       a.user_no,
       a.user_name,
       a.user_passwd,
       b.dept_id,
       b.dept_name,
       b.dept_parentId
  from users a, department b
 where a.dept_id=b.dept_id
对应的Mapper映射如下:
<resultMap type="User" id="userResultMap">
	<id property="id" column="user_id" />
	<result property="no" column="user_no" />
	<result property="name" column="user_name" />
	<result property="passwd" column="user_passwd" />
	<association property="dept" column="dept_id" javaType="Department">
	  <id property="id" column="dept_id" />
	  <result property="name" column="dept_name" />
          <result property="fullName" column="dept_fullName" />
	  <result property="parentID" column="dept_parent_id" />
	</association>
</resultMap>
【问题】

  有很多对象都引用到部门department,比如出库单、入库单、退库单等等。这样每个对象的Mapper中都要写很长的SQL语句,而且有时候可能会漏掉department的某个字段。

① 考虑使用SQL视图解决,不过如果往department添加删除某一个字段,仍然要检查所有           引用它的视图。

② 直接在标签<association>中使用属性select="xxx.departmentMapper.baseResultMap",这样department字段变动时,只要修改departmentMapper.xml即可,又担心出现“N+1”的问题!

PS:个人喜好直接通过dept = findByUserId(id).getDepartment(),然后再通过setter()对dept进行赋值,最后update(dept),这样如果以上查询User时漏掉了department的某一个字段值,则后果严重

加载中
0
xmut
xmut
莫非mybatis这么冷门 ╮(╯▽╰)╭
0
xmut
xmut
自己顶下
0
fantasy
fantasy
Mybatis除了可以用 resultMap标签映射,还可以用resultClass,你只需要创建一个java的 bean,属性名字和你查询的字段名一致,就可以自动帮你映射,也没有resultMap这么麻烦,需要每个字段都要存在。方便可靠。
xmut
xmut
这个跟resultMap差不多,只是还不能解决我上述的麻烦
返回顶部
顶部