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

发布于 2021-11-15 04:35:23 字数 1609 浏览 833 评论 3

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

落墨 2021-11-19 09:39:53

这个跟resultMap差不多,只是还不能解决我上述的麻烦

你曾走过我的故事 2021-11-19 07:35:39

自己顶下

夜无邪 2021-11-15 23:23:50

莫非mybatis这么冷门 ╮(╯▽╰)╭

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文