mybatis关联查询之一对多,多对一,以及多对多
一、使用IDEA新建maven工程
二、引入mybatis以及相关的jar
<!--版本仅供参考--><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.44</version></dependency></dependencies>
三、建表
权限管理需求的介绍,一个用户拥有若干角色,一个角色拥有若干权限,权限就是对某个资源的增删改查,这样就构成了用户-角色-权限之间的模型,在这种关系中,用户与角色,角色与权限之间一般是多对多的关系
建表sql:
create table sys_user(id int not null auto_increment comment '用户ID',user_name varchar(32) comment '用户名',password varchar(50) comment '用户密码',usr_info varchar(50) comment '用户简介',head_img blob comment '头像',create_time datetime comment '创建时间',primary key(id) ); alter table sys_user comment '用户表';create table sys_role(id int not null auto_increment comment '角色ID',role_name varchar(50) comment '角色名称',enabled int comment '有效标志',create_by bigint comment '创建人',create_time datetime comment '创建时间',primary key(id) ); alter table sys_role comment '角色表';create table sys_privilege(id int not null auto_increment comment '权限ID',privilege_name varchar(50) comment '权限名称',privilege_url varchar(50) comment '权限URL',primary key(id) ); alter table sys_privilege comment '权限表';create table sys_user_role(user_id bigint not null comment '用户ID',role_id bigint not null comment '角色ID' ); alter table sys_user comment '用户角色'; create table sys_role_privilege(role_id bigint not null comment '角色ID',privilege_id bigint not null comment '权限ID' ); alter table sys_role_privilege comment '角色权限表';
给表添加外键
-- 给用户角色表的user_id添加外键 alter table sys_user_role add constraint fk_uru foreign key(user_id) references sys_user(id); -- 给用户角色表的role_id 添加外键 alter table sys_user_role add constraint fk_sysrur foreign key(role_id) references sys_role(id); -- 给角色权限表的role_id添加外键 alter table sys_role_privilege add constraint fk_sysrpp foreign key(privilege_id) references sys_privilege(id); -- 给角权限的privilege_id 添加外键 alter table sys_role_privilege add constraint fk_sysrpr foreign key(role_id) references sys_role(role_id);
插入数据
insert into sys_user(user_name,password,user_info,head_img,create_time )values('Jordan','123','管理员',null,'2018-1-22 12:02:01'), ('Alice','456','测试人员',null,'2018-1-22 12:02:01'), ('Alex','789','开发人员',null,'2018-1-22 12:02:01'), ('James','012','运维人员',null,'2018-1-22 12:02:01') insert into sys_user_role(role_name,enabled,create_by,create_time) values('管理员',1,'1','2018-01-02'),values('普通用户',1,'1','2018-01-02'); insert into sys_privilege(privilege_name,privilege_url) values('用户管理','/users'),('角色管理','/roles'),('系统维护','/system'),('日志管理','/logs'); insert into sys_user_role values(1,1),(2,2),(3,2),(4,2); insert into sys_role_privilege values(1,1),(2,3),(2,4);
四、使用逆向工程生成entity以及mapper接口和mapper文件
①:创建mybatis-config.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><package name="com.jordan.mybatis.entity"></package></typeAliases><environments default="defaultEnv"><environment id="defaultEnv"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="username" value="root"></property><property name="password" value="123456"></property><property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property><property name="driver" value="com.mysql.jdbc.Driver"></property></dataSource></environment></environments><mappers><package name="com.jordan.mybatis.mapper"></package></mappers> </configuration>
②:SysUser.java
package com.jordan.mybatis.entity;import java.util.Arrays; import java.util.Date; import java.util.List;public class SysUser {private Long id;private String userName;private String password;private Date createTime;private String userInfo;private byte[] headImg;private SysRole sysRole;private List<SysRole> sysRoleList;public List<SysRole> getSysRoleList() {return sysRoleList;}public void setSysRoleList(List<SysRole> sysRoleList) {this.sysRoleList = sysRoleList;}public SysRole getSysRole() {return sysRole;}public void setSysRole(SysRole sysRole) {this.sysRole = sysRole;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName == null ? null : userName.trim();}public String getPassword() {return password;}public void setPassword(String password) {this.password = password == null ? null : password.trim();}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public String getUserInfo() {return userInfo;}public void setUserInfo(String userInfo) {this.userInfo = userInfo == null ? null : userInfo.trim();}public byte[] getHeadImg() {return headImg;}public void setHeadImg(byte[] headImg) {this.headImg = headImg;}@Overridepublic String toString() {return "SysUser{" +"id=" + id +", userName='" + userName + '\'' +", password='" + password + '\'' +", createTime=" + createTime +", userInfo='" + userInfo + '\'' +", headImg=" + Arrays.toString(headImg) +", sysRole=" + sysRole +", sysRoleList=" + sysRoleList +'}';} }
View Code
③:SysRole.java
package com.jordan.mybatis.entity;import java.util.Arrays; import java.util.Date; import java.util.List;public class SysUser {private Long id;private String userName;private String password;private Date createTime;private String userInfo;private byte[] headImg;private SysRole sysRole;private List<SysRole> sysRoleList;public List<SysRole> getSysRoleList() {return sysRoleList;}public void setSysRoleList(List<SysRole> sysRoleList) {this.sysRoleList = sysRoleList;}public SysRole getSysRole() {return sysRole;}public void setSysRole(SysRole sysRole) {this.sysRole = sysRole;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName == null ? null : userName.trim();}public String getPassword() {return password;}public void setPassword(String password) {this.password = password == null ? null : password.trim();}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public String getUserInfo() {return userInfo;}public void setUserInfo(String userInfo) {this.userInfo = userInfo == null ? null : userInfo.trim();}public byte[] getHeadImg() {return headImg;}public void setHeadImg(byte[] headImg) {this.headImg = headImg;}@Overridepublic String toString() {return "SysUser{" +"id=" + id +", userName='" + userName + '\'' +", password='" + password + '\'' +", createTime=" + createTime +", userInfo='" + userInfo + '\'' +", headImg=" + Arrays.toString(headImg) +", sysRole=" + sysRole +", sysRoleList=" + sysRoleList +'}';} }
View Code
④:SysPrivilege.java
package com.jordan.mybatis.entity;public class SysPrivilege {private Long id;private String privilegeName;private String privilegeUrl;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getPrivilegeName() {return privilegeName;}public void setPrivilegeName(String privilegeName) {this.privilegeName = privilegeName == null ? null : privilegeName.trim();}public String getPrivilegeUrl() {return privilegeUrl;}public void setPrivilegeUrl(String privilegeUrl) {this.privilegeUrl = privilegeUrl == null ? null : privilegeUrl.trim();}@Overridepublic String toString() {return "SysPrivilege{" +"id=" + id +", privilegeName='" + privilegeName + '\'' +", privilegeUrl='" + privilegeUrl + '\'' +'}';} }
View Code
⑤:SysUserMapper
public interface SysUserMapper {public List<SysUser> getUserRolePrivilege(); }
⑥:SysUserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.jordan.mybatis.mapper.SysUserMapper"><resultMap id="getUserRolePrivilege" type="SysUser"><id property="id" column="id"></id><result property="userName" column="user_name"></result><result property="password" column="password"></result><result property="userInfo" column="user_info"></result><result property="createTime" column="create_time"></result><collection property="sysRoleList" ofType="SysRole"><id property="id" column="id"></id><result property="roleName" column="role_name"></result><result property="createTime" column="create_time"></result><collection property="sysPrivilegeList" ofType="SysPrivilege"><id property="id" column="id"></id><result property="privilegeName" column="privilege_name"></result><result property="privilegeUrl" column="privilege_url"></result></collection></collection></resultMap><select id="getUserRolePrivilege" resultMap="getUserRolePrivilege">select a.id,a.user_name,a.password,a.user_info,b.role_name,b.create_time,c.privilege_name,c.privilege_url from sys_user a,sys_role b,sys_privilege c,sys_user_role d,sys_role_privilege e where a.id = d.user_id and b.id = d.role_id and e.role_id=b.id and e.privilege_id=c.id</select> </mapper>
五、在mybatis-config.xml中添加mapper接口以及mapper文件
<mappers><package name="com.jordan.mybatis.mapper"></package> </mappers>
六、创建测试类Test.java
import com.jordan.mybatis.mapper.SysUserMapper; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before;import java.io.IOException; import java.io.InputStream; import java.io.Reader;/*** @author Jordan* @create * @DESCRIPTION*/ public class Test {private SqlSessionFactory sqlSessionFactory;@Beforepublic void init() throws IOException{//1:读取mybatis的主配置文件String configFile = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(configFile);//2:通过sqlSessionFactoryBuilder创建一个sqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@org.junit.Testpublic void testGetUserRolePrivilege(){SqlSession sqlSession=sqlSessionFactory.openSession();SysUserMapper sysUserMapper=sqlSession.getMapper(SysUserMapper.class);System.out.println(sysUserMapper.getUserRolePrivilege().size()); //4 查询结果与数据库查询结果不匹配,发生数据覆盖问题,解决办法参考注意事项② sqlSession.close();} }
七、注意事项:
①:idea找不到mapper文件的原因:IDEA不会编译src的java目录下的xml文件。所以添加如下代码
<resources><!-- resources文件 --><resource><directory>src/main/resources</directory><!-- 是否被过滤,如果被过滤则无法使用 --><filtering>false</filtering></resource><!-- java文件夹 --><resource><directory>src/main/java</directory><!-- 引入映射文件等 --><includes><include>**/*.xml</include><include>**/*.properties</include></includes></resource><resource><directory>src/main/webapp</directory><includes><include>**/*.*</include></includes></resource></resources>
②:mybatis在映射依赖的过程中,如果两个表中的主键是一样的会发生数据覆盖问题。
解决办法:
解决方式一:修改数据库表中的主键(这种方法比较麻烦);
解决方式二:在查询语句中修改一个表的主键使其不一致即可;
上述代码测试结果中与数据库中的查询记录不匹配
数据库查询结果为8条记录,但是mybatis查询只有4条数据,发生数据覆盖的问题;
修改SysUserMapper.xml文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.jordan.mybatis.mapper.SysUserMapper"><resultMap id="getUserRolePrivilege" type="SysUser"><id property="id" column="aid"></id><result property="userName" column="user_name"></result><result property="password" column="password"></result><result property="userInfo" column="user_info"></result><result property="createTime" column="create_time"></result><collection property="sysRoleList" ofType="SysRole"><id property="id" column="bid"></id><result property="roleName" column="role_name"></result><result property="createTime" column="create_time"></result><collection property="sysPrivilegeList" ofType="SysPrivilege"><id property="id" column="cid"></id><result property="privilegeName" column="privilege_name"></result><result property="privilegeUrl" column="privilege_url"></result></collection></collection></resultMap><select id="getUserRolePrivilege" resultMap="getUserRolePrivilege">select a.id,a.user_name,a.password,a.user_info,b.role_name,b.create_time,c.privilege_name,c.privilege_url from sys_user a,sys_role b,sys_privilege c,sys_user_role d,sys_role_privilege e where a.id = d.user_id and b.id = d.role_id and e.role_id=b.id and e.privilege_id=c.id</select> </mapper>
转载于:https://www.cnblogs.com/crazylover/p/10568289.html
mybatis关联查询之一对多,多对一,以及多对多相关推荐
- MyBatis关联查询、多条件查询
MyBatis关联查询.多条件查询 1.一对一查询 任务需求; 根据班级的信息查询出教师的相关信息 1.数据库表的设计 班级表: 教师表: 2.实体类的设计 班级表: public class Cla ...
- MyBatis基础:MyBatis关联查询(4)
1. MyBatis关联查询简介 MyBatis中级联分为3中:association.collection及discriminator. ◊ association:一对一关联 ◊ collecti ...
- Mybatis多表关联查询(一对多关联查询)
1.Mybatis一级缓存与二级缓存 目的:提高查询效率,降低数据库查询压力,提升系统整体性能. 一级缓存:默认开启,Session级别,同一个会话内生效. 命中缓存的情况:statementid.S ...
- Mybatis 关联查询(一对一与一对多)
数据库表与表之间的关系: 1.一对一查询 需求:查询所有订单信息,关联查询下单用户信息. 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询.如果从用户信息 ...
- Mybatis关联查询的两种方式
首先要了解对象的三种关联方式 *数据库表的关联关系有三种,一对一,一对多,多对多 一对一 是通过在任意一方的主键,引入对方主键作为外键来实现的,就是说主键与外键为同一字段 一对多 是通过在&q ...
- 6、数据库表的关系、Java对象的关系、关联查询(一对多)、延迟加载访问
文章目录 关联查询.多表 数据库表关系 Java对象之间的关系 前提条件 一对多 单向关联 延迟加载 双向关联 延迟加载 延迟加载中传递多个参数 关联查询.多表 数据库表关系 表->约束(主键约 ...
- mybatis关联查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- mybatis 关联查询 延迟加载
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. 好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能 坏处:因为只有当需要用到数据时,才会进行数据库查 ...
- java mybtis关联查询,7.MyBatis 关联查询(一对一)
1 关联查询映射 1.1 分析数据模型 思路 :每张表记录的数据内容 每张表重要的字段(主键,外键,非空字段) 表与表之间的关系(外键关系) 表与表之间的业务关系(建立在某个业务意义基础上去分析) 如 ...
最新文章
- 学了编译原理能否用 Java 写一个编译器或解释器?
- usaco Calf Flac(O(n)时间求回文串长度)
- 企业数智化转型与分析流程自动化(APA)
- json数据解析详解---代码每行进行分析
- 【NLP】文本分类综述 (上)
- Vue安装live-server
- 驱动框架3——初步分析led驱动框架源码
- java中for的增强用法,Java中增强for循环的用法
- 小米12后壳谍照曝光:后置三摄相机模组 采用大眼瞪小眼设计
- 树莓派服务器证书,【原创】在树莓派3上给Nginx部署免费HTTPS证书
- 设计模式在各编程语言类库及框架上的应用
- 教你一招最屌的阅读开源项目的姿势
- c语言指针详解pdf下载,C语言指针详解.pdf
- ios备忘录下载安卓版_ios8备忘录app软件下载
- 一文详解自动驾驶技术与挑战
- MySQL中临时表(TEMPORARY)
- 精益创业实战 - 第8章 针对解决方案做客户访谈
- 智能家居控制系统制作技术_智能家居控制系统是什么_智能家居控制系统的由来-装修攻略...
- Poco库完全使用手册
- win8连接wifi成功但受限制_用于 手机热点或WIFI网络的IM143DTU使用手册
热门文章
- mysql rac_MySQL Galera集群和ORACLE RAC的实现原理比较
- vue引入id3_使用决策树ID3算法,预测收入是否大于50k
- honeywell新风系统控制面板说明_详解装了新风系统,怎么清洗维护简单?
- 农村70后、80后、90后的儿时玩具有哪些?
- 我是个初二学生,想考一中,现在该怎么努力?
- 怎样做到“不说服客户,只拒绝客户”?
- 老板必须亲自抓销售,公司越小越如此
- 想建出优质的社群,必须懂得社群的本质
- Vue:开发者友好性和易用性
- 数据结构题及c语言版答案周桂红版,数据结构习题与答案.pdf