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多表关联的更多相关文章

  1. 三、mybatis多表关联查询和分布查询

    前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...

  2. JAVA入门[9]-mybatis多表关联查询

    概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...

  3. mybatis多表关联查询之resultMap单个对象

    resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...

  4. MyBatis 多表关联查询

    多表关联查询 一对多 单条SQL实现. //根据部门编号查询出部门和部门成员姓名public dept selectAll() thorws Excatipon; //接口的抽象方法 下面是对应接口的 ...

  5. Mybatis多表关联查询字段值覆盖问题

    一.错误展示 1.首先向大家展示多表关联查询的返回结果集 <resultMap id="specialdayAndWorktimeMap type="com.hierway. ...

  6. 5.mybatis一对一表关联查询

    方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集,封装联表查询的数据(去除重复的数据)  SELECT * FROM class c,teacher t WHERE c.tid = t.t ...

  7. spring boot 2使用Mybatis多表关联查询

    模拟业务关系:一个用户user有对应的一个公司company,每个用户有多个账户account. spring boot 2的环境搭建见上文:spring boot 2整合mybatis 一.mysq ...

  8. mybatis association表关联与rowbounds共同使用时的异常及其解决方案

    按照mybatis手册中所说的,association有两种实现方式,嵌套查询和嵌套结果映射.如手册中所述,select方式会带来N+1次查询的问题,考虑到效率问题的话建议使用嵌套结果映射.但是在结合 ...

  9. mybatis多表关联配置

    首先需要的jar包 mybatis-3.4.1 配置文件(mybatis.cfg.xml) <?xml version="1.0" encoding="UTF-8& ...

随机推荐

  1. PythonStudy——名称空间 Name space

    # 名称空间:就是名字与地址的对应关系,可以被Python解释器遍历查找,采用堆栈存储方式 # 三种名称空间# Built-in:内置名称空间:系统级,一个:随解释器执行而产生,解释器停止而销毁# G ...

  2. What’s New In GRANDstack?

    转自:https://blog.grandstack.io/whats-new-in-grandstack-310c067fea4a There’s been a lot of activity in ...

  3. idc市场

    机房 idc服务商 ============================== 电信1.古城热线-西部数据中心于2001年正式投入运营,有经济技术开发区和高新技术产业开发区两个核心机房高新路电信广场 ...

  4. maya中的顶点平滑算法(vertex smooth algorithm)

    继上文继续写.有了顶点迭代器之后就可以利用MItMeshVertex类的getConnectedVertices方法来获取相连点并代入平滑算法. 选择什么样的平滑算法呢?本人比较懒,直接打开了计算机图 ...

  5. Unix/Linux进程间通信

    一,Linux下进程间通信的几种主要手段简介: 1,管道(Pipe)及有名管道(named pipe) 管道可用于具有亲缘关系进程间的通信 有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功 ...

  6. forward reference前向引用,gloal values and local values全局变量和局部变量,recursive function递归函数

    1.全局变量与局部变量练习 1 # -*- coding: UTF-8 -*- 2 def bar(): 3 print('from bar') 4 def foo(): 5 print('from ...

  7. Linux进程被杀掉(OOM killer),查看系统日志

    基本概念: Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉. ...

  8. Python的socket

    第一部分socket的简单示例 服务器部分: """ Description: Author:Nod Date: Record: #------------------- ...

  9. 如何判断win10 和office的版本

    1:区分win10的版本 2:查询office 的版本

  10. centos 7 安装sql 审核工具 inception + archer

    系统环境: Centos7 + python2.7 + python3 .... 下载 源码地址:https://github.com/mysql-inception/inception Incept ...