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 基于某些结果值(或者传入参数)来决定使用那个映射[ resultMap或 javaType ],还可以组合collection和select查询
<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