MyBatis
2021-06-18 20:45:59 77 举报
AI智能生成
mybatis学习框架
作者其他创作
大纲/内容
MyBatis 简介
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。 目前mybatis在github上托管。 git(分布式版本控制,当前比较流程)
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
mybatis架构
分支主题
mybatis快速入门
1.准备开发环境
2.添加相应的jar包
mybatis-3.1.jar
数据库驱动包
3.数据库准备
4.添加Mybatis的配置文件
在src目录下创建一个conf.xml文件
5.定义表所对应的实体类
注意:此处实体类的属性和表的字段名称一一对应
6.定义操作表的sql映射文件xxxMapper.xml
7.在conf.xml文件中注册xxxMapper.xml文件
8.编写测试案例
MyBatis实现CRUD
基于XML的实现
定义sql映射xml文件
基于注解的实现
MybatisUtil工具类
MyBatis配置文件详解
1.properties 属性
连接数据库的配置单独放在一个properties文件中
2.settings全局的参数配置
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
3.typeAliases(别名)
为实体类定义别名,简化sql映射xml文件中的引用
1.单个别名的定义
2.批量定义别名(常用)
4.mappers(映射配置)
1.通过resource加载单个映射文件
2.通过mapper接口加载单个mapper
3.批量加载mapper(推荐使用)
<resultMap>
作用
解决字段名与实体类属性名不相同的冲突
关联查询
一对一关联
方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
查询总结
MyBatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下:
property:对象属性的名称
javaType:对象属性的类型
column:所对应的外键字段名称
select:使用另一个查询封装的结果
一对多关联
方式一: 嵌套结果: 使用嵌套结果映射来处理重复的联合结果的子集
方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
多对多关联
sql片段
sql片段示例
动态sql示例
动态SQL
说明
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。
主要元素
if
if就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择。
示例代码
choose(when,otherwise)
choose元素的作用就相当于JAVA中的switch语句,基本上跟JSTL中的choose的作用和用法是一样的,通常都是与when和otherwise搭配的。
示例代码
trim
作用
trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides;
可以非常简单的利用trim来代替where元素的功能
示例代码
where
where语句的作用主要是简化SQL语句中where中的条件判断的
示例代码
set
作用
set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出一个set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。
可以动态的更新那些修改了的字段。
示例代码
foreach
作用
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
主要属性
item:表示集合中每一个元素进行迭代时的别名
index指定一个名字,用于表示在迭代过程中,每次迭代到的位置
open表示该语句以什么开始
separator表示在每次进行迭代之间以什么符号作为分隔符
close表示以什么结束
collection属性
该属性是必须指定的
1.单参数List的类型:
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
示例代码
2.单参数array数组的类型
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
示例代码
3.自己把参数封装成Map的类型
如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key
示例代码
新特性
1、foreach标签遍历的集合元素类型是Map.Entry类型时
,index属性指定的变量代表对应的Map.Entry的key,item属性指定的变量代表对应的Map.Entry的value。此时如果对应的集合是Map.entrySet,则对应的collection属性用collection。foreach在进行遍历的时候如果传入的参数是List类型,则其collection属性的值可以是list或collection,但如果传入的参数是Set类型,则collection属性的值只能用collection。
2、bind标签
它的功能是在当前OGNL上下文中创建一个变量并绑定一个值。
示例1
where id=1 or id=3 or id=6
示例2
where id in(1,3,6)
MyBatis延迟加载
使用association实现延迟加载
使用association中的select指定延迟加载去执行的statement的id。
在mybatis核心配置文件中的配置
mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。
MyBatis查询缓存
说明
mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。
mybaits提供一级缓存,和二级缓存。
分支主题
一级缓存
工作原理
分支主题
使用场景
二级缓存
工作原理
分支主题
说明
二级缓存与一级缓存区别,二级缓存的范围更大,多个sqlSession可以共享一个UserMapper的二级缓存区域。
每一个namespace的mapper都有一个二缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同的二级缓存区域中。
开启二级缓存
mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓存。
禁用二级缓存
在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。
<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">
刷新缓存
在mapper的同一个namespace中,如果有其它insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。
设置statement配置中的flushCache="true" 属性,默认情况下为true即刷新缓存,如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。
<insert id="insertUser" parameterType="com.mybaits.entity.User" flushCache="true">
Mybatis Cache参数
lushInterval(刷新间隔)
可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
size(引用数目)
可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。
readOnly(只读)
可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。
eviction(收回策略)
LRU – 最近最少使用的:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
示例
二级缓存应用场景
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,
业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
二级缓存的局限性
mybatis二级缓存对细粒度的数据级别的缓存实现不好
Spring整合Mybatis
打印sql执行语句
添加log4j.properties
配置sql打印
Mybatis传多个参数
第一种方案
DAO层的函数方法
Public User selectUser(String name,String area);
对应的Mapper.xml
<select id="selectUser" resultMap="BaseResultMap">
select * from user_user_t where user_name = #{0} and user_area=#{1}
</select>
说明:
其中,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。
第二种方案
此方法采用Map传多参数.
Dao层的函数方法
Public User selectUser(Map paramMap);
对应的Mapper.xml
<select id=" selectUser" resultMap="BaseResultMap">
select * from user_user_t where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR}
</select>
Service层调用
Private User xxxSelectUser(){
Map paramMap=new hashMap();
paramMap.put(“userName”,”对应具体的参数值”);
paramMap.put(“userArea”,”对应具体的参数值”);
User user=xxx. selectUser(paramMap);}
说明:
此方法不够直观,见到接口方法不能直接的知道要传的参数是什么。
第三种方案
Dao层的函数方法
Public User selectUser(@param("userName")String name,@param("userArea") String area);
对应的Mapper.xml
<select id=" selectUser" resultMap="BaseResultMap">
select * from user_user_t
where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR}
</select>
说明:比较好,能让开发者看到dao层方法就知道该传什么样的参数,比较直观,个人推荐用此种方案。
@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中
@Param一致性问题
spring中@param
dao接口
/**
*查询指定用户和企业关联有没有配置角色
* @param businessId memberId
* @return
*/
int selectRoleCount(@Param("businessId") Integer businessId,@Param("memberId") Long memberId);
在xml文件中使用
<select id="selectRoleCount" resultType="java.lang.Integer" >
select count(tbm.id) from t_business_member_relation tbm
where tbm.business_id = #{0,jdbcType=INTEGER}
and tbm.member_id = #{1,jdbcType=INTEGER}
and tbm.role_business_id is not null
</select>
mybatis中的param
dao接口
/**
* 查询指定用户和企业关联有没有配置角色
* @param businessId memberId
* @return
*/
int selectRoleCount(@Param("businessId") Integer businessId,@Param("memberId") Long memberId);
在xml文件中使用
<select id="selectRoleCount" resultType="java.lang.Integer" >
select count(tbm.id) from t_business_member_relation tbm
where tbm.business_id = #{businessId,jdbcType=INTEGER}
and tbm.member_id = #{memberId,jdbcType=INTEGER}
and tbm.role_business_id is not null
</select>
混用会抛出参数绑定异常
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'businessId' not found. Available parameters are [1, 0, param1, param2]
0 条评论
下一页