【MyBatis学习及总结07】分步查询:select属性指定分步查询

文章目录

      • 环境
      • 分步查询:JavaBean中有JavaBean
      • 分步查询的问题:按需加载
      • 分步查询:JavaBean中有集合

环境

在上个博客中我们使用了多表联合查询,但是想一想如何表的数目较多时,那么写多表查询的SQL语句就会变得困难,同样,如果从数据库性能的角度来看,还是联合查询。
【MyBatis学习及总结07】分步查询:select属性指定分步查询_第1张图片
由这个表可以看出,一把钥匙对应一把锁,一把锁对应多把钥匙。

分步查询:JavaBean中有JavaBean

查出一把钥匙的同时查出这把钥匙对应的锁。

public class Key {
    private int id;
    private String keyName;
    private Lock lock;
}
public class Lock {
    private int id;
    private String lockName;
}

JavaBean(Key)中有JavaBean(Lock)此时如何采用分步查询???

public interface KeyDao {
	//根据id查询钥匙的方法
    public Key getKeyByIdSimple(int id);
}
public interface LockDao {
	 //根据id查询锁的方法
     public Lock getLockByIdSimple(int id);
}

写查询锁方法的实现类:

<mapper namespace="com.hh.dao.LockDao">
    <select id="getLockByIdSimple" resultType="com.hh.bean.Lock">
        select * from t_lock where id=#{id}
    select>
mapper>

写查询钥匙方法的实现类:需要主要的是钥匙类里面有锁对象

<mapper namespace="com.hh.dao.KeyDao">
    <select id="getKeyByIdSimple" resultMap="mykey">
        select * from t_key where id=#{id}
    select>

    <resultMap id="mykey" type="com.hh.bean.Key">
        <id property="id" column="id"/>
        <result property="keyName" column="keyname"/>
        
        <association property="lock"
                     select="com.hh.dao.LockDao.getLockByIdSimple"
                     column="lockid">
        association>
    resultMap>
mapper>

测试类:

@Test
public void test(){
    SqlSession sqlSession = sqlsessionFactory.openSession();
    KeyDao mapper = sqlSession.getMapper(KeyDao.class);
    Key key = mapper.getKeyByIdSimple(1);
    System.out.println(key);
    sqlSession.close();
}

在这里插入图片描述
【MyBatis学习及总结07】分步查询:select属性指定分步查询_第2张图片

分步查询的问题:按需加载

【MyBatis学习及总结07】分步查询:select属性指定分步查询_第3张图片
从上面可以看到,即使不需要锁信息,但是仍然会查询锁信息,造成数据库严重性能,怎么办呢?
按需加载:主要的时候去查询,全局开启按需加载策略
在这里插入图片描述
在全局配置文件中配置settings的两个属性:

<settings>
   
   <setting name="lazyLoadingEnabled" value="true"/>
   
   <setting name="aggressiveLazyLoading" value="false"/>
settings>

【MyBatis学习及总结07】分步查询:select属性指定分步查询_第4张图片
不需要锁信息时就不会再查询,只查询钥匙信息。

分步查询:JavaBean中有集合

查出锁信息的同时查询出钥匙信息。
在这里插入图片描述

public class Key {
    private int id;
    private String keyName;
}

锁里面有多把钥匙:

public class Lock {
    private int id;
    private String lockName;
    private List<Key> keys;
}

查询钥匙信息

public interface KeyDao {
    //根据锁id查出所有的key
    public List<Key> getKeyByLockId(int id);
}

查询锁信息

public interface LockDao {
     public Lock getLockByIdSimple(int id);
}

查询钥匙信息的实现类:

<mapper namespace="com.hh.dao.KeyDao">
    <select id="getKeyByLockId" resultType="com.hh.bean.Key">
        select * from t_key where lockid=#{id}
    select>
mapper>

查询锁信息的实现类:

<mapper namespace="com.hh.dao.LockDao">
    <select id="getLockByIdSimple" resultMap="mylock">
        select * from t_lock where id=#{id};
    select>
    <resultMap id="mylock" type="com.hh.bean.Lock">
        <id property="id" column="id"/>
        <result property="lockName" column="lockname"/>
        
    resultMap>
mapper>

测试类:

@Test
public void test(){
    SqlSession sqlSession = sqlsessionFactory.openSession();
    LockDao mapper = sqlSession.getMapper(LockDao.class);
    Lock lock = mapper.getLockByIdSimple(3);
    System.out.println(lock);
    List<Key> keys = lock.getKeys();
    for(Key key:keys){
        System.out.println(key);
    }
    sqlSession.close();
}

在这里插入图片描述
【MyBatis学习及总结07】分步查询:select属性指定分步查询_第5张图片

你可能感兴趣的:(MyBatis)