1. 缓存使用:
a. 减少数据库的交互,提高执行效率
b. 数据经常查询且不经常改变
c. 数据的正确性与否对最终结果影响不大
2. mybatis中的缓存:
a. 一级缓存:
* 指的是mybatis中SqlSession对象的缓存:
当执行查询后,查询结果会同时存储到SqlSession对象的一个map区域中
当再次查询相同的数据,有现在SqlSession对象中查询是否含有该数据,有则直接取出
当SqlSession对象销毁时,一级缓存释放
* 发起两次相同的查询时,可以通过日志发现仅向数据库发起第一次查询
可以使用SqlSession对象的clearCache()方法清空缓存
* SqlSession对象调用更新,插入,删除,commit,close方法时,会清空一级缓存
b. 二级缓存:
* 指的是mybatis中SqlSessionFactory对象的缓存:
由同一个SqlSessionFactory创建的SqlSession对象共享该缓存
* 二级缓存使用步骤:
1. 让mybatis框架支持二级缓存 -- 在SqlMapConfig.xml中配置
添加setting配置标签
<settings><setting name="cacheEnabled" value="true"/></settings>2. 让当前的映射文件支持二级缓存 -- 在IUserDao.xml中配置
添加cache配置标签
<cache/>3. 让当前的操作支持二级缓存 -- 在select标签中配置
在select属性中添加useCache="true"* 二级缓存中存放的是数据,而非对象
对象是在SqlSession对象中封装,尽管不同的SqlSession对象进行相同查询在日志中仅查询了一次数据库
但是查询的结果的地址值是不相等的
而一级缓存由于是同一个SqlSession对象内封装的对象,因此多次重复查询的对象地址值相同
mybatis注解开发:
1. 原始配置文件有SqlMapConfig.xml和对应mappers的xml配置文件
2. 使用注解开发即使用注解来配置关于mappers的xml配置文件中的内容,SqlMapConfig.xml仍然需要配置
3. 使用步骤:
a. 创建SqlMapConfig.xml配置文件,填写相关配置信息
b. 在SqlMapConfig.xml的mappers中使用package标签配置带有注解的包
c. mybatis中针对CRUD提供了4中注解@SELECT,@UPDATE,@INSERT,@DELETE
d. 在每个注解中写入sql语句
4. 在mybatis开发中,如果使用了注解,还配置了映射的xml文件,则会报错。
解决方案:删除映射的xml配置文件
5.@Results和@Result注解:
解决表列名和实体类的属性名称对应不上问题
@Select("select * from user ")@Results(value={@Result(id=true, property="实体类属性名", column="数据库表列名"),@Result(id=false, property="实体类属性名", column="数据库表列名"),@Result(id=false, property="实体类属性名", column="数据库表列名"),...})
List<User>findAll();6. 在Results注解中还包含有一个id属性,用于为该Results起一个别名
这样其他方法可以引用该Results配置,引用使用ResulMap注解,参数传入Results注解id属性值
@Select("select * from user ")@Results(id="resultMap1", value={@Result(id=true, property="实体类属性名", column="数据库表列名"),//idw为true表示为主键...})
List<User>findAll();@Select("select * from user where id=#{id} ")@ResultMap(value={"resultMap1"})
User findUserById(Integer id);//当插入语句中的参数和形参列表中的参数具有多个时,使用@Param注解标注该参数对应语句中哪个参数@Insert("insert into users_role(userId,roleId) values(#{uid}, #{rId})")voidaddRoleToUser(@Param("uid") String userId,@Param("rId") String roleId);
mybatis多表查询注解开发
1. 一对一(多对一)关联:
示例:查询账户信息,同时获取该账户所属的用户信息
使用查询的注解配置:
* 类似IAccountDao.xml中配置一样,在注解@Results中配置一个结果集
* 在@Result注解中定义有One类型的注解@One和Many类型的注解@Many* 在一对一的@Result注解中,使用@One配置,@One注解中定义了select()*select()与IAccountDao.xml中select属性的作用一致,用于调用所指向的唯一查询方法
*@One注解中还定义了一个FetchType类型的数值,用于标识是否延迟LAZY(延迟),EAGER(立即),DEFAULT
* 一对一应该使用立即而非延迟,一对多使用延迟查询
IAccountDao.java文件:
@Select("select * from account ")@Results(value={@Result(id=true, property="id", column="id"),//设置id属性为true表示为主键,默认为false@Result(property="uid", column="uid"),@Result(property="money", column="money"),//接下来配置账户信息与用户信息的一对一关系//property为Account类中的User对象的引用名称//column为通过Account表中哪个值来关联查询//one表示这是一对一的关联关系@Result(property="user", column="uid",//定义关联查询时该调用的方法
one=@One(select="cn.mysilent.dao.IUserDao.findById", fetchType=FetchType.EAGER))})
在IUserDao.java文件中需要提供对应的findById查询方法:
@Select("select * from user where id=#{id} ")
User findById(Integer id);2. 一对多(多对多)关联:
示例:查询用户信息,同时获取该用户所包含的所有账户信息
使用查询的注解配置:
* 类似IUserDao.xml中配置一样,在注解@Results中配置一个结果集
* 在@Result注解中定义有One类型的注解@One和Many类型的注解@Many* 在一对多的@Result注解中,使用@Many配置,@Many注解中定义了select()*select()与IUserDao.xml中select属性的作用一致,用于调用所指向的唯一查询方法
*@Many注解中还定义了一个FetchType类型的数值,用于标识是否延迟LAZY(延迟),EAGER(立即),DEFAULT
* 一对一应该使用立即而非延迟,一对多使用延迟查询
IUserDao.java文件中:
@Select("select * from user ")@Results(value={@Result(id=true, property="id", column="id"),//设置id属性为true表示为主键,默认为false@Result(property="name", column="name"),@Result(property="address", column="address"),@Result(property="sex", column="sex"),@Result(property="birthday", column="birthday"),//接下来配置用户信息与账户信息的一对多关系//property为User对象中Account对象引用集合名称//column为通过User表中哪个值来关联查询//many表示这是一对多的关联关系@Result(property="accounts", column="id",//定义关联查询时该调用的方法
many=@Many(select="cn.mysilent.dao.IAccountDao.findAccountByUid", fetchType=FetchType.LAZY))})
在IAccountDao.java文件中需要提供对应的findAccountByUid查询方法:
@Select("select * from account where uid=#{uid} ")
List<Account>findAccountByUid(Integer uid);
使用注解时开启二级缓存使用:
1. 在xml配置中使用二级缓存步骤为:
a. 让mybatis框架支持二级缓存 -- 在SqlMapConfig.xml中配置
添加setting配置标签
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
b. 让当前的映射文件支持二级缓存 -- 在IUserDao.xml中配置
添加cache配置标签
<cache/>
c. 让当前的操作支持二级缓存 -- 在select标签中配置
在select属性中添加useCache="true"
2. 当使用注解配置使用二级缓存时步骤为:
a. 让mybatis框架支持二级缓存 -- 在SqlMapConfig.xml中配置
添加setting配置标签
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
b. 在需要使用二级缓存的接口定义上方添加注解@CacheNamespace,设置blocking属性为true
@CacheNamespace(blocking=true)
public Interface IUserDao {
//...
}