mybatis(四)多参传递、延时加载、缓存及注解开发

mybatis基础讲解:
mybatis(一)数据库事务与环境搭建
mybatis(二)mybatis的执行流程
mybatis(三)动态sql与多表查询
mybatis(四)多参传递、延时加载、缓存及注解开发


mybatis(四)多参传递、延时加载、缓存及注解开发

一、多参传递

  1. 实体类,通过JavaBean导航方式
public User selectUser(User user);

<select id="selectUser" parameterType="com.test.User" resultMap="UserResultMap">
    select * from user
    where user_name = #{userName} and dept_id = #{deptId}
</select>

#{ } 里面的名称对应的是User类里面的成员属性。

  1. 顺序传参
 List<Route> getFavoriteRank( int start, int last);

 select * from tab_route order by  `count` desc limit  #{0},#{1}

#{ }里面的数字代表你传入参数的顺序。
(本人在使用这个方法过程,程序一直报错,百度许久未解决)

[email protected]

//@Param( ):括号写,sql语句中,#{}中填写的值

在Dao接口中:
	 List<Route> getFavoriteRank( @Param("start") int start, @Param("last") int last);

在Dao.xml中:
<select id="getFavoriteRank" resultMap="listRoute1">
    select * from tab_route order by  `count` desc limit  #{start},#{last}
</select>
  1. Map传参
//取值:#{ }中是map的key值

<select id="chekckrouteColle" resultType="int" parameterType="map">
    select count(*) from tab_favorite where rid=#{rid} and uid=#{uid}
</select>

//定义在Dao接口中的方法所需的参数更改为Map。

二、延时加载

别名:按需加载,懒加载
**延迟加载:**就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。

  1. 优缺点

好处:
先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

坏处:
因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。

  1. 步骤
    1、修改映射配置文件(resultMap)
<resultMap type="user" id="userMap">
<id column="id" property="id"></id>
<result column="username" property="username"/>
<result column="address" property="address"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<!-- collection 是用于建立一对多中集合属性的对应关系
ofType 用于指定集合元素的数据类型
select 是用于指定查询账户的唯一标识(账户的 dao 全限定类名加上方法名称)
column 是用于指定使用哪个字段的值作为条件查询
-->
<collection property="accounts" ofType="account" select="com.xmcc.dao.IAccountDao.findByUid"  column="id">
</collection>
</resultMap>

<!-- 配置查询所有操作 -->
<select id="findAll" resultMap="userMap"> select * from user
</select>
<collection>标签:
主要用于加载关联的集合对象
select 属性:
用于指定查询的 sql 语句,所以填写的是对应的dao 全限定类名加上方法名
column 属性:
用于指定 select 属性的 sql 语句的参数来源,上面的参数来自于 user 的 id 列,所以就写成 id 这一个字段名了

2、修改核心配置文件:打开延迟加载

我们需要在 Mybatis 的配置文件 SqlMapConfig.xml 文件中添加延迟加载的配置。
<!-- 开启延迟加载的支持 -->


<settings>
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true"/>

<!-- 将积极加载改为消息加载即按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>

3、修改sql语句
修改第一个sql语句,更改为单表查询

三、mybatis的缓存

一级缓存

  • 缓存的对象
   缓存的是sqlsession对象。
    		当我们执行查询以后,查询的寄过回同时存入到sqlsession为我们提供的一块区域中(Map)
    		当我们再次查询相同数据的时候,mybatis会优先到sqlsession中查询是否存在,如果存在,直接拿来用
    		当我们sqlsession消失,mybatis的一级缓存也就消失了
  • 清空一级缓存
 		 sqlSession.close();
		 sqlSession.clearCache();

一级缓存是 SqlSession 范围的缓存,	当sqlsession在执行updat\delete\insert方法的时候 都会情况清空缓存

二级缓存

  • 缓存的对象
缓存的是sqlsessionFactory对象,由同一个SqlSessionFactory对象
创建出来的sqlSession共享其缓存

  • 二级缓存步骤
1、mybatis支持二级缓存(SqlMapConfig.xml)
			<!-- 开启缓存 -->
        <setting name="cacheEnabled" value="true"></setting>

2、配置映射文件,让映射文件支持二级缓存
			<cache></cache>

3、修改当前操作 支持二级缓存
			<select id="findUser" resultMap="userMap1" useCache="true">

4、序列化对应的实体类
  serializable

mybatis的注解开发

了解其常用注解即可:(写在Dao接口中)
@Insert:实现新增

@Update:实现更新

@Delete:实现删除

@Select:实现查询

@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集

@ResultMap:实现引用

@Results 定义的封装

@One:实现一对一结果集封装

@Many:实现一对多结果集封装

@CacheNamespace(blocking=true):实现二级缓存