mybatis学习第五天

185 阅读5分钟

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 {}