一般多表查询的三种方式
程序员文章站
2024-03-15 17:07:18
...
1.发起多次单表查询
例如:
//基于用户id查询对应的角色以及角色对应的菜单id,发起多次单表查询
@Override
public SysRoleMenu findById(Integer id) {
//1.参数校验
//2.查询角色自身信息
SysRoleMenu roleMenu=sysRoleDao.findById(id);
//3.查询角色对应的菜单信息并封装
List<Integer> menuIds=sysRoleMenuDao.findMenuIdsByRoleId(id);
roleMenu.setMenuIds(menuIds);
return roleMenu;
}
2.多表关联查询
例如:
@Override
public SysRoleMenu findById(Integer id) {
//1.参数校验
//2.基于角色id查询角色以及角色对应菜单id,并返回查询结果
SysRoleMenu roleMenu=sysRoleDao.findById(id);
return roleMenu;
}
<!--多表关联查询映射(one2many使用collection) ,一个用户对应多个菜单-->
<resultMap id="sysRoleMenu" type="com.cy.pj.sys.pojo.SysRoleMenu">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="note" column="note"/>
<collection property="menuIds" ofType="integer">
<result column="menu_id"/>
</collection>
</resultMap>
<select id="findById" resultMap="sysRoleMenu">
select r.id,r.name,r.note,rm.menu_id
from sys_roles r left join sys_role_menus rm
on r.id=rm.role_id
where r.id=#{id}
</select>
3.多表嵌套查询
@Override
public SysRoleMenu findById(Integer id) {
//1.参数校验
//2.基于角色id查询角色以及角色对应菜单id,并返回查询结果
SysRoleMenu roleMenu=sysRoleDao.findById(id);
return roleMenu;
}
基于用户id查询多个角色id来作为菜单表的查询条件进行菜单id的查询
<!--resultMap是mybatis框架中实现高级映射的一种方式,
几乎所有的多表关联,嵌套查询都会使用resultMap做映射,
当然,当单表数据查询时假如表中字段名与pojo中的属性或set方法不匹配
也可以借助ResultMap做自定义映射-->
<!--表关联嵌套 一个用户对应多个菜单,基于用户id查询的多个角色id作为菜单表的查询条件进行菜单id的查询-->
<resultMap id="sysRoleMenu" type="com.cy.pj.sys.pojo.SysRoleMenu">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="note" column="note"/>
<collection property="menuIds"
column="id"
select="com.cy.pj.sys.dao.SysRoleMenuDao.findMenuIdsByRoleId"/>
</resultMap>
<select id="findById" resultMap="sysRoleMenu">
select id,name,note
from sys_roles
where id=#{id}
</select>
上一篇: 泛型一般有三种使用方式