MyBatis04_延迟加载缓存

100 阅读1分钟

延迟加载缓存

立即加载

一条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中配置

image.png

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

fetchType="eager" 可以覆盖

缓存

是为了减少数据库直接访问次数、提高访问效率,而临时存储在内存中的数据 适合存放到缓存中的数据

  • 经常查询、不经常改变,数据正确性对最终结果影响不大
  • Mybatis缓存都是来缓存select数据

一级缓存 sqlSession级别自动

二级缓存 namespace级别

image.png