什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
帮助文档 mybatis帮助文档
mybatis的延迟加载
什么是延迟加载
在真正使用数据时才发起查询,不用的时候不查询,按需加载,(懒加载),就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.
什么是立即加载
不管用不用,只要一调用方法,马上发起查询
在表与表的四种对应关系中:
一对多,多对多:通查经情况下我们都是采用延迟加载
多对一,一对一:通常情况下我们都是采用立即加载
好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。 坏处: 因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗 时间,所以可能造成用户等待时间变长,造成用户体验下降。
例如多对一的延迟加载 需求: 查询账户信息同时查询用户信息。
账户的持久层 DAO 接口
public interface IAccountDao {
List<Account> findAll();
}
账户的持久层映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.dao.IAccountDao">
<resultMap type="account" id="accountMap">
<id column="aid" property="id"/>
<result column="uid" property="uid"/>
<result column="money" property="money"/>
<association property="user" javaType="user"
select="com.itheima.dao.IUserDao.findById"
column="uid">
</association>
</resultMap>
<select id="findAll" resultMap="accountMap">
select * from account
</select>
</mapper>
select: 填写我们要调用的 select 映射的 id
column : 填写我们要传递给 select 映射的参数
**
用户的持久层接口和映射文件
**
public interface IUserDao {
/**
* 根据 id 查询
* @param userId
* @return
*/
User findById(Integer userId);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.dao.IUserDao">
<select id="findById" resultType="user" parameterType="int" >
select * from user where id = #{uid}
</select>
</mapper>
然后开启mybatis持久化设置 我们需要在 Mybatis 的配置文件 SqlMapConfig.xml 文件中添加延迟加载的配置。
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
编写测试只查账户信息不查用户信息。
public class AccountTest {
private InputStream in ;
private SqlSessionFactory factory;
private SqlSession session;
private IAccountDao accountDao;
@Test
public void testFindAll() {
List<Account> accounts = accountDao.findAll();
}
@Before
public void init()throws Exception {
in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(in);
session = factory.openSession();
accountDao = session.getMapper(IAccountDao.class);
}
@After
public void destroy() throws Exception{
session.close();
总结: 我们首先在账户的DAO接口配置文件中,设置了延迟查询需要的参数,和延迟查询SQL语句的位置,然后在用户的DAO接口配置文件中接收参数并且写好SQL语句,这样我们在使用账户查询的时候,只有我们使用了用户的信息,账户查询才回去调用用户查询,借此用来实现延迟加载的操作
|