高级结果映射
resultMap的association配置一对一映射
association 标签包含以下属性。
property:对应实体类中的属性名,必填项。
javaType: 属性对应的 Java 类型。
resultMap: 可以直接使用现有的 resultMap,而不需要在这里配置。
columnPrefix:查询列的前缀,配置前缀后,在子标签配置 result 的 column 时 可以省略前缀
<resultMap id="userRoleMap" extends="userMap" type="tk.mybatis.simple.model.SysUser">
<association property="role" columnPrefix="role_" resultMap="tk.mybatis.simple.mapper.RoleMapper.roleMap"/>
</resultMap>
association 标签的嵌套查询
association 标签的嵌套查询常用的属性如下。
select:另一个映射查询的 id, MyBatis 会额外执行这个查询获取嵌套对象的结果。
column :列名(或别名),将主查询中列的结果作为嵌套查询的参数,
配置方式如 column={prop1=col1 , prop2=col2}, prop1 和 prop2 将作为嵌套查询的参数。
fetchType:数据加载方式,可选值为 lazy 和 eager,分别为延迟加载和积极加载, 这个配置会覆盖全局的 lazyLoadingEnabled 配置.
<resultMap id="userRoleMapSelect" extends="userMap" type="tk.mybatis.simple.model.SysUser">
<association property="role"
fetchType="lazy"
select="tk.mybatis.simple.mapper.RoleMapper.selectRoleById"
column="{id=role_id}"/>
</resultMap>
无论额外查询的数据是否有无用到,总会执行额外查询的SQL语句,
这样会造成多余的数据库查询,配置懒加载之后,可以避免这种情况发生,
在调用了实体类中的方法获取role的时候才会加载这个额外的SQL.
mybatis-config.xml中的配置(不配置这个参数会导致懒加载失效)
<settings>
<!--其他配置-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
在 MyBatis 的全局配置中,有一个参数为 aggressiveLazyLoading。
这个参数的含义是,当该参数设置为 true 时,
对任意延迟属性的调用会使带有延迟加载属性的对象完整加载,
反之,每种属性都将按需加载.
一对多映射
collection 支持的属性以及属性的作用和 association 完全相同
<resultMap id="userRoleListMap" extends="userMap" type="tk.mybatis.simple.model.SysUser">
<collection property="roleList" columnPrefix="role_"
resultMap="tk.mybatis.simple.mapper.RoleMapper.roleMap"/>
</resultMap>
mybatis通过对id是否相同来判断是否为同一个用户
在映射配置中至少含有一个id
<id property="id" column="id"/>
collection可以进行嵌套映射,collection的resultMap中使用collection的resultmap标签继续映射即可
鉴别器映射
discriminator标签,类似java中的switch语句
discriminator 标签常用的两个属性如下。
column: 该属性用于设置要进行鉴别比较值的列。
javaType: 该属性用于指定列的类型,保证使用相同的 Java 类型来比较值。
discriminator 标签可以有 l 个或多个 case 标签, case 标签包含以下三个属性。
value: 该值为 discriminator 指定 column 用来匹配的值。
resultMap: 当 column 的值和 value 的值匹配时,可以配置使用 resultMap 指定 的映射, resultMap 优先级高于 resultType。
resultType: 当 column 的值和 value 的值匹配时,用于配置使用 resultTyp e 指定的映射。
<discriminator column="enabled" javaType="int">
<case value="1" resultMap="rolePrivilegeListMapSelect"/>
<case value="0" resultMap="roleMap"/>
</discriminator>