MyBatis的多对多映射(十)中

简介: MyBatis的多对多映射(十)上

三. 员工到角色的一对多的嵌套select 查询


UserMapper.java 接口:


public User getByIdWithSelect(int id);


RoleMapper.java 接口:


public List<Role> findRoleByUserId(@Param(value="userId") int userId);


UserMapper.xml sql语句:


<resultMap type="user" id="userResultMapWithSelect">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="sex" column="sex"/>
    <result property="age" column="age"/>
    <result property="description" column="description"/>
    <collection property="roles" ofType="role" column="id"
    select="com.yjl.mapper.RoleMapper.findRoleByUserId"></collection>
  </resultMap>
<!-- 嵌套select -->
  <select id="getByIdWithSelect" parameterType="int" resultMap="userResultMapWithSelect">
    select * from user where id=#{id}
  </select>


RoleMapper.xml 中sql语句:


<resultMap type="role" id="roleResultMap">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
  </resultMap>
<select id="findRoleByUserId" parameterType="int" resultMap="roleResultMap">
    select r.* from user_role t,role r where t.roleId=r.id and t.userId=#{userId}
  </select>


测试方法:


@Test
  public void getByIdWithSelectTest(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    //查询该员工所具有的角色
    User user=userMapper.getByIdWithSelect(1);
    System.out.println(user);
    List<Role> roleList=user.getRoles();
    roleList.forEach(n ->System.out.println(n));
  }


20190711085413883.png


四. user 到role 的嵌套结果 查询


UserMapper.java 接口


public User getByIdWithResult(int id);


UserMapper.xml sql


<resultMap type="user" id="userResultMapWithResult">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="sex" column="sex"/>
    <result property="age" column="age"/>
    <result property="description" column="description"/>
    <collection property="roles" javaType="ArrayList" ofType="role">
      <id property="id" column="rid"/>
      <result property="name" column="rname"/>
    </collection>
  </resultMap>
<!-- 用具体的语句,而不是 * 这样的。 -->
  <select id="getByIdWithResult" parameterType="int" resultMap="userResultMapWithResult">
    select u.*,r.id as rId,r.name as rname from user u,role r ,user_role ur where u.id=ur.userId and r.id=ur.roleId
    and ur.userId=#{id}
  </select>


测试方法:


@Test
  public void getByIdWithResultTest(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=userMapper.getByIdWithResult(1);
    System.out.println(user);
    List<Role> roleList=user.getRoles();
    roleList.forEach(n ->System.out.println(n));
  }


2019071108544132.png


可以发现,多对多实际上就是两个一对多的关系。 完全按照一对多的模式进行做。


但是一般,员工和角色表时不但会有userId,roleId, 还常常会有 created_by,created_time, 即创建人和创建时间等字段,这个时候就不能用上面的方式, 需要引入另外一个实体 UserRole 实体, 转换成两个一对多的关系, User与UserRole 是一对多的关系,Role 与UserRole 也是一对多的关系。


五. UserRolee 实体类的两个一对多关联


User 表 和Role 表,保持不变。


对UserRole 表,添加两个字段。


20190711085451369.png


那么User.java 实体类就改变成了:


package com.yjl.pojo;
import java.util.List;
/**
 @author:yuejl
 @date: 2019年6月15日 上午11:11:02
 @Description Mybatis 使用的基本类 User
*/
public class User {
  /**
   * @param id id编号,自增
   * @param name 姓名
   * @param age 年龄
   * @param sex 性别
   * @param description 描述
   */
  private Integer id;
  private String name;
  private Integer age;
  private String sex;
  private String description;
  //引入员工角色的多个对象集合。。
  private List<UserRole> userRole;
  public User(){
  }
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Integer getAge() {
    return age;
  }
  public void setAge(Integer age) {
    this.age = age;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
  public String getDescription() {
    return description;
  }
  public void setDescription(String description) {
    this.description = description;
  }
  public List<UserRole> getUserRole() {
    return userRole;
  }
  public void setUserRole(List<UserRole> userRole) {
    this.userRole = userRole;
  }
  @Override
  public String toString() {
    return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + ", description=" + description
        + "]";
  }
}


其中的 Role.java 变成了:


package com.yjl.pojo;
import java.util.List;
/**
 @author:两个蝴蝶飞
 @date: 2019年3月2日 下午6:18:51
 @Description 角色组
*/
public class Role {
  /**
   * @param id 角色编号
   * @param name 用户的名称
   */
  private Integer id;
  private String name;
  public Role() {
  }
  public Role(String name) {
    this.name = name;
  }
  /**
   * @param userRole 用户角色实体   是一对多的关系
   */
  private List<UserRole> userRole;
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public List<UserRole> getUserRole() {
    return userRole;
  }
  public void setUserRole(List<UserRole> userRole) {
    this.userRole = userRole;
  }
  @Override
  public String toString() {
    return "Role [id=" + id + ", name=" + name + "]";
  }
}


新增加一个UserRole.java 类:


package com.yjl.pojo;
import java.util.Date;
/**
@atuhor:yuejl
@Description: 类描述
*/
public class UserRole {
  private User user;
  private Role role;
  private String created_by;
  private Date created_date;
  public User getUser() {
    return user;
  }
  public void setUser(User user) {
    this.user = user;
  }
  public Role getRole() {
    return role;
  }
  public void setRole(Role role) {
    this.role = role;
  }
  public String getCreated_by() {
    return created_by;
  }
  public void setCreated_by(String created_by) {
    this.created_by = created_by;
  }
  public Date getCreated_date() {
    return created_date;
  }
  public void setCreated_date(Date created_date) {
    this.created_date = created_date;
  }
  @Override
  public String toString() {
    return "UserRole [user=" + user + ", role=" + role + ", created_by=" + created_by + ", created_date="
        + created_date.toLocaleString() + "]";
  }
}



相关文章
|
10天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
2月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
4月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
89 3
|
5月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
71 3
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
|
6月前
|
SQL Java 数据库连接
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
|
6月前
|
算法 BI 数据库
MyBatisPlus查询条件设置、映射匹配兼容性、id生成策略、多数据操作
MyBatisPlus查询条件设置、映射匹配兼容性、id生成策略、多数据操作
366 3
|
6月前
|
SQL Java 数据库连接
15:MyBatis对象关系与映射结构-Java Spring
15:MyBatis对象关系与映射结构-Java Spring
107 4
|
6月前
|
XML Java 数据库连接
java对象有集合mybatis如何映射
java对象有集合mybatis如何映射
49 4
|
6月前
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)