在上个博客中我们使用了多表联合查询,但是想一想如何表的数目较多时,那么写多表查询的SQL语句就会变得困难,同样,如果从数据库性能的角度来看,还是联合查询。
由这个表可以看出,一把钥匙对应一把锁,一把锁对应多把钥匙。
查出一把钥匙的同时查出这把钥匙对应的锁。
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();
}
从上面可以看到,即使不需要锁信息,但是仍然会查询锁信息,造成数据库严重性能,怎么办呢?
按需加载:主要的时候去查询,全局开启按需加载策略
在全局配置文件中配置settings的两个属性:
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
settings>
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();
}