Mybatis是一个半自动化持久化层ORM(对象,关系,映射)框架(dao层),将Java中的对象与数据库建立映射关系。优势:操作Java中的对象,就可以影响数据库中表的数据
MyBatis 支持定制化SQL、存储过程以及高级映射
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(普通的Java对象)映射成数据库中的记录
对开发人员而言,核心sql还是需要自己优化
建库、建表、建约束、准备Maven工程
导入MySQL驱动包
mysql
mysql-connector-java
8.0.26
导入MyBatis的jar包
org.mybatis
mybatis
3.5.6
导入jar包
log4j
log4j
1.2.17
编写配置文件(名称:“log4j.xml” , 文件位置:“resources”)
public class App {
public static void main( String[] args ) {
try {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession();
JobMapper jobMapper = sqlSession.getMapper(JobMapper.class);
List jobs = jobMapper.findAll();
System.out.println(jobs);
sqlSession.close();
}catch (Exception e){
e.printStackTrace();
}
}
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
没有实际语义,主要作用:所有子标签均需要设置在跟标签内部
作用:定义或引入外部属性文件
db.properties文件(数据库连接池配置文件)
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/db220106
db.username=root
db.password=root
引入数据路连接池
作用:这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
mapUnderscoreToCamelCase属性:是否开启驼峰命名自动映射,默认值false,如设置true会自动将
字段a_col与aCol属性自动映射
注意:只能将字母相同的字段与属性自动映射
作用:类型别名可为 Java 类型设置一个缩写名字。
语法及特点
别名 | 类型 |
_int | int |
integer或int | Integer |
string | String |
list或arraylist | ArrayList |
map或hashmap | HashMap |
作用:设置数据库连接环境
作用:设置映射文件路径
注意:核心配置中的子标签,是有顺序要求的。
mapper标签
useGeneratedKeys:启用主键生成策略
keyProperty:设置存储属性值
直接将接口中方法的返回值设置为int或boolean即可
int:代表受影响行数
boolean
true:表示对数据库有影响
false:表示对数据库无影响
可以任意使用:参数数据类型、参数名称不用考虑
Mybatis底层封装Map结构,封装key为param1、param2....【支持:arg0、arg1、...】
语法:
@Param(value="参数名")
@Param("参数名") (value可以省略不写)
位置:参数前面
注意:
底层封装Map结构
命名参数,依然支持参数【param1,param2,...】
示例代码
/**
* 通过员工姓名及薪资查询员工信息【命名参数】
* @return
*/
public List selectByName(@Param("name")String lastName);
【#】底层执行SQL语句的对象,使用PreparedStatementd,预编译SQL,防止SQL注入安全隐患,相对比较安全。
【$】底层执行SQL语句的对象使用Statement对象,未解决SQL注入安全隐患,相对不安全。
自动映射【resultType】:指的是自动将表中的字段与类中的属性进行关联映射
自动映射解决不了两类问题
多表连接查询时,需要返回多张表的结果集
单表查询时,不支持驼峰式自动映射【不想为字段定义别名】
自定义映射【resultMap】:自动映射解决不了问题,交给自定义映射
注意:resultType与resultMap只能同时使用一个
resultMap标签:自定义映射标签
id属性:定义唯一标识
type属性:设置映射类型
resultMap子标签
id标签:定义主键字段与属性关联关系
result标签:定义非主键字段与属性关联关系
column属性:定义表中字段名称
property属性:定义类中属性名称
association标签:定义一对一的关联关系
property:定义关联关系属性
javaType:定义关联关系属性的类型
select:设置分步查询SQL全路径
colunm:设置分步查询SQL中需要参数
fetchType:设置局部延迟加载【懒加载】是否开启
collection标签:定义一对多的关联关系
property:定义一对一关联关系属性
ofType:定义一对一关联关系属性类型
fetchType:设置局部延迟加载【懒加载】是否开启
将多表连接查询改为分布单表查询,连接查询效率很低。
需要时加载,不需要暂时不加载
优势:提升程序运行效率
语法
全局设置
fetchType
eager:关闭局部延迟加载
lazy:开启局部延迟加载
动态SQL指的是:SQL语句可动态化
Mybatis的动态SQL中支持OGNL表达式语言,OGNL( Object Graph Navigation Language )对象图导航语言
if标签:用于完成简单的判断
where标签:用于解决where关键字及where后第一个and或or的问题
trim标签: 可以在条件判断完的SQL语句前后添加或者去掉指定的字符
prefix: 添加前缀
prefixOverrides: 去掉前缀
suffix: 添加后缀
suffixOverrides: 去掉后缀
set标签:主要用于解决set关键字及多出一个【,】问题
choose标签:类似java中if-else【switch-case】结构
foreach标签:类似java中for循环
collection: 要迭代的集合
item: 当前从集合中迭代出的元素
separator: 元素与元素之间的分隔符
open: 开始字符
close:结束字符
sql标签:提取可重用SQL片段
概述:一级缓存【本地缓存(Local Cache)或SqlSession级别缓存】
特点
一级缓存默认开启
不能关闭
可以清空
缓存原理
第一次获取数据时,先从数据库中加载数据,将数据缓存至Mybatis一级缓存中【缓存底层实现原理Map,key:hashCode+查询的SqlId+编写的sql查询语句+参数】
以后再次获取数据时,先从一级缓存中获取,如未获取到数据,再从数据库中获取数据。
一级缓存五种失效情况
1) 不同的SqlSession对应不同的一级缓存
2) 同一个SqlSession但是查询条件不同
3) 同一个SqlSession两次查询期间执行了任何一次增删改操作
清空一级缓存
4) 同一个SqlSession两次查询期间手动清空了缓存
sqlSession.clearCache()
5) 同一个SqlSession两次查询期间提交了事务
sqlSession.commit()
二级缓存【second level cache】概述
二级缓存【全局作用域缓存】
SqlSessionFactory级别缓存
二级缓存特点
二级缓存默认关闭,需要开启才能使用
二级缓存需要提交sqlSession或关闭sqlSession时,才会缓存。
二级缓存使用的步骤:
二级缓存底层原理
第一次获取数据时,先从数据库中获取数据,将数据缓存至一级缓存;当提交或关闭SqlSession时,将数据缓存至二级缓存
以后再次获取数据时,先从一级缓存中获取数据,如一级缓存没有指定数据,再去二级缓存中获取数据。如二级缓存也没有指定数据时,需要去数据库中获取数据,......
二级缓存相关属性
eviction=“FIFO”:缓存清除【回收】策略。
LRU – 最近最少使用的:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
flushInterval:刷新间隔,单位毫秒
size:引用数目,正整数
readOnly:只读,true/false
二级缓存的失效情况
在两次查询之间,执行增删改操作,会同时清空一级缓存和二级缓存
sqlSession.clearCache():只是用来清除一级缓存。
第三方缓存:EhCache
EhCache 是一个纯Java的进程内缓存框架
第三方缓存,需要建立在二级缓存基础上【需要开启二级缓存,第三方缓存才能生效】
如何让第三方缓存失效【将二级缓存设置失效即可】