半自动化的持久性框架
jdbc–>sql代码耦合度太高
简化jdbc代码,降低耦合度,自己编写sql语句 :Mybatis
实体类对应数据库字段(别名)
Dao–>Mapper
使用Mybatis步骤:
1.jar包导入
2.核心配置文件 mybatis-config.xml 数据库信息 driver url user pwd
3.SQL配置文件 userMapper 接口的映射文件
4.测试类
namespace 命名空间 接口的全类名
select id:唯一标识,代表方法名 resultType:sql返回结果集的数据类型
#{id} 占位符 等价于 “?”
当前查询条件只有一个且条件类型是普通类型就随便写
测试sql操作步骤:
1.SqlSessionFactoryBuilder,构建sqlsessionfactory工厂
2.读取主配置文件
3.获取SqlSession对象
4.获取代理mapper对象
5.调用Mapper接口的方法
6.提交事务(增删改)
7.关闭session资源
session.getMapper 获取代理对象(实现类对象)
管理映射文件
resultType: 数据库中每一行的类型
@Before
log4j 日志记录工具
debug级别<info级别<warn级别
参数是封装类型 #{属性}
提交事务:session.commit()
关流:session.close
int是Integer类型的别名
parameterType 参数类型 可选的,增删改可以不写
返回自增主键:
1.useGeneratedKeys:使用mysql数据库自动增长的id值
keyProperty=“id”:user类中的属性
2.select last_insert_id()
order=“AFTER” 在添加执行完毕之后进行id查询
order=“BEFORE” 在添加执行之前进行id查询
resultType=“int” 指定查询主键返回的数据类型
properties核心配置
引入外部文件
设置settings
类型别名 typeAliases
类型处理器 typeHandlers
环境配置 environments
事务管理器
JDBC 会提交和回滚事务
MANAGED 不会
数据源:dataSource
type=“POOLED” 连接池
映射器 mappers
resource 相对路径
url 绝对路径 (不常用)
class 直接注册管理接口 接口的名字必须和sql映射的名字一致 ,接口和映射文件必须在同一个目录下
name 注册接口所在的包
动态SQL
主体不变,过滤条件变为动态
if标签 test是判断条件
Where标签:自动去除条件之前多余的and或or,不能去除条件之后的多余关键字
trim标签:prefix 在条件之前加内容 prefixOverrides 在条件之前去除的内容 suffix 在条件之后加内容 suffixOverrides 在条件之后去除的内容
choose标签 when满足条件执行 otherwise所有when不满足则执行这个
set标签 用于update 自动去除修改字段之后多余的逗号
foreach标签 从多个id中查询对应的数据库记录 也可以批量添加
Collection 当前的集合 item 每次循环的值 open 最前面添加的值 close 最右边添加的值 separator 每个item之间的符号
sql片段 公共的sql提取
Mybatis 缓存
把经常访问的数据预先保存在高速缓存区
一级缓存:同一个SqlSession对象
二级缓存:同一个SqlSessionFactory对象
目的是为了提高访问速度
一级缓存默认是开启的
二级缓存默认不开启
不能使用一级缓存的情况:
1.查询条件不一样 2.两次查询期间进行了增删改 3.手动设置缓存失效 session.clearCache()
开启二级缓存支持
在映射配置文件中添加
实体类实现序列化接口
Session.commit() 将一级缓存的数据放到二级缓存中
session.close() 也能将一级缓存的数据放到二级缓存中
自定义二级缓存 实现Cache接口
缓存的使用顺序:先访问二级缓存,如果访问不到就访问一级缓存,如果还访问不到就会访问数据库,然后将数据添加到一级缓存中,当session进行提交或者关闭时,把数据添加到二级缓存中
Mybatis逆向工程(MBG)
可以将实体类,映射sql文件,mapper接口自动生成
Mybatis底层原理
1.根据配置文件(全局,sql映射) 初始化Configuration对象
2.创建一个DefaultSqlSession对象,他里面包含Configuration以及Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor)
3.DefaultSqlSession.getMapper():拿到Mapper接口对应的MapperProxy
4.MapperProxy里面有(DefaultSqlSession)
5.执行增删改查方法:
1调用DefaultSqlSession的增删改查:会创建一个Statement对象
2会创建一个StatementHandler对象(同时也会创建出ParameterHandler和ResultSetHandler)
4调用StatementHandler的预编译参数以及设置参数值
5调用StatementHandler的增删改查方法
6ResultSetHandler封装结果