mybatis(3)

一,mybatis的延迟加载


1,延迟加载

  在真正使用数据的时候才发起查询,不用的时候不查询,按需加载(懒加载)

2,立即加载

  不管用不用,只要一调用,马上发起查询。

3,四种表关系

  一对一,多对一:采用立即加载。

  一对多,多对多:懒加载。

二,mybatis的缓存


 1,什么是缓存

  存在于内存中的临时数据

2,为什么使用缓存

  减少和数据库的交互次数,提高执行效率。

3,什么样的数据使用缓存

  使用于缓存:

    经常查询且不经常改变的。

    数据的正确与否最终的结果影响不大

  不适用于缓存: 

    经常改变的数据

    数据的正确与否对数据的影响很大

4,Mybatis中的一级缓存:

  指的是mybatis中的SqlSession对象的缓存

  当执行查询后,查询的结果会同时存入到SqlSession为我们提供的一块区域中。

  该区域的结构是一个Map,当我们再次查询同样的数据,mybatis会先去SqlSession中查询是否有,有直接拿出来使用。

  当SqlSession对象消失时,mybatis的一级缓存也就消失了。

  注意:1,一级缓存:使用的是同一个对象

      2,SqlSession范围的缓存,当调用SqlSession的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存

<!-- mybatis开启支持延迟加载 -->
         <setting name="lazyLoadingEnabled" value="true"/>
     
     </settings>
<mapper namespace="com.dao.Load">

    <!-- 定义account和user的resultMap -->
        <resultMap type="account" id="accountUserMap">
        <id property="id" column="id"></id>
        <result property="uid" column="user_id" ></result>
        <result property="money" column="money" ></result>
        <!--  -->
        <association property="user" column="user_id" javaType="user" select="com.dao.IUserDao.findById">
        </association> 
        </resultMap>

    <!-- 一对一,或者多对一  配置查询所有  -->
        <select id="findAll" resultMap="accountUserMap">
                select  * from my_account;
        </select>
        
        
        

</mapper>

5,二级缓存

   5.1定义:指的是Mybatis中SqlSessionFactory对象的缓存,有同一个SqlSessionFactory对象创建的

      SqlSession共享其缓存

   5.2步骤:

    第一步:让mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)

<settings>
     <!-- mybatis开启二级缓存 -->
         <setting name="cacheEnabled" value="true"/>
     
     </settings>

    第二部:让当前的映射文件支持二级缓存(在当前的映射文件中配置)

<!-- 开启二级缓存 -->
    <cache/>

    第三步:让当前的操作支持二级缓存(在select标签中配置)

     

<select id="findAll" resultMap="accountUserMap" useCache="true">
                select  * from my_account;
        </select>

    5.3:注意:二级缓存中存放的是数据不是对象。实际:访问二级缓存时是获取对象的数据,创建一个对象。

三,mybatis中的注解开发

针对crud一共有4个注解@Select ,@Insert ,@Update ,@Delete

1,@Select(value="查询语句")//当只有一个参数时可以省略不写value

public interface IUserDao {
    //针对crud一共有4个注解@Select
    @Select("select * from user")
    public List<User> findAll();
    @Insert("insert into user(name) values(#{name})")
    void saveUser(User user);//#{}里面的变量是对应的形参的属性名
    
    @Update("update user set name=#{name} where id=#{id} ")
    void updateUser(User user);
    
    @Delete("delete from user where id=#{id}")
    void deleteUser(Integer id);
    
    @Select("select * from user where id=#{id}")
    User findById(Integer id);
    
    //数据库和对应的表不能对应上
    @Select("select * from user")
    @Results(id="userMap",value = {
            @Result(id=true,column = "id",property = "userId"),
            @Result(column = "name",property = "userName"),
    })
    List<TUser> findTUser();
    
    

    @Select("select * from user where id=#{id}")
    @ResultMap(value = {"userMap"})
    TUser findByIdTUser(Integer id);

    
    
}

注意:results中的id属性用于给他们标号,便于迁移使用。避免重复代码。

注意:当注解和配置文件的形式都存在时,无论主文件是采取resource或class的形式,都会报错

原文地址:https://www.cnblogs.com/gjx1212/p/14705158.html