Mybatis
【尚硅谷】2022版MyBatis教程(细致全面,快速上手)_哔哩哔哩_bilibili
笔记
Mybatis框架搭建
步骤
相当于以前的dao,但是mapper仅仅是接口,不需要提供实现类
需要创建实体类,把数据库中的数据转化为java中的数据
mybatis有面向接口编程的功能,每当调用接口的方法,就会自动匹配sql语句并执行
创建映射文件
.xml
ORM :Object Relation Mapping 对象关系映射
映射关系 :表 - - 实体类 -- mapper接口 -- 映射文件
引入映射文件
添加测试功能
优化功能
sqlSession 默认不自动提交事务,如果需要,在openSession 中设置为true.
log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下
添加修改和删除功能
先写Mapper接口中的方法,再在相应的映射文件中写sql语句,其它的和之前的一样
添加查询功能
查询功能的标签必须设置为resultType或resultMap
查询所有对象 :用list
核心配置文件
解释
属性:
default:设置默认使用环境的id
属性:
id:表示连接数据库环境的唯一标识,不能重复
属性:"JDBC|MANAGED"
JDBC: 表示当前环境执行sql时,使用JDBC原生的事务管理方式,事务的提交和回滚需要手动处理
MANAGED: 被管理,例如Spring
属性:
type:设置数据源的类型
type="POOLED|UNPOOLED|JNDI"
POOLED:表示使用数据库连接池缓存数据库连接
UNPOOLED:不使用数据库连接池
JNDI:表示使用上下文中的数据源
properties
typeAliases
提供设置类型别名的功能,类型别名不区分大小写
设置好之后就可以用类型别名来代替它
Package (最常用)
就以包为单位,将包下的所有类型设置默认的类型别名,且类型不区分大小写
Mappers
引入映射文件
也可以以包为单位引入映射文件
要求 :
Mybatis获取参数值的两种方式
获取参数值的各种形式
可以通过${} 和#{}以任意的字符串获取参数值,但是需要注意${}的单引号问题
上面的结果那个? 就是占位符赋值,跟值占什么没关系,只跟位置有关系(把username改成其它的也行,问题不大)
因为${} 本质上就是字符串拼接,所以要加单引号,不然会报错。
此时Mybatis会将这些参数放在一个map集合中,以两种方式进行存储
因此只需要通过#{}和${}以键的方式访问值即可,但是需要注意${}的单引号问题
可以手动将参数放进map中存储
##因此只需要通过#{}和${}以键的方式访问值即可,但是需要注意${}的单引号问题
只需要通过#{}和${}以属性的方式访问属性值即可,但是需要注意${}的单引号问题
因此只需要通过#{}和${}以键的形式访问值即可,但是需要注意${}的单引号问题
最好整合为两种情况
|
@Param注解源码解析
略
MyBatis的各种查询功能
查询一个实体类对象
查询一个list集合
查询表中的总记录数
注意查询的结果是Integer ,就要写resultType="java.lang.Integer" 里面是类型别名,是mybatis设置的
mybatis内置的类型别名
一般常用的类型别名
返回值为map集合
查询结果
键是字段名,值是字段的值
查询多个用户信息
把当前查询的数据的某个字段作为键,把当前查询的的数据转化成的map集合作为值
结果
特殊SQL的执行
MyBatis处理模糊查询
${} 表示字符串的拼接(见上文)
注意,不能写成‘’#{}‘’的形式——因为存在于一对单引号中,所以被当成字符串解析了,参数也没有赋上去
批量删除
当通过#{}查询时,虽然不报错,但是受影响的行数是0,因为格式不正确
正确的方法
动态设置表名
在sql语句中表名不能加单引号,所以只能使用${} ,不能使用#{}
正确的方法
添加功能获取自增的主键
应用场景 :
添加操作,主键自增
将自增的主键的值赋值给传输到映射文件中参数的某个属性
结果:插入的user的id是有值的
自定义映射resultMap
问题 :有两张表t_emp和t_dept,通过did联结
解决字段名和属性名不一致的情况
见下文
resultMap处理字段和属性的映射关系
之前用的resultType 是默认的映射关系,要求字段名和属性名一致
若字段名和实体类中的属性名不一致,则可以通过resultMap 设置自定义映射
resultMap:设置自定义映射关系
id:唯一标识,不能重复
type:设置映射关系中的实体类类型
子标签:
id:设置主键的映射关系
result:设置普通字段的映射关系
property:设置映射关系中的属性名,必须是type属性所设置的实体类类型中的属性名
column:设置映射关系中的字段名,必须是sql语句查询出的字段名
处理多对一映射处理
注意:需要有一个无参构造
结果
association: 处理多对一的映射关系
property :需要处理多对的映射关系的属性名
javaType :该类型的属性
先查员工,再查员工对应的信息
select :设置分步查询的sql的唯一标识(namespace.SQLId或mapper接口的全类名、方法名)
column :设置分步查询的条件
延迟加载
分步查询可以实现延迟加载 ——懒加载延迟加载在Mybatis里默认是不开启的
结果 :
不开启延迟加载的结果 :
fetchType :当开启了全局的延迟加载之后,可以通过此属性手动控制延迟加载的效果
一对多映射处理
对一对应对象,对多对应集合
collection :处理一对多的映射关系
ofType :表示该属性所对应的集合中存储数据的类型
一般来说,分布查询只有第一步需要设置resultMap,后如果没有分布查询的信息,设置resultType
这里还是使用collection
设置延迟加载 :还是使用fetchType 手动设置延迟加载的效果
动态SQL
Mybatis框架中的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串中的痛点问题
if标签
根据标签中test属性所对应的表达式决定标签中的内容是否需要拼接到SQL中
注意这个1=1 这是为了不影响查询结果,即假设函数里输入的name为‘’,也能正常拼接SQL语句,不报错
结果 :
where标签
注意 :where标签不能将其中内容后面多余的and或or去掉,比如下面这种情况就会报错
结果 :
执行的sql语句没有去掉and
trim标签
choose、when、otherwise标签
相当于if...else if...else
when至少要有一个,otherwise最多只能有一个
foreach标签
collection :设置需要循环的数组或集合
item :表示数组或集合中的每一个数据
seperator :循环体之间的分隔符
open :foreach标签所循环的所有内容的开始符
close :结束符
注意:参数的访问方式是固定的
手动加入@Params 就可以以指定的对象方式进行访问
要用@Params 指定访问的对象
注意,这里不能加open和close取代两个括号,open和close指的是在所有内容外面加开始符和结束符,而程序里的()是每个循环体加的
sql标签
将常用的sql片段进行记录,要用的时候就直接引用
通过sql 和include 实现
MyBatis的缓存
缓存 :把当前查询的数据进行记录,下次查询相同数据时就会从缓存中直接获取
缓存只对查询功能有效
一级缓存
一级缓存是默认开启的,通过同一个sqlSession 对象获得的两个不同的mapper也能共享缓存
如果两次查询之间有任意一次增删改操作,缓存就会消失
二级缓存
二级缓存是SqlSessionFactory 级别,范围比一级缓存大,需要手动开启。
通过同一个SqlSessionFactory 创建的SqlSession查询的结果会被缓存;如果再次指向相同的查询语句,结果就会从缓存中获取
二级缓存开启条件
a>全局配置属性就是那个settings
b> 设置标签
c> sqlSession.commit() / sqlSession.close()
d>
执行
结果
命中率不是0,证明缓存生效了
二级缓存失效的情况
两次查询之间执行了任意的增删改,会使一级缓存和二级缓存同时失效
sqlSession.clearCache() 手动清空缓存只对一级缓存有效
二级缓存的相关配置
MyBatis查询缓存的顺序
整合第三方缓存EHCache
只能代替二级缓存,不能代替一级缓存(现在好像都用redis了)
SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
如果一个项目已经使用了log4j,而你加载了一个类库,比方说 Apache Active MQ——它依赖于于另外一个日志类库logback,那么你就需要把它也加载进去。但如果Apache Active MQ使用了SLF4J,你可以继续使用你的日志类库而无语忍受加载和维护一个新的日志框架的痛苦。
从设计模式的角度考虑,它是用来在log和代码层之间起到门面的作用。对用来来说只要使用slf4j提供的接口,即可隐藏日志的具体实现。这与jdbc和相似。使用jdbc也就避免了不同的具体数据库。使用了slf4j可以对客户端应用解耦。因为当我们在代码实现中引入log日志的时候,用的是接口,所以可以实时的更具情况来调换具体的日志实现类。这就是slf4j的作用。
————————————————
原文链接:https://blog.csdn.net/shiyong1949/article/details/78844342
在映射文件中设置
懒得看了
逆向工程
创建逆向工程的步骤
(在尚硅谷的资料里)
注意加junit的jar包要加在plugins的外面
简洁版 :只有增删查改功能(查询包括查询一个和查询全部),一共5种功能(MyBatis3Simple )
全面版 :可能是全都有吧 (MyBatis3 )
生成的函数:
OBG查询
查询全部信息
查询某条信息
修改
分页插件
步骤:
分页插件的使用:
PageInfo
list表示分页数量 5表示当前导航分页的数量
常用数据