Mybatis学习笔记(尚硅谷版整理)

Mybatis

【尚硅谷】2022版MyBatis教程(细致全面,快速上手)_哔哩哔哩_bilibili

笔记

Mybatis框架搭建

Mybatis学习笔记(尚硅谷版整理)_第1张图片

步骤

  • 创建maven工程,引入依赖
  • 创建Mybatis的核心配置文件:mybatis-config.xml
  • 连接数据库环境
  • 引入配置文件

Mybatis学习笔记(尚硅谷版整理)_第2张图片

  • 创建实体类

相当于以前的dao,但是mapper仅仅是接口,不需要提供实现类

需要创建实体类,把数据库中的数据转化为java中的数据

Mybatis学习笔记(尚硅谷版整理)_第3张图片

Mybatis学习笔记(尚硅谷版整理)_第4张图片

  • 创建mapper接口

Mybatis学习笔记(尚硅谷版整理)_第5张图片

mybatis有面向接口编程的功能,每当调用接口的方法,就会自动匹配sql语句并执行

创建映射文件

.xml

ORM :Object Relation Mapping 对象关系映射

  • 对象:Java的实体类对象
  • 关系:关系型数据库
  • 映射:两者间的对应关系

Mybatis学习笔记(尚硅谷版整理)_第6张图片

Mybatis学习笔记(尚硅谷版整理)_第7张图片

  • 保证映射文件中namespqace的值与mapper接口一致

  • 映射文件中SQL语句的id要与mapper接口中的方法名一致

Mybatis学习笔记(尚硅谷版整理)_第8张图片

映射关系 :表 - - 实体类 -- mapper接口 -- 映射文件

引入映射文件

Mybatis学习笔记(尚硅谷版整理)_第9张图片

添加测试功能

  • SqlSession:代表Java程序和数据库之间的会话(HttpSession是Java程序和浏览器之间的会话)
  • SqlSessionFactory:是“生产”SqlSession的工厂
  • 工厂模式 :如果创建某一个对象,使用的过程基本固定,那么就可以把创建这个对象的相关代码封装到一个工厂类中,以后都使用这个工厂类生产我们需要的对象

Mybatis学习笔记(尚硅谷版整理)_第10张图片

优化功能

  • 把事务提交设为自动提交:

sqlSession 默认不自动提交事务,如果需要,在openSession 中设置为true.

  • 日志功能
  • 引入依赖

Mybatis学习笔记(尚硅谷版整理)_第11张图片

  • XML文件

log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下

Mybatis学习笔记(尚硅谷版整理)_第12张图片

Mybatis学习笔记(尚硅谷版整理)_第13张图片

添加修改和删除功能

先写Mapper接口中的方法,再在相应的映射文件中写sql语句,其它的和之前的一样

Mybatis学习笔记(尚硅谷版整理)_第14张图片

添加查询功能

  • 如果查询一条:用实体类对象(这里就是用User)
  • 如果查询多条:用List集合(List
  • 需要设置resultType 明确结果转化为什么对象

查询功能的标签必须设置为resultTyperesultMap

  • resultType:设置默认的映射关系,如果字段名和属性名一致,就用resultType
  • resultMap:设置自定义的映射关系,如果需要多对一或者一对多的关系

Mybatis学习笔记(尚硅谷版整理)_第15张图片

查询所有对象 :用list

Mybatis学习笔记(尚硅谷版整理)_第16张图片

Mybatis学习笔记(尚硅谷版整理)_第17张图片

核心配置文件

解释

:配置多个连接数据库的环境

属性:

default:设置默认使用环境的id

配置某个具体环境

属性:

id:表示连接数据库环境的唯一标识,不能重复

:设置事务管理方式

属性:"JDBC|MANAGED"

JDBC: 表示当前环境执行sql时,使用JDBC原生的事务管理方式,事务的提交和回滚需要手动处理

MANAGED: 被管理,例如Spring

:配置数据源

属性:

type:设置数据源的类型

type="POOLED|UNPOOLED|JNDI"

POOLED:表示使用数据库连接池缓存数据库连接

UNPOOLED:不使用数据库连接池

JNDI:表示使用上下文中的数据源

Mybatis学习笔记(尚硅谷版整理)_第18张图片

Mybatis学习笔记(尚硅谷版整理)_第19张图片

properties

  1.  jdbc.properties

Mybatis学习笔记(尚硅谷版整理)_第20张图片

  1. 在mybatis-congif.xml 中引入 jdbc.properties

Mybatis学习笔记(尚硅谷版整理)_第21张图片

typeAliases

提供设置类型别名的功能,类型别名不区分大小写

  • 核心文件配置时必须符合顺序
  • 如果写alias 就用我们设置的别名,如果不用alias 就用默认的别名,就是类的类名,而且不区分大小写

Mybatis学习笔记(尚硅谷版整理)_第22张图片

Mybatis学习笔记(尚硅谷版整理)_第23张图片

设置好之后就可以用类型别名来代替它

Mybatis学习笔记(尚硅谷版整理)_第24张图片

Package (最常用)

就以包为单位,将包下的所有类型设置默认的类型别名,且类型不区分大小写

Mappers

引入映射文件

也可以以包为单位引入映射文件

要求

  • mapper接口所在的包要和映射文件所在的包一致
  • mapper接口要和映射文件的名称一致(像下面这样)

Mybatis学习笔记(尚硅谷版整理)_第25张图片

Mybatis获取参数值的两种方式

  • ${}  本质就是字符串拼接(sql注入?)
  • #{}  本质是占位符赋值

获取参数值的各种形式

  1. mapper接口方法的参数为单个的字面量类型

可以通过${} 和#{}以任意的字符串获取参数值,但是需要注意${}的单引号问题

  • #{}

Mybatis学习笔记(尚硅谷版整理)_第26张图片

Mybatis学习笔记(尚硅谷版整理)_第27张图片

Mybatis学习笔记(尚硅谷版整理)_第28张图片

上面的结果那个? 就是占位符赋值,跟值占什么没关系,只跟位置有关系(把username改成其它的也行,问题不大)

  • ${}

因为${} 本质上就是字符串拼接,所以要加单引号,不然会报错。

  1. 如果mapper接口方法的参数为多个时

此时Mybatis会将这些参数放在一个map集合中,以两种方式进行存储

  • 以arg0, arg1……为键,以参数为值
  • 以param1, param2……为键,以参数为值

因此只需要通过#{}和${}以键的方式访问值即可,但是需要注意${}的单引号问题

Mybatis学习笔记(尚硅谷版整理)_第29张图片

  1. mapper接口方法的参数有多个时

可以手动将参数放进map中存储

##因此只需要通过#{}和${}以键的方式访问值即可,但是需要注意${}的单引号问题

Mybatis学习笔记(尚硅谷版整理)_第30张图片

Mybatis学习笔记(尚硅谷版整理)_第31张图片

Mybatis学习笔记(尚硅谷版整理)_第32张图片

  1. mapper接口方法的参数是实体类类型的参数

只需要通过#{}和${}以属性的方式访问属性值即可,但是需要注意${}的单引号问题

Mybatis学习笔记(尚硅谷版整理)_第33张图片

Mybatis学习笔记(尚硅谷版整理)_第34张图片

  1. 通过@param 注解命名参数
  • @Param 注解的值为键,以参数为值
  • 以param1, param2……为键,以参数为值

因此只需要通过#{}和${}以键的形式访问值即可,但是需要注意${}的单引号问题

Mybatis学习笔记(尚硅谷版整理)_第35张图片

 最好整合为两种情况

  • 实体类
  • @Param

@Param注解源码解析

MyBatis的各种查询功能

Mybatis学习笔记(尚硅谷版整理)_第36张图片

查询一个实体类对象

Mybatis学习笔记(尚硅谷版整理)_第37张图片

Mybatis学习笔记(尚硅谷版整理)_第38张图片

Mybatis学习笔记(尚硅谷版整理)_第39张图片

查询一个list集合

Mybatis学习笔记(尚硅谷版整理)_第40张图片

Mybatis学习笔记(尚硅谷版整理)_第41张图片

Mybatis学习笔记(尚硅谷版整理)_第42张图片

查询表中的总记录数

Mybatis学习笔记(尚硅谷版整理)_第43张图片

注意查询的结果是Integer ,就要写resultType="java.lang.Integer" 里面是类型别名,是mybatis设置的

mybatis内置的类型别名

Mybatis学习笔记(尚硅谷版整理)_第44张图片

一般常用的类型别名

Mybatis学习笔记(尚硅谷版整理)_第45张图片

Mybatis学习笔记(尚硅谷版整理)_第46张图片

Mybatis学习笔记(尚硅谷版整理)_第47张图片

返回值为map集合

Mybatis学习笔记(尚硅谷版整理)_第48张图片

Mybatis学习笔记(尚硅谷版整理)_第49张图片

Mybatis学习笔记(尚硅谷版整理)_第50张图片

查询结果

键是字段名,值是字段的值

查询多个用户信息

  1. List集合包含住map

Mybatis学习笔记(尚硅谷版整理)_第51张图片

Mybatis学习笔记(尚硅谷版整理)_第52张图片

  1. @MapKey

把当前查询的数据的某个字段作为键,把当前查询的的数据转化成的map集合作为值

Mybatis学习笔记(尚硅谷版整理)_第53张图片

结果

特殊SQL的执行

MyBatis处理模糊查询

  1. ${}的形式

${} 表示字符串的拼接(见上文)

Mybatis学习笔记(尚硅谷版整理)_第54张图片

Mybatis学习笔记(尚硅谷版整理)_第55张图片

注意,不能写成‘’#{}‘’的形式——因为存在于一对单引号中,所以被当成字符串解析了,参数也没有赋上去

Mybatis学习笔记(尚硅谷版整理)_第56张图片

  1. concat进行拼接

Mybatis学习笔记(尚硅谷版整理)_第57张图片

  1. 用双引号进行拼接(最常用)

Mybatis学习笔记(尚硅谷版整理)_第58张图片

批量删除

当通过#{}查询时,虽然不报错,但是受影响的行数是0,因为格式不正确

正确的方法

Mybatis学习笔记(尚硅谷版整理)_第59张图片

Mybatis学习笔记(尚硅谷版整理)_第60张图片

Mybatis学习笔记(尚硅谷版整理)_第61张图片

动态设置表名

在sql语句中表名不能加单引号,所以只能使用${} ,不能使用#{}

正确的方法

Mybatis学习笔记(尚硅谷版整理)_第62张图片

Mybatis学习笔记(尚硅谷版整理)_第63张图片

添加功能获取自增的主键

应用场景

  1. 添加班级信息
  1. 获取新添加的班级的id
  1. 为班级分配学生,即将某学的班级id修改为新添加的班级的id

添加操作,主键自增

Mybatis学习笔记(尚硅谷版整理)_第64张图片

  • useGenerateKeys="true" 设置当前标签中的sql使用了自增的id
  • keyProperty="id": 取id的key值,设置完以后我们就可以在前端获取到该自增ID的值

将自增的主键的值赋值给传输到映射文件中参数的某个属性

Mybatis学习笔记(尚硅谷版整理)_第65张图片

结果:插入的user的id是有值的

自定义映射resultMap

问题 :有两张表t_emp和t_dept,通过did联结

Mybatis学习笔记(尚硅谷版整理)_第66张图片

Mybatis学习笔记(尚硅谷版整理)_第67张图片

解决字段名和属性名不一致的情况

  • 为字段起别名,保持和属性名的一致

Mybatis学习笔记(尚硅谷版整理)_第68张图片

  •  通过全局配置mapUnderscoreToCamelCase 设置, value=true - W

Mybatis学习笔记(尚硅谷版整理)_第69张图片

  • 使用resultType

见下文

resultMap处理字段和属性的映射关系

之前用的resultType 是默认的映射关系,要求字段名和属性名一致

若字段名和实体类中的属性名不一致,则可以通过resultMap 设置自定义映射

resultMap:设置自定义映射关系

id:唯一标识,不能重复

type:设置映射关系中的实体类类型

子标签:

id:设置主键的映射关系

result:设置普通字段的映射关系

property:设置映射关系中的属性名,必须是type属性所设置的实体类类型中的属性名

column:设置映射关系中的字段名,必须是sql语句查询出的字段名

Mybatis学习笔记(尚硅谷版整理)_第70张图片

处理多对一映射处理

  1. 级联方式处理映射关系

注意:需要有一个无参构造

Mybatis学习笔记(尚硅谷版整理)_第71张图片

Mybatis学习笔记(尚硅谷版整理)_第72张图片

Mybatis学习笔记(尚硅谷版整理)_第73张图片

结果

  1. 使用association处理映射关系

association: 处理多对一的映射关系

property :需要处理多对的映射关系的属性名

javaType :该类型的属性

Mybatis学习笔记(尚硅谷版整理)_第74张图片

  1. 通过分步查询处理多对一映射关系

先查员工,再查员工对应的信息

  • 分步查询第一步:先查员工

Mybatis学习笔记(尚硅谷版整理)_第75张图片

select :设置分步查询的sql的唯一标识(namespace.SQLId或mapper接口的全类名、方法名)

column :设置分步查询的条件

Mybatis学习笔记(尚硅谷版整理)_第76张图片

  • 第二步:查员工对应的部门信息

Mybatis学习笔记(尚硅谷版整理)_第77张图片

Mybatis学习笔记(尚硅谷版整理)_第78张图片

延迟加载

分步查询可以实现延迟加载 ——懒加载延迟加载在Mybatis里默认是不开启的

Mybatis学习笔记(尚硅谷版整理)_第79张图片

  1. 开启懒加载

Mybatis学习笔记(尚硅谷版整理)_第80张图片

  1. 下面就可以实现只查询名字

Mybatis学习笔记(尚硅谷版整理)_第81张图片

结果

不开启延迟加载的结果

Mybatis学习笔记(尚硅谷版整理)_第82张图片

fetchType :当开启了全局的延迟加载之后,可以通过此属性手动控制延迟加载的效果

  • fetchType="eager" 设置为立即加载
  • fetchType="lazy" 延迟加载

Mybatis学习笔记(尚硅谷版整理)_第83张图片

一对多映射处理

对一对应对象,对多对应集合

  1. 通过collection解决一对的多映射关系

collection :处理一对多的映射关系

ofType :表示该属性所对应的集合中存储数据的类型

Mybatis学习笔记(尚硅谷版整理)_第84张图片

  1. 通过分步查询解决一对多的映射关系

一般来说,分布查询只有第一步需要设置resultMap,后如果没有分布查询的信息,设置resultType

  • 分布查询第一步:查询部门信息

Mybatis学习笔记(尚硅谷版整理)_第85张图片

这里还是使用collection

Mybatis学习笔记(尚硅谷版整理)_第86张图片

  • 分布查询第二步:查询员工信息

Mybatis学习笔记(尚硅谷版整理)_第87张图片

Mybatis学习笔记(尚硅谷版整理)_第88张图片

  • test函数

Mybatis学习笔记(尚硅谷版整理)_第89张图片

设置延迟加载 :还是使用fetchType 手动设置延迟加载的效果

Mybatis学习笔记(尚硅谷版整理)_第90张图片

动态SQL

Mybatis框架中的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串中的痛点问题

if标签

根据标签中test属性所对应的表达式决定标签中的内容是否需要拼接到SQL中

Mybatis学习笔记(尚硅谷版整理)_第91张图片

注意这个1=1 这是为了不影响查询结果,即假设函数里输入的name‘’,也能正常拼接SQL语句,不报错

Mybatis学习笔记(尚硅谷版整理)_第92张图片

Mybatis学习笔记(尚硅谷版整理)_第93张图片

结果

where标签

  • 如果where 标签中有内容,就会自动添加where关键字,并把内容前多余的and或者or去掉;
  • 如果where标签中没有内容,where标签也没有效果

Mybatis学习笔记(尚硅谷版整理)_第94张图片

注意 :where标签不能将其中内容后面多余的and或or去掉,比如下面这种情况就会报错

Mybatis学习笔记(尚硅谷版整理)_第95张图片

Mybatis学习笔记(尚硅谷版整理)_第96张图片

结果

执行的sql语句没有去掉and

Mybatis学习笔记(尚硅谷版整理)_第97张图片

trim标签

  • 若标签中有内容时:
  • prefix /suffix :将trim 标签中内容前面或后面添加指定内容
  • suffixOverrides /prefixOverrides :将trim 标签中内容前面或后面去掉指定内容
  • 若标签中没有内容时,trim标签也没有任何效果

Mybatis学习笔记(尚硅谷版整理)_第98张图片

choosewhenotherwise标签

相当于if...else if...else

when至少要有一个,otherwise最多只能有一个

Mybatis学习笔记(尚硅谷版整理)_第99张图片

foreach标签

collection :设置需要循环的数组或集合

item :表示数组或集合中的每一个数据

seperator :循环体之间的分隔符

open :foreach标签所循环的所有内容的开始符

close :结束符

  1. 实现批量删除

注意:参数的访问方式是固定的

手动加入@Params 就可以以指定的对象方式进行访问

Mybatis学习笔记(尚硅谷版整理)_第100张图片

  • 批量删除的方式一

Mybatis学习笔记(尚硅谷版整理)_第101张图片

  • 批量删除的方式二:用separator="or" 隔开

Mybatis学习笔记(尚硅谷版整理)_第102张图片

Mybatis学习笔记(尚硅谷版整理)_第103张图片

  1. 实现批量添加

要用@Params  指定访问的对象

Mybatis学习笔记(尚硅谷版整理)_第104张图片

注意,这里不能加open和close取代两个括号,open和close指的是在所有内容外面加开始符和结束符,而程序里的()是每个循环体加的

Mybatis学习笔记(尚硅谷版整理)_第105张图片

Mybatis学习笔记(尚硅谷版整理)_第106张图片

sql标签

将常用的sql片段进行记录,要用的时候就直接引用

通过sqlinclude 实现

Mybatis学习笔记(尚硅谷版整理)_第107张图片

MyBatis的缓存

缓存 :把当前查询的数据进行记录,下次查询相同数据时就会从缓存中直接获取

缓存只对查询功能有效

一级缓存

一级缓存是默认开启的,通过同一个sqlSession 对象获得的两个不同的mapper也能共享缓存

Mybatis学习笔记(尚硅谷版整理)_第108张图片

Mybatis学习笔记(尚硅谷版整理)_第109张图片

如果两次查询之间有任意一次增删改操作,缓存就会消失

二级缓存

二级缓存是SqlSessionFactory 级别,范围比一级缓存大,需要手动开启。

通过同一个SqlSessionFactory 创建的SqlSession查询的结果会被缓存;如果再次指向相同的查询语句,结果就会从缓存中获取

二级缓存开启条件

Mybatis学习笔记(尚硅谷版整理)_第110张图片

a>全局配置属性就是那个settings

b> 设置标签

Mybatis学习笔记(尚硅谷版整理)_第111张图片

c> sqlSession.commit() / sqlSession.close()

d>

Mybatis学习笔记(尚硅谷版整理)_第112张图片

执行

Mybatis学习笔记(尚硅谷版整理)_第113张图片

结果

命中率不是0,证明缓存生效了

Mybatis学习笔记(尚硅谷版整理)_第114张图片

二级缓存失效的情况

两次查询之间执行了任意的增删改,会使一级缓存和二级缓存同时失效

sqlSession.clearCache() 手动清空缓存只对一级缓存有效

二级缓存的相关配置

Mybatis学习笔记(尚硅谷版整理)_第115张图片

MyBatis查询缓存的顺序

Mybatis学习笔记(尚硅谷版整理)_第116张图片

整合第三方缓存EHCache

只能代替二级缓存,不能代替一级缓存(现在好像都用redis了)

  1. 添加依赖

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

Mybatis学习笔记(尚硅谷版整理)_第117张图片

  1. jar包功能w

Mybatis学习笔记(尚硅谷版整理)_第118张图片

  1. 创建EHCache的配置文件ehcache.xml

Mybatis学习笔记(尚硅谷版整理)_第119张图片

  1. 设置二级缓存的类型

在映射文件中设置

  1. 加入logback日志

Mybatis学习笔记(尚硅谷版整理)_第120张图片

  1. EHCache配置文件说明

懒得看了

逆向工程

  • 正向工程:先创建java实体类,由框架负责根据实体类生成数据库表。Hibernate支持正向工程
  • 逆向工程:先创建数据库表,又框架负责根据数据库表,反向生成如下资源:
  • java实体类
  • Mapper接口
  • Mapper映射文件

创建逆向工程的步骤

(在尚硅谷的资料里)

  • 添加依赖和插件
  • 创建MyBatis的核心配置文件
  • 创建逆向工程的配置文件
  • 执行MBG插件的generate目标

注意加junitjar包要加在plugins的外面

简洁版 :只有增删查改功能(查询包括查询一个和查询全部),一共5种功能(MyBatis3Simple

全面版 :可能是全都有吧 (MyBatis3

Mybatis学习笔记(尚硅谷版整理)_第121张图片

生成的函数:

  • example:根据条件来执行
  • slective:选择性添加

OBG查询

查询全部信息

Mybatis学习笔记(尚硅谷版整理)_第122张图片

查询某条信息

Mybatis学习笔记(尚硅谷版整理)_第123张图片

修改

  • updateByPrimaryKey :不带一个为null的话也继续修改
  • updateBySelective  :为null的时候不会修改属性的字段

分页插件

步骤:

  • 添加依赖
  • 配置分页插件

Mybatis学习笔记(尚硅谷版整理)_第124张图片

分页插件的使用:

  1. 需要在getMapper 之后设置PageHelper ,在查询功能之前开启分页
  1. 在查询功能之后获取分页相关信息

PageInfo page = new PageInfo<>(list, 5);

list表示分页数量 5表示当前导航分页的数量

Mybatis学习笔记(尚硅谷版整理)_第125张图片

Mybatis学习笔记(尚硅谷版整理)_第126张图片

Mybatis学习笔记(尚硅谷版整理)_第127张图片

常用数据

Mybatis学习笔记(尚硅谷版整理)_第128张图片

Mybatis学习笔记(尚硅谷版整理)_第129张图片

你可能感兴趣的:(java,java,后端)