美文网首页程序员
MyBatis结果映射中Constructor与Discrimi

MyBatis结果映射中Constructor与Discrimi

作者: 风静花犹落 | 来源:发表于2022-04-27 11:29 被阅读0次

    Constructor介绍

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

    Constructor用法

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

    • idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
    • arg - 将被注入到构造方法的一个普通结果

    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

    相关文章

      网友评论

        本文标题:MyBatis结果映射中Constructor与Discrimi

        本文链接:https://www.haomeiwen.com/subject/ongkyrtx.html