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)
    </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>

原文地址:https://www.cnblogs.com/roy-blog/p/9025616.html

时间: 2024-10-16 21:56:47

mybatis多表关联的相关文章

mybatis多表关联查询

mybatis多表关联查询 一:在一个对象(User )中建立另一个对象属性(userExtend): public class User implements Serializable{ private static final long serialVersionUID = 1L; /** ID */ private String id; /** 用户名 */ private String username; /** 登录密码 */ private String password; /**

Mybatis处理表关联(懒加载)

1.关系型数据库? 数据库中的表对象之间是有关系的. 一对一,一对多,多对多. ORM映射.数据库表映射到实体对象. 实体与实体之间是有关系的. 一对多的关系. 比如商品分类表与商品表之间的关系,就是一对多的关系. 入库主表与入库子表之间的关系,也是一对多的关系. 出库主表与出库子表之间的关系,也是一对多的关系. ID编号  教师编号   课程编号   其余字段  (外键的都是多的关系) 1        001 2        001 很明显的就是在多的这个表里会出现1的这个表里的字段. 2

5.mybatis一对一表关联查询

方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集,封装联表查询的数据(去除重复的数据)  SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id} 方式二:嵌套查询,通过执行另外一个SQL 映射语句来返回预期的复杂类型  SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}  SELECT t.tid id, t.tname

mybatis的表关联查询,多个参数关联查询

在网上很多mybatis的关联查询资料,但是要用主表的多个条件查子表的资料少之又少,今天刚好用到了,就分享下给大家,多条件的写法.(主要是注意红色字体代码) 实体类: public class PhotoFeedback implements Serializable { private int id; private String name; private int userId; //用户id private List<PhotoFeedbackPic>  listPic; } photo

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

按照mybatis手册中所说的,association有两种实现方式,嵌套查询和嵌套结果映射.如手册中所述,select方式会带来N+1次查询的问题,考虑到效率问题的话建议使用嵌套结果映射.但是在结合使用rowbounds进行分页的时候嵌套结果映射会报Mapped Statements with nested result mapping cannot be safely constrained by rowbounds异常.经过测试发现是rowbounds和resultmap-associat

mybatis 处理多表关联

MyBatis的核心是其映射文件,SqlMap文件,里面配置了项目中用到了什么SQL语句,和数据库相关的逻辑都在这个映射文件里.顾名思义,映射文件就是对Java对象和SQL的映射.这里简单介绍一下映射文件中resultMap的用法:resultMap – 它描述如何将结果集映射到Java对象.resultMap属性:type为java实体类:id为此resultMap的标识:<resultMap id="BaseResultMap" type="com.test.myb

Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询

在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以及MyBatis的分页问题. 首先先看看项目的架构,方便后边叙述. 这个项目中是一个Sping+MyBatis的完整demo(这边将页面没有展示.)这次的主题主要是后台数据处理逻辑.接下来为大家逐一介绍各个文件, org.config   Spring配置包括数据库的链接信息 org.control

Hello Mybatis 03 数据关联

ResultMap 在实际的开发中,数据库不总是我们希望看到的样子.比如我们希望User的主键是id但是数据库偏偏喜欢叫它u_id,这样一来原先的resultType似乎就失效了,不带这么玩的,整个人都不好了. 于是mybatis给出了他的方案--resultMap.把我们从复杂的命名问题中解救出来--- 在上一篇中已经用mybatis generator生成好了一个BlogMapper.xml.现在让我们分析下这个文件. 1 <?xml version="1.0" encodi

mybatis单表操作实现完全java代码封装

之前在项目中用到mybtis操作数据库时都是手动写sql,对于我这种sql水平不是很好地人来说痛苦死了:动态查询的sql我表示到现在还不会写呀! 还好,利用数据库表反向生成的工具可以帮我解决大部分的sql;(mybatis generator 你懂的) 首先利用反向生成可以帮我们自动生成实体类,dao接口,dao映射文件: 在dao映射文件如下所示: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE