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

用<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的某一个字段值,则后果严重

举报
xmut
发帖于6年前 3回/4K+阅
顶部