延迟加载缓存
立即加载
一条sql语句、可能会造成性能浪费
延迟加载
- 多条sql语句
- 不会造成资源浪费
- 集合可以考虑哦 如果是对象立即加载
属性 fetchType、select、colum
fetchType:设置lazy
select:指定一个select标签的id,用于查询需要延迟加载的记录
colum:指定一个列的值,作为调用select查询时传入的参数值
很多时候,都会给collection设置延迟加载
例子
bankCard.xml
<select id="listByPerson" parameterType="int" resultType="com.mj.bean.BankCard">
select *from bank_card where person_id = #{personId}
</select>
idCard.xml
<select id="getByPerson" parameterType="int" resultType="com.mj.bean.IdCard">
select *from id_card where person_id = #{personId}
</select>
job.xml
<mapper namespace="job">
<select id="listByPerson" parameterType="int" resultType="com.mj.bean.Job">
SELECT
j.*
FROM
job j
JOIN
person_job pj
ON
j.id = pj.job_id AND pj.person_id = #{personId}
</select>
</mapper>
Person.xml
<sql id="sqlListAll3">
select *from person
</sql>
<resultMap id="rmList3" type="com.mj.bean.Person">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<association property="idCard"
fetchType="lazy"
column="id"
select="idCard.getByPerson"
javaType="com.mj.bean.IdCard">
</association>
<collection property="bankCards"
fetchType="lazy"
column="id"
select="bankCard.listByPerson"
ofType="com.mj.bean.BankCard">
</collection>
<collection property="jobs"
fetchType="lazy"
column="id"
select="job.listByPerson"
ofType="com.mj.bean.Job"
>
</collection>
</resultMap>
<select id="list3" resultMap="rmList3">
<include refid="sqlListAll3" />
</select>
<select id="get3" resultMap="rmList3" parameterType="int">
<include refid="sqlListAll3" /> where id = #{id}
</select>
例子中最好用单个对象测试
Person person = session.selectOne("person.get3",1);
System.out.println("hello world!");
person.getIdCard();
//person.getBankCards();
//person.getJobs();
System.out.println("hello world!");
全局延迟加载开关
全局延迟加载开关,在mybatis-config.xml的setting中配置
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="aggressiveLazyLoading" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
fetchType="eager" 可以覆盖
缓存
是为了减少数据库直接访问次数、提高访问效率,而临时存储在内存中的数据 适合存放到缓存中的数据
- 经常查询、不经常改变,数据正确性对最终结果影响不大
- Mybatis缓存都是来缓存select数据