MyBatis的多对多映射(十)下

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

六. 员工去查询角色


UserMapper.java 的接口:


public User getUserRoleById(int id);


UserMapper.xml sql语句:


<resultMap type="user" id="userResultMapWithUserRole">
    <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"/>
    <!--引入集合为userRole的集合-->
    <collection property="userRole" javaType="ArrayList" ofType="userRole"
    column="id" select="com.yjl.mapper.UserRoleMapper.findByUserId">
    </collection>
  </resultMap>
  <select id="getUserRoleById" parameterType="int" resultMap="userResultMapWithUserRole">
    select * from user where id=#{id}
  </select>


UserRoleMapper.java 的接口为:


package com.yjl.mapper;
import org.apache.ibatis.annotations.Param;
import com.yjl.pojo.UserRole;
/**
@atuhor:yuejl
@Description: 类描述
*/
public interface UserRoleMapper {
  public UserRole findByUserId(@Param(value="userId") int userId);
}


UserRoleMapper.xml 文件为:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yjl.mapper.UserRoleMapper">
  <resultMap type="userRole" id="userRoleMap">
    <result property="created_by" column="created_by" javaType="string"/>
    <result property="created_date" column="created_date" javaType="date"/>
    <!-- 关联一下,相应的角色信息,为一对一的形式 -->
    <association property="role" javaType="role" column="roleId"
    select="com.yjl.mapper.RoleMapper.findById"></association>
  </resultMap>
  <select id="findByUserId" parameterType="int" resultMap="userRoleMap">
    select t.* from user_role t where t.userId=#{userId}
  </select>
</mapper>


RoleMapper.java 的接口为:


public Role findById(int id);


RoleMapper.xml 的sql语句为:


<resultMap type="role" id="roleResultMap">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
</resultMap>
<select id="findById" parameterType="int" resultMap="roleResultMap">
    select * from role t where t.id=#{id}
  </select>


测试方法:


@Test
  public void getUserRoleByIdTest(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    //查询该员工所具有的角色
    User user=userMapper.getUserRoleById(1);
    List<UserRole> roleList=user.getUserRole();
    System.out.println(user);
    for (UserRole userRole : roleList) {
      System.out.println("输出创建人:"+userRole.getCreated_by());
      System.out.println("输出创建日期:"+userRole.getCreated_date());
      Role role=userRole.getRole();
      System.out.println(role);
    }
  }


2019071108550975.png


这是员工找角色的,也可以角色去找员工。 与上面的思路差不多,就不讲解了。 当然,也有对应的result 的形式。


UserMapper.java 接口:


public User getUserRoleByIdWithResult(int id);


UserMapper.xml sql语句:


<resultMap type="user" id="userResultMapWithUserRoleResult">
    <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="userRole" ofType="userRole" javaType="arrayList">
      <result property="created_by" column="created_by" javaType="string"/>
      <result property="created_date" column="created_date" javaType="date"/>
      <!-- 对角色的一对一 -->
      <association property="role" javaType="role">
        <id property="id" column="rId" javaType="int"/>
        <result property="name" column="rName" javaType="string"/>
      </association>
    </collection>
  </resultMap>
<select id="getUserRoleByIdWithResult" parameterType="int" resultMap="userResultMapWithUserRoleResult">
    select u.id as id,u.name as name,u.sex as sex,u.age as age,u.description as description,
    ur.created_by as created_by,ur.created_date as created_date,
    r.id as rId,r.name as rName,
    ur.userId as userId,ur.roleId as roleId from user u,role r,user_role ur where u.id=ur.userId and r.id=ur.roleId
    and u.id=#{id}
  </select>


测试方法:


@Test
  public void getUserRoleByIdWithResultTest(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    //查询该员工所具有的角色
    User user=userMapper.getUserRoleByIdWithResult(1);
    List<UserRole> roleList=user.getUserRole();
    System.out.println(user);
    System.out.println("长度是:"+roleList.size());
    for (UserRole userRole : roleList) {
      System.out.println("输出创建人:"+userRole.getCreated_by());
      System.out.println("输出创建日期:"+userRole.getCreated_date());
      Role role=userRole.getRole();
      System.out.println(role);
    }
  }


查询的时候,会发现只查询出一条数据。


20190711085530314.png


显示的是查询出3条,为什么只显示一条呢? 查了很多资料,最后发现可能跟数据有关。 user 表中的数据是一样的,给处理成了一条,那么 userrole 表中的数据也是一样的,也可以被处理成了一条。 故改变userrole 表中的数据。


20190711085541884.png


这个时候,运行为:


20190711085552329.png


将userrole 中的数据再次改变,使其中有相同的。


20190711085559841.png


再次运行为:


20190711085608781.png


故可知,与数据是否相同有很大的关系。 如果实例化的数据都一样,MyBatis会将其当成一个对象,不会再重新初始化。


谢谢!!!

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