MyBatis-20MyBatis高级结果映射【一对一映射(4种方式)】

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: MyBatis-20MyBatis高级结果映射【一对一映射(4种方式)】

概述


我们还是继续使用我们的RBAC权限系统来演示。

假设在RBAC权限系统中,一个用户只能拥有一个角色。


需求


实现在查询用户信息的同时获取用户拥有的角色信息


方式一:使用自动映射处理一对一映射

实体类改造

一个用户拥有一个角色,因此现在SysUser类中增加SysRole字段

/**
 * 
 * 
 * @ClassName: SysUser
 * 
 * @Description: 用户表
 * 
 * @author: Mr.Yang
 * 
 * @date: 2018年4月13日 下午9:24:21
 */
public class SysUser  {
  //其他原有字段以及setter getter
  /**
   * 用户角色
   */
  private SysRole sysRole;
  // setter getter
  public SysRole getSysRole() {
    return sysRole;
  }
  public void setSysRole(SysRole sysRole) {
    this.sysRole = sysRole;
  }
}


使用自动映射就是通过别名让MyBatis自动将值匹配到对应的子弹上,简单的别名映射如user_name 对应userName .


除此之外MyBatis还支持复杂的属性映射,可以多层嵌套。 比如将role.role_name 映射到 role.roleName上。 MyBatis首先会查找role属性,如果存在role属性就创建role对象,然后在role对象中继续查找roleName, 将role_name的值绑定到role对象的roleName属性上 。


UserMapper接口增加接口方法

/**
   * 
   * 
   * @Title: selectSysUserAndSysRoleById
   * 
   * @Description: 根据Id查询用户信息的同时获取用户拥有的角色信息
   * 
   * @param id
   * @return
   * 
   * @return: SysUser
   */
  SysUser selectSysUserAndSysRoleById(Long id);



UserMapper.xml增加SQL

<select id="selectSysUserAndSysRoleById" resultType="com.artisan.mybatis.xml.domain.SysUser">
    SELECT
      u.id,
      u.user_name userName,
      u.user_password userPassword,
      u.user_email userEmail,
      u.user_info userInfo,
      u.create_time createTime,
      u.head_img headImg,
      r.id "sysRole.id",
      r.role_name "sysRole.roleName",
      r.enabled "sysRole.enabled",
      r.create_by "sysRole.createBy",
      r.create_time "sysRole.createTime"
    FROM
      sys_user u
    INNER JOIN sys_user_role ur ON u.id = ur.user_id
    INNER JOIN sys_role r ON ur.role_id = r.id
    WHERE
      u.id = #{id}
  </select>



注意上述SQL中 sys_role查询的列的别名都是 “sysRole.”前缀,这和SysUser实体类中SysRole属性的名称保持一致,通过这种方式将sysRole的属性都映射到了SysUser的sysRole属性上


单元测试

@Test
  public void selectSysUserAndSysRoleByIdTest() {
    logger.info("selectSysUserAndSysRoleByIdTest");
    // 获取SqlSession
    SqlSession sqlSession = getSqlSession();
    try {
      // 获取UserMapper接口
      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
      // 注意:数据库中id=1的用户拥有2个角色,不适合这个例子。
      // 调用selectSysUserAndSysRoleById方法,查询id=1001的用户及其角色
      SysUser sysUser = userMapper.selectSysUserAndSysRoleById(1001L);
      // 期望用户不为空
      Assert.assertNotNull(sysUser);
      // 期望角色不为空
      Assert.assertNotNull(sysUser.getSysRole());
      logger.info(sysUser);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      sqlSession.close();
      logger.info("sqlSession close successfully ");
    }
  }


debug调测下数据

20180430114456918.png


日志

2018-04-29 23:43:15,905  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-29 23:43:15,913  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-29 23:43:15,918  INFO [main] (UserMapperTest.java:1007) - selectSysUserAndSysRoleByIdTest
2018-04-29 23:43:16,008 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: SELECT u.id, u.user_name userName, u.user_password userPassword, u.user_email userEmail, u.user_info userInfo, u.create_time createTime, u.head_img headImg, r.id "sysRole.id", r.role_name "sysRole.roleName", r.enabled "sysRole.enabled", r.create_by "sysRole.createBy", r.create_time "sysRole.createTime" FROM sys_user u INNER JOIN sys_user_role ur ON u.id = ur.user_id INNER JOIN sys_role r ON ur.role_id = r.id WHERE u.id = ? 
2018-04-29 23:43:16,135 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1001(Long)
2018-04-29 23:43:16,196 TRACE [main] (BaseJdbcLogger.java:151) - <==    Columns: id, userName, userPassword, userEmail, userInfo, createTime, headImg, sysRole.id, sysRole.roleName, sysRole.enabled, sysRole.createBy, sysRole.createTime
2018-04-29 23:43:16,198 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 1001, artisan, 123456, test@artisan.com, <<BLOB>>, 2018-04-13 21:12:47.0, <<BLOB>>, 2, 普通用户, 1, 1, 2018-04-13 21:12:46.0
2018-04-29 23:43:16,215 DEBUG [main] (BaseJdbcLogger.java:145) - <==      Total: 1
2018-04-29 23:43:16,216  INFO [main] (UserMapperTest.java:1021) - SysUser [id=1001, userName=artisan, userPassword=123456, userEmail=test@artisan.com, userInfo=测试用户, headImg=[18, 49, 35, 18, 48], createTime=Fri Apr 13 21:12:47 BOT 2018, sysRole=SysRole [id=2, roleName=普通用户, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null]]
2018-04-29 23:43:16,222  INFO [main] (UserMapperTest.java:1026) - sqlSession close successfully 


通过SQL日志可以看到已经查询出的一条数据,MyBatis将这条数据映射到了两个类中,像这种通过一次查询将结果映射到不同对象的方式,称之为关联的嵌套结果查询。


关联的嵌套结果映射需要关联多个表将所有需要的值一次性查询出来, 这种方式的好处是减少数据库的查询次数,减轻数据库的压力。 缺点是需要些很复杂的SQL,并且当嵌套结果更负载时,不容易一次写正确。 由于要在服务器上将结果映射到不同的类上,因此也会增加应用服务器的压力。 当一定会使用到嵌套查询,并且整个复杂的SQL执行速度很快时,建议使用关联的其那套结果查询。


方式二:使用resultMap配置一对一映射

UserMapper接口增加接口方法


// 使用resultMap配置一对一映射
SysUser selectSysUserAndSysRoleById2(Long id);


UserMapper.xml增加SQL

<!-- 使用resultMap配置一对一映射 -->
  <resultMap id="userRoleMap" 
         type="com.artisan.mybatis.xml.domain.SysUser">
    <id column="id" property="id" />
    <result property="userName" column="user_name" />
    <result property="userPassword" column="user_password" />
    <result property="userEmail" column="user_email" />
    <result property="userInfo" column="user_info" />
    <result property="headImg" column="head_img" jdbcType="BLOB" />
    <result property="createTime" column="create_time" jdbcType="TIMESTAMP" />
    <!-- sysRole相关的属性 -->
    <result property="sysRole.id" column="role_id"/>
    <result property="sysRole.roleName" column="role_name"/>
    <result property="sysRole.enabled" column="enabled"/>
    <result property="sysRole.createBy" column="create_by"/>
    <result property="sysRole.createTime" column="role_create_time" jdbcType="TIMESTAMP"/>
  </resultMap>


这种配置和上一个配置相似的地方在于,sysRole中的property配置部分使用“sysRole.”前缀,在column部分,为了避免不同表中存在相同的的字段,所有可能重名的列都加了 “role_”前缀。


这种方式配置的时候,还需要再查询时设置不同的列名,别名和resultMap配置的colunm一致。 然后使用resultMap配置映射。

<!-- 使用resultMap配置一对一映射 -->
  <select id="selectSysUserAndSysRoleById2" resultMap="userRoleMap">
    SELECT
      u.id,
      u.user_name ,
      u.user_password ,
      u.user_email ,
      u.user_info ,
      u.create_time ,
      u.head_img ,
      r.id role_id,
      r.role_name ,
      r.enabled ,
      r.create_by ,
      r.create_time role_create_time 
    FROM
      sys_user u
    INNER JOIN sys_user_role ur ON u.id = ur.user_id
    INNER JOIN sys_role r ON ur.role_id = r.id
    WHERE
      u.id = #{id}
  </select>


单元测试

@Test
  public void selectSysUserAndSysRoleById2Test() {
    logger.info("selectSysUserAndSysRoleById2Test");
    // 获取SqlSession
    SqlSession sqlSession = getSqlSession();
    try {
      // 获取UserMapper接口
      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
      // 注意:数据库中id=1的用户拥有2个角色,不适合这个例子。
      // 调用selectSysUserAndSysRoleById方法,查询id=1001的用户及其角色
      SysUser sysUser = userMapper.selectSysUserAndSysRoleById2(1001L);
      // 期望用户不为空
      Assert.assertNotNull(sysUser);
      // 期望角色不为空
      Assert.assertNotNull(sysUser.getSysRole());
      logger.info(sysUser);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      sqlSession.close();
      logger.info("sqlSession close successfully ");
    }
  }

日志

2018-04-30 00:52:25,287  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-30 00:52:25,291  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-30 00:52:25,295  INFO [main] (UserMapperTest.java:1032) - selectSysUserAndSysRoleById2Test
2018-04-30 00:52:25,390 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: SELECT u.id, u.user_name , u.user_password , u.user_email , u.user_info , u.create_time , u.head_img , r.id role_id, r.role_name , r.enabled , r.create_by , r.create_time role_create_time FROM sys_user u INNER JOIN sys_user_role ur ON u.id = ur.user_id INNER JOIN sys_role r ON ur.role_id = r.id WHERE u.id = ? 
2018-04-30 00:52:25,519 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1001(Long)
2018-04-30 00:52:25,559 TRACE [main] (BaseJdbcLogger.java:151) - <==    Columns: id, user_name, user_password, user_email, user_info, create_time, head_img, role_id, role_name, enabled, create_by, role_create_time
2018-04-30 00:52:25,561 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 1001, artisan, 123456, test@artisan.com, <<BLOB>>, 2018-04-13 21:12:47.0, <<BLOB>>, 2, 普通用户, 1, 1, 2018-04-13 21:12:46.0
2018-04-30 00:52:25,572 DEBUG [main] (BaseJdbcLogger.java:145) - <==      Total: 1
2018-04-30 00:52:25,573  INFO [main] (UserMapperTest.java:1046) - SysUser [id=1001, userName=artisan, userPassword=123456, userEmail=test@artisan.com, userInfo=测试用户, headImg=[18, 49, 35, 18, 48], createTime=Fri Apr 13 21:12:47 BOT 2018, sysRole=SysRole [id=2, roleName=普通用户, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null]]
2018-04-30 00:52:25,580  INFO [main] (UserMapperTest.java:1051) - sqlSession close successfully 


这种方法是不是和第一种使用自动映射处理一对一映射相比起来,resultMap相当麻烦?

事实上 ,resultMap映射是可以被继承的,因此要先简化上面的resultMap的配置。 因为我们这个映射文件中本来就存在一个userMap的映射配置,改造如下

<!-- 使用resultMap配置一对一映射  继承原有的resultMap -->
  <resultMap id="userRoleMap_byExtends"  extends="userMap"
         type="com.artisan.mybatis.xml.domain.SysUser">
    <!-- sysRole相关的属性 -->
    <result property="sysRole.id" column="role_id"/>
    <result property="sysRole.roleName" column="role_name"/>
    <result property="sysRole.enabled" column="enabled"/>
    <result property="sysRole.createBy" column="create_by"/>
    <result property="sysRole.createTime" column="role_create_time" jdbcType="TIMESTAMP"/>
  </resultMap>


使用继承不仅可以简化配置,而且当对主表userMap进行修改时也只需要修改一处。 虽然还不是太方便,至少简洁了一点。 要想更加简洁,只有派上asscociation了,请往下看

测试过了,就不贴代码了,github上已经托管。


方式三:使用resultMap的asscociation标签配置一对一映射


在resultMap中,association标签用于和一个复杂的类型进行关联,即用于一对一的关联配置。


UserMapper接口增加接口方法

// 使用resultMap配置一对一映射 resultMap association
SysUser selectSysUserAndSysRoleById4(Long id);


UserMapper.xml增加SQL

在上面的基础上,再做修改,改成association标签的配置方式。

  <!-- 使用resultMap配置一对一映射  使用association -->
  <resultMap id="userRoleMap_byExtendsAndAssociation"  extends="userMap"
         type="com.artisan.mybatis.xml.domain.SysUser">
    <association property="sysRole" columnPrefix="sysRole_"
      javaType="com.artisan.mybatis.xml.domain.SysRole">
      <result property="id" column="id"/>
      <result property="roleName" column="role_name"/>
      <result property="enabled" column="enabled"/>
      <result property="createBy" column="create_by"/>
      <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
    </association>     
  </resultMap>
<!-- 使用resultMap配置一对一映射 result中Map中使用association  -->
  <select id="selectSysUserAndSysRoleById4" resultMap="userRoleMap_byExtendsAndAssociation">
    SELECT
      u.id,
      u.user_name ,
      u.user_password ,
      u.user_email ,
      u.user_info ,
      u.create_time ,
      u.head_img ,
      r.id sysRole_id,
      r.role_name sysRole_role_name,
      r.enabled sysRole_enabled,
      r.create_by sysRole_create_by,
      r.create_time sysRole_create_time
    FROM
      sys_user u
    INNER JOIN sys_user_role ur ON u.id = ur.user_id
    INNER JOIN sys_role r ON ur.role_id = r.id
    WHERE
      u.id = #{id}
  </select>


association标签包含如下主要属性

  • property:对应实体列中的属性名,必填
  • javaType:属性对应的Java类型
  • resultMap:可以直接使用现有的resultMap,从而不需要在这里配置
  • colunmPrefix: 查询列的前缀,配置前缀后,在子标签配置result的colunm时,可以省略前缀
  • 其他属性,略…


因为配置了列的前缀,因此还需要SQL,如上所示。

使用association配置还可以使用resultMap属性配置成一个已经存在的resultMap映射。 我们吧sys_role相关的映射提取出来,改造如下

  <!-- 使用resultMap配置一对一映射  使用association -->
  <resultMap id="roleMap"  type="com.artisan.mybatis.xml.domain.SysRole" >
    <id  property="id" column="id"/>
    <result property="roleName" column="role_name"/>
    <result property="enabled" column="enabled"/>
    <result property="createBy" column="create_by"/>
    <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
  </resultMap>
  <resultMap id="userRoleMap_byExtendsAndAssociation_ResultMap"  extends="userMap"
         type="com.artisan.mybatis.xml.domain.SysUser">
    <association property="sysRole" columnPrefix="sysRole_"
      javaType="com.artisan.mybatis.xml.domain.SysRole" resultMap="roleMap">
    </association>     
  </resultMap>

到这里,是不是没有这么麻烦了? 还有一个需要注意的地方:roleMap我们目前是写在UserMapper.xml中,更合理的应该在RoleMapper.xml中。如果真的在RoleMapper.xml中的话,,通过resultMap来引用的话,就必须要加上命名空间了。 如果不加的话,MyBatis会默认添加调用者当前命名空间的前缀。

<resultMap id="userRoleMap_byExtendsAndAssociation_ResultMap"  extends="userMap"
         type="com.artisan.mybatis.xml.domain.SysUser">
    <association property="sysRole" columnPrefix="sysRole_"
      javaType="com.artisan.mybatis.xml.domain.SysRole" resultMap="com.artisan.mybatis.xml.mapper.RoleMapper.roleMap">
    </association>     
  </resultMap>


单元测试

@Test
  public void selectSysUserAndSysRoleById4Test() {
    logger.info("selectSysUserAndSysRoleById4Test");
    // 获取SqlSession
    SqlSession sqlSession = getSqlSession();
    try {
      // 获取UserMapper接口
      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
      // 注意:数据库中id=1的用户拥有2个角色,不适合这个例子。
      // 调用selectSysUserAndSysRoleById4方法,查询id=1001的用户及其角色
      SysUser sysUser = userMapper.selectSysUserAndSysRoleById4(1001L);
      // 期望用户不为空
      Assert.assertNotNull(sysUser);
      // 期望角色不为空
      Assert.assertNotNull(sysUser.getSysRole());
      logger.info(sysUser);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      sqlSession.close();
      logger.info("sqlSession close successfully ");
    }
  }


日志

2018-05-01 01:08:18,898  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-05-01 01:08:18,905  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-05-01 01:08:18,913  INFO [main] (UserMapperTest.java:1083) - selectSysUserAndSysRoleById4Test
2018-05-01 01:08:19,019 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: SELECT u.id, u.user_name , u.user_password , u.user_email , u.user_info , u.create_time , u.head_img , r.id sysRole_id, r.role_name sysRole_role_name, r.enabled sysRole_enabled, r.create_by sysRole_create_by, r.create_time sysRole_create_time FROM sys_user u INNER JOIN sys_user_role ur ON u.id = ur.user_id INNER JOIN sys_role r ON ur.role_id = r.id WHERE u.id = ? 
2018-05-01 01:08:19,155 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1001(Long)
2018-05-01 01:08:19,212 TRACE [main] (BaseJdbcLogger.java:151) - <==    Columns: id, user_name, user_password, user_email, user_info, create_time, head_img, sysRole_id, sysRole_role_name, sysRole_enabled, sysRole_create_by, sysRole_create_time
2018-05-01 01:08:19,213 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 1001, artisan, 123456, test@artisan.com, <<BLOB>>, 2018-04-13 21:12:47.0, <<BLOB>>, 2, 普通用户, 1, 1, 2018-04-13 21:12:46.0
2018-05-01 01:08:19,231 DEBUG [main] (BaseJdbcLogger.java:145) - <==      Total: 1
2018-05-01 01:08:19,232  INFO [main] (UserMapperTest.java:1097) - SysUser [id=1001, userName=artisan, userPassword=123456, userEmail=test@artisan.com, userInfo=测试用户, headImg=[18, 49, 35, 18, 48], createTime=Fri Apr 13 21:12:47 BOT 2018, sysRole=SysRole [id=2, roleName=普通用户, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null]]
2018-05-01 01:08:19,239  INFO [main] (UserMapperTest.java:1102) - sqlSession close successfully 


方式四:asscociation标签的嵌套查询


前面三种方式通过负载的SQL查询获取结果,其实还可以利用简单的SQL通过多次查询转换为我们需要的结果,这种方式与根据业务逻辑手动执行多次SQL的方式很像,最后将结果组成一个对象。

场景和情况比较复杂,后续单独阐述

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
4月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
289 5
|
6月前
|
SQL XML Java
七、MyBatis自定义映射resultMap
七、MyBatis自定义映射resultMap
152 6
|
6月前
|
Java 数据库连接 mybatis
MyBatis篇-映射关系(1-1 1-n n-n)
本文介绍了MyBatis中四种常见关系映射的配置方法,包括一对一、一对多、多对一和多对多。**一对一**通过`resultMap`实现属性与字段的映射;**一对多**以用户-角色为例,使用`&lt;collection&gt;`标签关联集合数据;**多对一**以作者-博客为例,利用`&lt;association&gt;`实现关联;**多对多**则通过引入第三方类(如UserForDept)分别在User和Dept类中添加集合属性,并配置对应的`&lt;collection&gt;`标签完成映射。这些方法解决了复杂数据关系的处理问题,提升了开发效率。
|
8月前
|
XML Java 数据库连接
Mybatis一对一,一对多关联查询
## MyBatis一对一、一对多关联查询详解 MyBatis是一款优秀的持久层框架,提供了灵活的SQL映射功能,支持复杂的数据库操作。本文将详细介绍MyBatis中一对一和一对多关联查询的实现。 ### 一对一关联查询 一对一关联关系指的是一个表中的一条记录与另一个表中的一条记录相关联。例如,一个用户有一个地址信息。 #### 数据库表设计 假设有两个表:`user`和 `address`。 ``` CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE address
201 18
|
9月前
|
XML Java 数据库连接
Mybatis映射关系
简介:本文介绍了MyBatis框架中四种常见的关系映射方式,包括一对一、一对多、多对一及多对多。一对一通过简单属性映射实现;一对多通过在主对象中添加集合属性并使用`&lt;collection&gt;`标签映射子对象集合;多对一则利用`&lt;association&gt;`标签在主对象中映射单个子对象;多对多需引入第三方类,分别在两个主对象中添加对方的集合属性,并通过`&lt;collection&gt;`标签实现映射。
152 32
|
10月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
12月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
394 3
|
Java 数据库连接 mybatis
mybatis映射关系(1-1 1-n n-n)
Mybatis 中的关系映射包括一对一、一对多和多对多。一对一映射可以通过ResultMap定义属性与字段的对应。一对多示例中,User类包含List&lt;Role&gt;,在User的mapper.xml中使用&lt;collection&gt;标签。多对一的情况,如Author与Blog,Blog的ResultMap中使用&lt;association&gt;来映射Author属性。多对多时,如部门与用户,通常需要中间表,并在双方实体中通过&lt;collection&gt;引用中间类,如UserForDept,来维护关系。
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改