Mybatis延迟加载
延迟加载
在真正使用数据是才发起查询。按需加载(懒加载)
立即加载
不管用不用 只要一调用方法,马上发起查询。
对应的表关系:一对多 多对一 一对一 多对多
多对一 一对一 通常采用立即加载
一对多 多对多 通常采用延迟加载
使用 assocation 实现延迟加载
select: 填写我们要调用的 select 映射的 id
column : 填写我们要传递给 select 映射的参数
<!-- 它是用于指定从表方的引用实体属性的 --> <association property="user" javaType="user"
select="com.itheima.dao.IUserDao.findById"
column="uid">
</association>
使用 Collection 实现延迟加载
标签:主要用于加载关联的集合对象 select 属性:用于指定查询 account 列表的 sql 语句,所以填写的是该 sql 映射的 id
column 属性:用于指定 select 属性的 sql 语句的参数来源,上面的参数来自于 user 的 id 列,所以就写成 id 这一个字段名了
<!-- collection 是用于建立一对多中集合属性的对应关系
ofType 用于指定集合元素的数据类型
select 是用于指定查询账户的唯一标识(账户的 dao 全限定类名加上方法名称)
column 是用于指定使用哪个字段的值作为条件查询-->
<collection property="accounts" ofType="account"
select="com.itheima.dao.IAccountDao.findByUid"
column="id">
</collection>
总结
配置:SqlMapConfig.xml 文件
lazyLoadingEnabled
延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。
aggressiveLazyLoading
开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods)。
1 配置文件
2 主配置文件
Mybatis缓存
什么是缓存?
存在于内存中的临时数据。
为什么使用缓存?
减少和数据库的交互次数 提高执行效率
什么样的数据能使用缓存?
1)经常查询 2)不经常改变 3)数据的正确与否对最终结果影响不大
mybatis的一级缓存
mybatis中sqlSession对象的缓存。执行查询之后 查询的结果会同时存入sqlSession的一块区域中。 该区域结构是一个map。但查询同样的数据 mabatis会先去sqlsession中查看 有的话直接用。
sqlSession对象消失 mabtis的一级缓存也消失。
数据库数据和一级缓存不一致 如何做到同步?
一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。
mybatis的二级缓存
mybatis中的SqlSessionFactory对象的缓存。同一个SqlSessionFactory对象创建的sqlSession共享其缓存。
二级缓存使用步骤:
1)mabatis框架支持二级缓存(在SqlMapConfig.XML中配置) setting cacheEnabled
<settings>
<!-- 开启二级缓存的支持 --> <setting name="cacheEnabled" value="true"/>
</settings>
2)当前的映射文件支持二级缓存(mapper.xml文件中配置)cache
<!-- 开启二级缓存的支持 -->
<cache></cache>
3)当前的操作支持二级缓存(在select标签中配置) useCache
<select id="findById" resultType="user" parameterType="int" useCache="true">
select * from user where id = #{uid}
</select>
将 UserDao.xml 映射文件中的 select 标签中设置 useCache=”true”代表当前这个 statement 要使用二级缓存,如果不使用二级缓存可以设置为 false。
注意:针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存。
二级缓存存放的是数据 而不是对象
Mybatis注解开发
常用注解
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@ResultMap:实现引用@Results 定义的封装
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
@SelectProvider: 实现动态 SQL 映射
@CacheNamespace:实现注解二级缓存的使用
CRUD
/*** 查询所有用户* @return*/
@Select("select * from user")
@Results(id="userMap",
value= {
@Result(id=true,column="id",property="userId"),
@Result(column="username",property="userName"),
@Result(column="sex",property="userSex"),
@Result(column="address",property="userAddress"),
@Result(column="birthday",property="userBirthday")
})
List<User> findAll();
@Select("select * from user where id = #{uid} ")
@ResultMap("userMap")
User findById(Integer userId);
/*** 保存操作* @param user* @return*/
@Insert("insert into
user(username,sex,birthday,address)values(#{username},#{sex},#{birthday},#{address}
)")
@SelectKey(keyColumn="id",keyProperty="id",resultType=Integer.class,before =
false, statement = { "select last_insert_id()" })
int saveUser(User user);
/*** 更新操作* @param user* @return*/
@Update("update user set
username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id
=#{id} ")
int updateUser(User user);
/*** 删除用户* @param userId* @return*/
@Delete("delete from user where id = #{uid} ")
int deleteUser(Integer userId);
/*** 查询使用聚合函数* @return*/
@Select("select count(*) from user ")
int findTotal();
/*** 模糊查询* @param name* @return*/
@Select("select * from user where username like #{username} ")
List<User> findByName(String name);
映射开发
@Results 注解
代替的是标签
该注解中可以使用单个@Result 注解,也可以使用@Result 集合
@Results({@Result(),@Result()})或@Results(@Result()) @Resutl 注解代替了 标签和标签
@Result 中 属性介绍: id 是否是主键字段 column 数据库的列名 property 需要装配的属性名 one 需要使用的@One 注解(@Result(one=@One)())) many 需要使用的@Many 注解(@Result(many=@many)())) @One 注解(一对一) 代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍: select 指定用来多表查询的 sqlmapper fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。
使用格式: @Result(column=" ",property="",one=@One(select=""))
@Many 注解(多对一) 代替了标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。 注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType
(一般为 ArrayList)但是注解中可以不定义;
使用格式: @Result(property="",column="",many=@Many(select=""))
二级缓存开发
1 SqlMapConfig 中开启二级缓存支持
<!-- 配置二级缓存 --> <settings>
<!-- 开启二级缓存的支持 --> <setting name="cacheEnabled" value="true"/>
</settings>
2 在持久层接口中使用注解配置二级缓存
@CacheNamespace(blocking=true)//mybatis 基于注解方式实现配置二级缓存
public interface IUserDao {}