程序员

MyBatis结果映射中Constructor与Discrimi

2022-04-27  本文已影响0人  风静花犹落

Constructor介绍

构造方法注入允许你在初始化时为类设置属性的值,而不用暴露出公有方法。

Constructor用法

- 用于在实例化类时,注入结果到构造方法中

SysUser.java

@Data
@NoArgsConstructor
public class SysUser {

    private Long id;
    private String userName;
    private String userPhone;

    public SysUser(Long id, String userName, String userPhone) {
        this.id = id;
        this.userName = userName;
        this.userPhone = "+86" + userPhone;
    }
}

SysUser.xml

<mapper namespace="com.jayknoxqu.mapper.SysUserMapper">
    
    <resultMap id="UserResultMap" type="com.jayknoxqu.entity.SysUser">
        <constructor>
            <idArg column="id" name="id"/>
            <arg column="user_name" name="userName"/>
            <arg column="user_phone" name="userPhone"/>  
        </constructor>
    </resultMap>

    <select id="getUser" resultMap="UserResultMap">
        SELECT * FROM sys_user u  WHERE u.id = #{id}
    </select>
    
</mapper>

从版本 3.4.3 开始,可以在指定参数名称的前提下,以任意顺序编写arg元素。 为了通过名称来引用构造方法参数,你可以添加 @Param 注解,或者使用-parameters (JAVA 8+)编译选项,并启用 useActualParamName 选项(默认开启)来编译项目。

之前的版本可以用 @Param 注解

@Data
@NoArgsConstructor
public class SysUser {

    private Long id;
    private String userName;
    private String userPhone;

    public SysUser(@Param("id") Long id, @Param("userName") String userName, @Param("userPhone") String userPhone) {
        this.id = id;
        this.userName = userName;
        this.userPhone = "+86" + userPhone;
    }
    
}

Discriminator介绍

一条数据库查询返回多个不同的结果集时,可以使用discriminator(鉴别器)。它的机制类似Java 语言中的 switch 语句。

Discriminator用法

– case 基于某些结果值(或者传入参数)来决定使用那个映射[ resultMapjavaType ],还可以组合collectionselect查询

<resultMap id="SysOrganizationResultMap" type="com.jayknoxqu.entity.SysOrganization">
  <id property="id" column="id" />
  <result column="org_name" name="orgName"/>
  <result column="org_desc" name="orgDesc"/> 

  <discriminator column="result_flag" javaType="int">
      
    <!-- 如果匹配任意一个鉴别器的 case,就只会返回这个 case 指定的结果映射的(SysPermission)实体类 -->
    <case value="1" resultMap="SysPermissionResultMap" />
    
    <!-- 通过extends字段来加载父类SysOrganization的属性,返回SysDepartment和SysOrganization实体类 -->
    <case value="2" resultMap="SysDepartmentResultMap" />

    <!-- 可以组合collection和select,调用其他sql语句 -->
    <case value="3" resultType="com.jayknoxqu.entity.SysOrganization">
        <collection property="sysRoleBos" 
            column="role_id" 
            select="com.jayknoxqu.mapper.SysRoleMapper.getSysRoleById">
        </collection>
    </case>  

    <!-- 可以通过resultType将所有结果映射写到一个resultMap里 -->
    <case value="4" resultType="com.jayknoxqu.entity.SysUser">
      <result column="user_name" property="userName" />
      <result column="user_desc" property="userDesc" />
    </case>           
  </discriminator>
    
</resultMap>



<resultMap id="SysPermissionResultMap" type="com.jayknoxqu.entity.SysPermission">
      <result column="permis_name" property="permisName" />
      <result column="permis_desc" property="permisDesc" />
</resultMap>

<!-- 通过extends字段来加载父类SysOrganization的属性,返回SysDepartment和SysOrganization实体类 -->
<resultMap id="SysDepartmentResultMap" type="com.jayknoxqu.entity.SysDepartment" extends="SysOrganizationResultMap">
      <result column="dep_name" property="depName" />
      <result column="dep_desc" property="depDesc" />
</resultMap>


<select id="getSysRoleById" resultType="com.jayknoxqu.entity.SysRole">
     SELECT
        r.id,
        r.role_name,
    FROM
        sys_role r 
    WHERE
        r.id = #{roleId}
</select>

官网文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

上一篇下一篇

猜你喜欢

热点阅读