一,延迟加载
1、Mybatis中的延迟加载
问题:在一对多中,当我们有一个用户,它有100个账户。
在查询用户的时候,要不要把关联的账户查出来?
在查询账户的时候,要不要把关联的用户查出来? .
在查询用户时,用户下的账户信息应该是,什么时候使用,什么时候查询的。
在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来。
什么是延迟加载?
在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)
什么是立即加载?
不管用不用,只要- -调用方法,马上发起查询。
什么时候用?
在对应的四种表关系中: -对多,多对一,一对一,多对多
一对多,多对多:通常情况下我们都是采用延迟加载。
多对一,一对一:通常情况下我们都是采用立即加载。
关键代码:
把对user的封装放到另一个方法findByID去执行了,所以可以实现延迟
<association property="user" column="uid" javaType="com.itcast.dao.domin.User" select="com.itcast.dao.IUser.findById">
IAccountDao.xml
<?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.itcast.dao.IAccount">
<!--定义封装的类中-->
<resultMap id="AccountUser" type="com.itcast.dao.domin.Account">
<id property="aid" column="aid"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!-- 先查询account表,得到uid之后传入IUserDao.xml中的findByID查询user表的信息-->
<association property="user" column="uid" javaType="com.itcast.dao.domin.User" select="com.itcast.dao.IUser.findById">
</association>
</resultMap>
<select id="findAll" resultMap="AccountUser" >
SELECT * FROM account
</select>
</mapper>
IUserDao.xml 实现对user的封装
<?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.itcast.dao.IUser">
<select id="findById" parameterType="java.lang.Integer" resultType="com.itcast.dao.domin.User" >
select * from user where uid=#{uid}
</select>
</mapper>
开启mybatis的延迟加载机制
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis的主配置文件 -->
<configuration>
<settings>
<!-- 开启mybatis延迟加载的支持-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
</settings>
<!-- 环境配置-->
<environments default="mysql">
<!-- 配置mysql的环境-->
<environment id="mysql">
<!-- 配置事物的类型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置连接池-->
<dataSource type="POOLED">
<!-- 配置连接数据库的是个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/stu"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 指定配置文件的位置,配置文件指的是每个文件独立的配置文件-->
<mapper resource="com/itcast/dao/IStudentDao.xml"/>
<mapper resource="com/itcast/dao/IAccountDao.xml"/>
<mapper resource="com/itcast/dao/IUserDao.xml"/>
<mapper resource="com/itcast/dao/IRoleDao.xml"/>
</mappers>
</configuration>