mybatis级联查询

Posted 第三眼的思绪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis级联查询相关的知识,希望对你有一定的参考价值。

用户表:

CREATE TABLE `sys_user` (
  `userid` varchar(50) NOT NULL,
  `roleid` int(11) NOT NULL,
  `username` varchar(50) DEFAULT NULL COMMENT '用户名',
  `password` varchar(50) NOT NULL,
  `sex` tinyint(6) DEFAULT NULL COMMENT '性别',
  `idcard` varchar(50) DEFAULT NULL COMMENT '身份证号',
  `phone` varchar(20) DEFAULT NULL COMMENT '联系方式',
  `email` varchar(320) DEFAULT NULL COMMENT '邮箱',
  `islocked` tinyint(4) DEFAULT NULL COMMENT '是否锁定。0表示锁定,1表示未锁定。',
  `remark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

角色表:

CREATE TABLE `sys_role` (
  `roleid` int(11) NOT NULL AUTO_INCREMENT,
  `rolename` varchar(20) DEFAULT NULL COMMENT '角色名',
  `remark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`roleid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

资源菜单表:

CREATE TABLE `sys_menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `text` varchar(50) NOT NULL COMMENT '菜单名',
  `icon` varchar(255) DEFAULT NULL COMMENT '菜单图标',
  `url` varchar(255) DEFAULT NULL COMMENT '模块地址',
  `level` int(11) NOT NULL COMMENT '菜单等级',
  `parentid` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;

角色与资源菜单关系表:

CREATE TABLE `role_menu` (
  `roleid` int(11) NOT NULL,
  `menuid` int(11) NOT NULL,
  `authz` tinyint(4) DEFAULT 0 COMMENT '操作权限类型,0表示all,1表示C,2表示U,3表示R,4表示D。但此方法保存其操作权限位运算',
  PRIMARY KEY (`roleid`,`menuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1、一对多

此例子中可以为通过角色查找用户,也可以通过父级菜单查找子孙级子菜单(自身级联)。
菜单查找中的自身级联查询:

<resultMap id="BaseResultMenu" type="java.util.Map" >
  <id column="id" property="id" jdbcType="INTEGER" />
  <result column="text" property="text" jdbcType="VARCHAR" />
  <result column="icon" property="icon" jdbcType="VARCHAR" />
  <result column="url" property="url" jdbcType="VARCHAR" />
  <result column="level" property="icon" jdbcType="INTEGER" />
  <result column="parentid" property="parentid" jdbcType="INTEGER" />
  <collection property="children" ofType="java.util.Map" column="id" select="selRoleMenu"/>
</resultMap>

<select id="selMenu" resultMap="BaseResultMenu" parameterType="java.util.Map">
	select
	id,text,icon,parentid,level,url
	from sys_menu sm where parentid=#id,javaType=INTEGER
</select>

通过用户类型查找用户的一对多级联查询:

<resultMap id="BaseResultMap" type="com.xxx.model.UserType" >
	<id column="utid" property="utid" jdbcType="INTEGER" />
	<result column="utname" property="utname" jdbcType="VARCHAR" />
	<!-- 新增,用作级联查询。适用于多对多级联查询或多对一的一方级联查询(PS:一是特殊的多)。这里的column="utid"值对应查询参数 -->
	<collection property="users" column="utid" select="selectUsers" ></collection>
</resultMap>

<!-- 新增,辅助级联查询 -->
<resultMap id="userResultMap" type="com.xxx.model.UserInfo" >
	<id column="usid" property="usid" jdbcType="INTEGER" />
	<result column="usname" property="usname" jdbcType="VARCHAR" />
	<result column="sex" property="sex" jdbcType="INTEGER" />
	<result column="age" property="age" jdbcType="INTEGER" />
	<result column="remark" property="remark" jdbcType="VARCHAR" />
</resultMap>

<sql id="Base_Column_List" >
	utid, utname
</sql>

<sql id="user_Column_List" ><!-- 级联辅助新增 -->
	usid, utid, usname, sex, age, remark
</sql>

<!-- 级联查询新增方法 -->
<select id="selectUsers" resultMap="userResultMap">
	select
	<include refid="user_Column_List"/>
	from UserInfo where utid=#utid
</select>

<select id="select" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
	select 
	<include refid="Base_Column_List" />
	from usertype
	where utid = #utid,jdbcType=INTEGER
</select>

以上是关于mybatis级联查询的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis 级联查询 (一对多 )

java,mybatis 一对多级联查询,怎么给多的一方添加条件啊???

Mybatis + mysql 实现两级级联的查询

MyBatis之级联小结

mybatis 级联查询

mybatis级联查询