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

Mybatis

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

笔记

Mybatis框架搭建

步骤

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

  • 创建实体类

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

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

  • 创建mapper接口

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

创建映射文件

.xml

ORM :Object Relation Mapping 对象关系映射

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

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

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

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

引入映射文件

添加测试功能

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

优化功能

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

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

  • 日志功能
  • 引入依赖

  • XML文件

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

添加修改和删除功能

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

添加查询功能

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

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

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

查询所有对象 :用list

核心配置文件

解释

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

属性:

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

<environment> 配置某个具体环境

属性:

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

<transactionManager>:设置事务管理方式

属性:"JDBC|MANAGED"

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

MANAGED: 被管理,例如Spring

<dataSource>:配置数据源

属性:

type:设置数据源的类型

type="POOLED|UNPOOLED|JNDI"

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

UNPOOLED:不使用数据库连接池

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

properties

  1.  jdbc.properties

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

typeAliases

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

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

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

Package (最常用)

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

Mappers

引入映射文件

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

要求

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

Mybatis获取参数值的两种方式

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

获取参数值的各种形式

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

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

  • #{}

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

  • ${}

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

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

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

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

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

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

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

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

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

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

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

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

 最好整合为两种情况

  • 实体类
  • @Param

@Param注解源码解析

MyBatis的各种查询功能

查询一个实体类对象

查询一个list集合

查询表中的总记录数

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

mybatis内置的类型别名

一般常用的类型别名

返回值为map集合

查询结果

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

查询多个用户信息

  1. List集合包含住map

  1. @MapKey

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

结果

特殊SQL的执行

MyBatis处理模糊查询

  1. ${}的形式

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

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

  1. concat进行拼接

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

批量删除

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

正确的方法

动态设置表名

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

正确的方法

添加功能获取自增的主键

应用场景

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

添加操作,主键自增

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

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

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

自定义映射resultMap

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

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

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

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

  • 使用resultType

见下文

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

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

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

resultMap:设置自定义映射关系

id:唯一标识,不能重复

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

子标签:

id:设置主键的映射关系

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

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

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

处理多对一映射处理

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

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

结果

  1. 使用association处理映射关系

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

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

javaType :该类型的属性

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

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

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

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

column :设置分步查询的条件

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

延迟加载

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

  1. 开启懒加载

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

结果

不开启延迟加载的结果

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

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

一对多映射处理

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

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

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

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

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

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

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

这里还是使用collection

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

  • test函数

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

动态SQL

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

if标签

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

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

结果

where标签

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

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

结果

执行的sql语句没有去掉and

trim标签

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

choosewhenotherwise标签

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

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

foreach标签

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

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

seperator :循环体之间的分隔符

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

close :结束符

  1. 实现批量删除

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

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

  • 批量删除的方式一

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

  1. 实现批量添加

要用@Params  指定访问的对象

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

sql标签

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

通过sqlinclude 实现

MyBatis的缓存

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

缓存只对查询功能有效

一级缓存

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

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

二级缓存

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

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

二级缓存开启条件

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

b> 设置标签

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

d>

执行

结果

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

二级缓存失效的情况

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

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

二级缓存的相关配置

MyBatis查询缓存的顺序

整合第三方缓存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

  1. jar包功能w

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

  1. 设置二级缓存的类型

在映射文件中设置

  1. 加入logback日志

  1. EHCache配置文件说明

懒得看了

逆向工程

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

创建逆向工程的步骤

(在尚硅谷的资料里)

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

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

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

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

生成的函数:

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

OBG查询

查询全部信息

查询某条信息

修改

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

分页插件

步骤:

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

分页插件的使用:

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

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

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

常用数据

  • 13
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值