使用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的某一个字段值,则后果严重
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这个跟resultMap差不多,只是还不能解决我上述的麻烦
自己顶下
莫非mybatis这么冷门 ╮(╯▽╰)╭