Mybatis学习(三)mybatis查询的使用

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值