一,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的形式,都会报错