mybatis多表关联
1.比如我有两个一个是菜单表t_menu,一个是权限表t_jurisdiction.表结构如下:


2.我想要将这两个表关联,查询特定的role_id下的菜单情况,这也是我们经常用在权限管理系统中的做法,将角色与菜单关联起来。大概的sql语句如下
select t1.menu_id as menuId,t1.p_menu_id as pMenuId, t1.menu_name as menuName,ifnull(t2.jurisdiction_id,0) as jurisdictionId from t_menu t1 left join (select jurisdiction_id,menu_id from t_jurisdiction where role_id=1)t2 on t1.menu_id=t2.menu_Id
该查询会出现类似如下的结果。

其中jurisdictionId为0表示该用户还没选中这个菜单作为它的权限。
3.在mybatis中实现
首先,我们定义一个包含了上述字段的resultMap,将它的类型设为java.util.Map,如下所示:
<!-- 包含了菜单信息的权限列表 -->
<resultMap id="ResultMapIncludeJurisdiction" type="java.util.Map">
<id column="menu_id" property="menuId" jdbcType="INTEGER" />
<result column="p_menu_id" property="pMenuId" jdbcType="INTEGER" />
<result column="menu_name" property="menuName" jdbcType="VARCHAR" />
<result column="jurisdiction_id" property="jurisdictionId" jdbcType="INTEGER" />
</resultMap>
然后,定义一个sql语句变量,如下
<sql id="Column_List_include_jurisdiction">
t1.menu_id, t1.p_menu_id ,t1.menu_name,ifnull(t2.jurisdiction_id,0) as jurisdiction_id
</sql>
接下来就是查询语句
<!-- 通过 roleId获取其菜单列表,并标明是否有选中某项菜单-->
<select id="selectJurisdictionByRoleId" parameterType="java.lang.Integer" resultMap="ResultMapIncludeJurisdiction">
select
<include refid="Column_List_include_jurisdiction" />
from t_menu t1 left join (select jurisdiction_id,menu_id from t_jurisdiction where role_id=#{roleId,jdbcType=INTEGER}) t2 on t1.menu_id=t2.menu_id
</select>
然后在Service层调用这个查询语句就可以了
@Service
public class JurisdictionService {
@Resource(name="baseDao")
private BaseDao<TJurisdiction,Integer>baseDao;
public List<Map<String,Object>>getJurisdictionByRoleId(int roleId){
return baseDao.findMapListByPm("TJurisdictionMapper.selectJurisdictionByRoleId", roleId);
}
public static void main(String args[]){
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
JurisdictionService jurisdictionService=(JurisdictionService) ctx.getBean("jurisdictionService");
System.out.println(jurisdictionService.getJurisdictionByRoleId(1));
}
}
上述的main方法是用于测试的,测试结果符合我们的需要,关于baseDao的编写,可参考博客其他文章。
<sql id="Column_List_include_jurisdiction">
t1.menu_id, t1.p_menu_id,t1.menu_name,ifnull(t2.jurisdiction_id,0)
</sql>
mybatis多表关联的更多相关文章
- 三、mybatis多表关联查询和分布查询
前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...
- JAVA入门[9]-mybatis多表关联查询
概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...
- mybatis多表关联查询之resultMap单个对象
resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...
- MyBatis 多表关联查询
多表关联查询 一对多 单条SQL实现. //根据部门编号查询出部门和部门成员姓名public dept selectAll() thorws Excatipon; //接口的抽象方法 下面是对应接口的 ...
- Mybatis多表关联查询字段值覆盖问题
一.错误展示 1.首先向大家展示多表关联查询的返回结果集 <resultMap id="specialdayAndWorktimeMap type="com.hierway. ...
- 5.mybatis一对一表关联查询
方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集,封装联表查询的数据(去除重复的数据) SELECT * FROM class c,teacher t WHERE c.tid = t.t ...
- spring boot 2使用Mybatis多表关联查询
模拟业务关系:一个用户user有对应的一个公司company,每个用户有多个账户account. spring boot 2的环境搭建见上文:spring boot 2整合mybatis 一.mysq ...
- mybatis association表关联与rowbounds共同使用时的异常及其解决方案
按照mybatis手册中所说的,association有两种实现方式,嵌套查询和嵌套结果映射.如手册中所述,select方式会带来N+1次查询的问题,考虑到效率问题的话建议使用嵌套结果映射.但是在结合 ...
- mybatis多表关联配置
首先需要的jar包 mybatis-3.4.1 配置文件(mybatis.cfg.xml) <?xml version="1.0" encoding="UTF-8& ...
随机推荐
- 将文件夹下的所有csv文件存入数据库
# 股票的多因子分层回测代码实现 import os import pymysql # import datetime, time # from config import * database_ta ...
- WebForm AnyWay
项目地址 : https://github.com/kelin-xycs/WebFormAnyWay WebForm AnyWay 用 WebForm 构建 简洁高效 的 Web 应用 WebFor ...
- LOJ 3059 「HNOI2019」序列——贪心与前后缀的思路+线段树上二分
题目:https://loj.ac/problem/3059 一段 A 选一个 B 的话, B 是这段 A 的平均值.因为 \( \sum (A_i-B)^2 = \sum A_i^2 - 2*B \ ...
- Excel技巧--巧用差异化插入空行
假设有上面这一列,要求在不同城市之间插入一空行相隔开.数据少的时候可以手动操作,但数据量大时,就需要以下技巧: 1.复制该列(除去标题),并粘贴到右侧一列,但上方要隔开一个单元格B2: 2.将这两列选 ...
- 单源最短路径算法——Dijkstra算法(迪杰斯特拉算法)
一 综述 Dijkstra算法(迪杰斯特拉算法)主要是用于求解有向图中单源最短路径问题.其本质是基于贪心策略的(具体见下文).其基本原理如下: (1)初始化:集合vertex_set初始为{sourc ...
- Python【每日一问】04
问:a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],求出列表a中所有奇数并构造新列表 答: 利用列表的元素下标遍历列表 a = [1, 2, 3, 4, 5, 6, 7, 8 ...
- [UE4]CheckBox
一.CheckBox默认情况下是比较小的 二.要让CheckBox变大,最简单的方法就是直接设置Transform.Scale,但如此一来CheckBox就变得模糊了. 三.CheckBox控件是在C ...
- [UE4]Scale Box:缩放容器
一.Scale Box只能有一个子控件,再拖放一控件进去是不行的. 二.Scale Box缩放保持长宽比例 三. Scale Box.Strectching.Strectch:拉伸设置. Scale ...
- CSS的background
.block{ width: 200px; height: 200px; padding: 25px; background-image:linear-gradient(#58a,#58a) ,lin ...
- vmdk转qcow2格式
关闭vm 多文件格式转换成单文件格式vmdk 进入cmd命令行模式的窗口 进入VMware workstations的安装路径下 vmware-vdiskmanager.exe -r "E: ...