MyBatis
2022-02-25 20:34:13 51 举报
AI智能生成
MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 MyBatis的主要特点包括:简单易用、灵活、可插拔、提供XML标签,解除sql与程序代码的耦合,通过DAO层向上传递参数,向下返回结果。
作者其他创作
大纲/内容
9.缓存机制
1.一级缓存
1.级别
SqlSession级别
本地缓存
Map
2.作用
同一个SqlSession对象
查询同一条数据
3.失效情况
SqlSession不同
查询条件不同
两次查询期间有增删改操作
两次查询期间,清除了缓存
4.使用
一直开启
关闭会话
2.二级缓存
默认开启
1.级别
namespace
2.作用
在查询到一个数据并关闭会话后,想让新会话也拿到这个数据
3.原理
一个会话
关闭
提交
4.使用
1.主配置文件
<setting name="cacheEnabled" value="true"/>
2.mapper文件
<cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"/>
eviction
缓存的回收策略
LRU(默认)
移除最长时间没用的对象
FIFO
先进先出
按对象进入缓存的顺序移除
SOFT
软引用
移除基于垃圾收集器状态和弱引用规则的对象
WEAK
弱引用
更积极地移除基于垃圾收集器状态和弱引用规则的对象
flushInterval
缓存刷新间隔
按毫秒算
readOnly
true
只读。mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。
直接把数据在缓存中的引用交给调用者
速度快
不安全
false
非只读(默认)。mybatis认为获取的数据可能会被修改。
使用序列化复制一份数据给调用者
速度慢
安全
size
指定缓存中能放多少个元素
1024
type
指定自定义缓存的全类名。自定义缓存只需要实现Cache接口即可。
新会话
二级缓存
一级缓存
数据库
3.缓存相关配置
主配置文件里的:<setting name="cacheEnabled" value="true/false"/>
true
开启全局缓存
false
只关闭二级缓存
useCache="true/false"
select标签
false
不使用二级缓存
flushCache="true/false"
增删查改标签
true
执行完后清空缓存
两级缓存全部清空
sqlSession.clearCache();
手动清除当前会话的一级缓存
localCacheScope
本地缓存作用域
setting中的name属性
MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询。
默认值为 SESSION,会缓存一个会话中执行的所有查询。
若设置值为 STATEMENT,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存(禁用一级缓存)。
8.动态SQL
1.概念
根据条件得到不同的sql语句
2.实现
mybatis标签
<if>
判断条件
true
把if标签内的sql语句拼接到主sql语句后
false
不添加
语法
主sql语句<if test="条件">部分sql语句</if>
<where>
包含多个if标签
主sql
<if test="条件1">and sql</if>
<if test="条件2">or sql</if>
如果有条件成立
添加where
去除多余语句
or
and
如果没有条件成立
去除多余语句
or
and
<foreach>
描述
参数为
集合
数组
实现
格式
<foreach collection="集合类型" item="集合中的成员" open="开始的字符" close="结束的字符" separator="集合成员间的分隔符">
#{集合中的成员}
</foreach>
<sql>
作用
定义sql代码片段
复用部分sql语句
步骤
定义
<sql id="自定义名">
sql语句、表名、字段等
</sql>
使用
<include refid="id的值"/>
7.返回结果类型
1.resultType
sql语句执行结果转换成的java对象类型
类型的全限定名
Integer
别名
mybatis定义的别名
int
在mybatis主配置文件中定义别名
1.使用<typeAlias>标签
2.使用<package name="包名"/>
类名就是别名
2.resultMap
自定义列名和java对象属性名的对应关系
3.列名和属性名不一致
1.as studentId
2.使用resultMap
4.模糊查询
1.在java代码里添加%作为参数
2.在mapper中拼接%
6.传参方式
1.描述
java代码
传递参数
mapper文件
2.方式
1.一个简单类型参数
简单类型参数
String
java数据类型
int
Integer
#{任意字符}
2.多个简单类型参数
@Param("自定义参数名")
#{自定义参数名}
3.对象传参
mapper文件
读取对象的属性值
#{对象属性名}
4.位置传参
语法
mybatis3.4前
#{0}
#{1}
mybatis3.4后
#{arg0}
#{arg1}
5.Map传参
#{map的key}
3.#和$的区别
1.#
占位符
?
使用实际参数值
代替
#{}
PreparedStatement对象
执行sql语句
insert into t_student(id,name,email,age) value(#{id},#{name},#{email},#{age})
insert into t_student(id,name,email,age) value(?,?,?,?)
防止sql注入
更安全
2.$
字符串替换
使用$包含的字符串
替换
${}
Statement对象
执行sql语句
select id,name,email,age from t_student order by ${colName}
"select id,name,email,age from t_student order by" + ""字符串""
无法防范sql注入
不安全
用于
替换列名
排序
1.三层架构
1.哪三层
界面层
别名
表示层
视图层
功能
用户互动
接收请求
显示请求的数据
业务逻辑层
计算数据
处理业务逻辑
数据访问层
别名
持久层
功能
数据库操作
2.对应框架
SpringMVC
界面层
Spring
业务逻辑层
Mybatis
数据访问层
3.MyBatis作用
操作数据库
增强的JDBC
自动创建
Connection
Statement
ResultSet
自动执行sql
自动处理查询结果集
java对象
List集合
自动关闭资源
开发人员只需提供sql语句
得到数据
4.MyBatis使用步骤
1.添加依赖
mybatis
junit
数据库驱动
2.创建Dao接口
定义操作数据库方法
3.创建sql映射文件
也叫mapper文件
写sql语句
4.创建mybatis主配置文件
连接数据库
指定sql映射文件位置
5.使用mybatis的对象SqlSession
执行sql语句
5.MyBatis动态代理
1.作用
创建Dao接口的实现类
调用dao接口方法
2.使用方式
1.获取SqlSession对象
SqlSessionFactory.openSession()
2.使用getMapper方法获取Dao接口实现类
sqlSession.getMapper(接口.class)
3.使用Dao接口的方法
执行mapper文件中的sql语句
3.使用要求
1.dao接口和mapper文件
放到同一目录下
文件名一致
2.mapper文件
namespace属性值
等于dao接口的全限定名称
sql标签
<select>
<insert>
<delete>
<update>
3.dao接口
不要使用重载方法
0 条评论
下一页