0.普通查询(使用resultMap)
<select id="getUserById" resultMap="MyUser">
sql语句...
</select>
public class User{
private Integer id;
private Stringt lastName;
private People people;
}
public class People{
private Integer id;
private Integer age;
}
1.关联查询
普通:
<resultMap type="com.abc.entry.User" id="MyUser">
<id column="id" property="id">
<result column="last_name" property="lastName">
<result column="did" property="people.id">
<result column="age" property="people.age">
</resultMap>
使用association定义关联对象的封装规则1:
<resultMap type="com.abc.entry.User" id="MyUser">
<id column="id" property="id">
<result column="last_name" property="lastName">
<association property="people" javaType="com.abc.entry.People" >
<id column="did" property="id">
<result column="p_age" property="people.age">
</association>
</resultMap>
collection 封装集合
<resultMap type="com.abc.entry.User" id="MyUser">
<id column="id" property="id">
<result column="last_name" property="lastName">
<!--
collection 定义关联集合类型的属性的封装
ofType 指定集合里元素的类型
-->
<collection property="people" ofType="com.abc.entry.People" >
<id column="did" property="id">
<result column="p_age" property="age">
</collection >
</resultMap>
2.分步查询
使用association定义关联对象的封装规则2:
<resultMap type="com.abc.entry.User" id="MyUser">
<id column="id" property="id">
<result column="last_name" property="lastName">
<!--
association定义关联对象的封装规则
select表明当前属性是调用select指定的方法查出的结果
column指定将那一列的值传给这个方法
流程:使用select指定方法(传入column指定列的值)查出对象,并且封装给property
-->
<association property="people" select="com.abc.dao.PeopleMapper.getPeopleById" column="did">
</association>
</resultMap>
collection 封装集合分步查询
<resultMap type="com.abc.entry.User" id="MyUser">
<id column="id" property="id">
<result column="last_name" property="lastName">
<collection property="people" select="com.abc.dao.PeopleMapper.getPeopleById" column="did">
</collection >
</resultMap>
column的多值传递
column={key1=column1,key2=column2,…}
<association property="people" select="com.abc.dao.PeopleMapper.getPeopleById" column="{did=id,p_age=age}">
</association>
3.延迟查询
延迟查询就是关联的值,只有在使用的时候才加载
在分步查询的基础上加上两个配置就能实现延迟加载
全局配置文件中
<settings>
<!--
lazyLoadingEnabled 开启,关联的值延迟加载.
aggressiveLazyLoadingEnabled 开启的话,在需要任何一个属性的时候,它的全部属性将会别加载,否则只加载需要的属性.
-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoadingEnabled" value="false"/>
</settings>
设置全局延迟后,可以在关闭某个查询的延迟
fetchType属性 : lazy 延迟 (默认), eager 立即加载
<association property="people" select="com.abc.dao.PeopleMapper.getPeopleById" column="{did=id,p_age=age}" fetchType="lazy">
</association>
4.discriminator鉴别器
mybatis可以使用discriminator判断某列的值,然后根据值改变封装行为
<resultMap type="com.abc.entry.User" id="MyUser">
<id column="id" property="id">
<result column="last_name" property="lastName">
<discriminator javaType="integer" column="id">
<case value="1" resultType="com.abc.entry.People">
<association property="people" select="com.abc.dao.PeopleMapper.getPeopleById" column="{did=id,p_age=age}" fetchType="lazy">
</association>
</case>
<case value="2" resultType="com.abc.entry.People">
<association property="people" select="com.abc.dao.PeopleMapper.getPeopleById" column="{did=id,p_age=age}" fetchType="eager ">
</association>
</case>
</discriminator>
</resultMap>