一、使用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关联查询之一对多,多对一,以及多对多相关推荐

  1. MyBatis关联查询、多条件查询

    MyBatis关联查询.多条件查询 1.一对一查询 任务需求; 根据班级的信息查询出教师的相关信息 1.数据库表的设计 班级表: 教师表: 2.实体类的设计 班级表: public class Cla ...

  2. MyBatis基础:MyBatis关联查询(4)

    1. MyBatis关联查询简介 MyBatis中级联分为3中:association.collection及discriminator. ◊ association:一对一关联 ◊ collecti ...

  3. Mybatis多表关联查询(一对多关联查询)

    1.Mybatis一级缓存与二级缓存 目的:提高查询效率,降低数据库查询压力,提升系统整体性能. 一级缓存:默认开启,Session级别,同一个会话内生效. 命中缓存的情况:statementid.S ...

  4. Mybatis 关联查询(一对一与一对多)

    数据库表与表之间的关系: 1.一对一查询 需求:查询所有订单信息,关联查询下单用户信息. 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询.如果从用户信息 ...

  5. Mybatis关联查询的两种方式

    首先要了解对象的三种关联方式 *数据库表的关联关系有三种,一对一,一对多,多对多 一对一   是通过在任意一方的主键,引入对方主键作为外键来实现的,就是说主键与外键为同一字段 一对多   是通过在&q ...

  6. 6、数据库表的关系、Java对象的关系、关联查询(一对多)、延迟加载访问

    文章目录 关联查询.多表 数据库表关系 Java对象之间的关系 前提条件 一对多 单向关联 延迟加载 双向关联 延迟加载 延迟加载中传递多个参数 关联查询.多表 数据库表关系 表->约束(主键约 ...

  7. mybatis关联查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  8. mybatis 关联查询 延迟加载

    就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. 好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能 坏处:因为只有当需要用到数据时,才会进行数据库查 ...

  9. java mybtis关联查询,7.MyBatis 关联查询(一对一)

    1 关联查询映射 1.1 分析数据模型 思路 :每张表记录的数据内容 每张表重要的字段(主键,外键,非空字段) 表与表之间的关系(外键关系) 表与表之间的业务关系(建立在某个业务意义基础上去分析) 如 ...

最新文章

  1. 学了编译原理能否用 Java 写一个编译器或解释器?
  2. usaco Calf Flac(O(n)时间求回文串长度)
  3. 企业数智化转型与分析流程自动化(APA)
  4. json数据解析详解---代码每行进行分析
  5. 【NLP】文本分类综述 (上)
  6. Vue安装live-server
  7. 驱动框架3——初步分析led驱动框架源码
  8. java中for的增强用法,Java中增强for循环的用法
  9. 小米12后壳谍照曝光:后置三摄相机模组 采用大眼瞪小眼设计
  10. 树莓派服务器证书,【原创】在树莓派3上给Nginx部署免费HTTPS证书
  11. 设计模式在各编程语言类库及框架上的应用
  12. 教你一招最屌的阅读开源项目的姿势
  13. c语言指针详解pdf下载,C语言指针详解.pdf
  14. ios备忘录下载安卓版_ios8备忘录app软件下载
  15. 一文详解自动驾驶技术与挑战
  16. MySQL中临时表(TEMPORARY)
  17. 精益创业实战 - 第8章 针对解决方案做客户访谈
  18. 智能家居控制系统制作技术_智能家居控制系统是什么_智能家居控制系统的由来-装修攻略...
  19. Poco库完全使用手册
  20. win8连接wifi成功但受限制_用于 手机热点或WIFI网络的IM143DTU使用手册

热门文章

  1. mysql rac_MySQL Galera集群和ORACLE RAC的实现原理比较
  2. vue引入id3_使用决策树ID3算法,预测收入是否大于50k
  3. honeywell新风系统控制面板说明_详解装了新风系统,怎么清洗维护简单?
  4. 农村70后、80后、90后的儿时玩具有哪些?
  5. 我是个初二学生,想考一中,现在该怎么努力?
  6. 怎样做到“不说服客户,只拒绝客户”?
  7. 老板必须亲自抓销售,公司越小越如此
  8. 想建出优质的社群,必须懂得社群的本质
  9. Vue:开发者友好性和易用性
  10. 数据结构题及c语言版答案周桂红版,数据结构习题与答案.pdf