mybatis基础讲解:
mybatis(一)数据库事务与环境搭建
mybatis(二)mybatis的执行流程
mybatis(三)动态sql与多表查询
mybatis(四)多参传递、延时加载、缓存及注解开发
一、多参传递
- 实体类,通过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类里面的成员属性。
- 顺序传参
List<Route> getFavoriteRank( int start, int last);
select * from tab_route order by `count` desc limit #{0},#{1}
#{ }里面的数字代表你传入参数的顺序。
(本人在使用这个方法过程,程序一直报错,百度许久未解决)
3.@Param
//@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>
- 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、修改映射配置文件(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):实现二级缓存