文章目录
- 前言
- 1.MyBatis 是什么/li>
- 为什么要学习 MyBatis
- 怎么学 MyBatis/li>
- 1、创建 MyBatis 项目
-
- 准备工作:创建数据库 和 数据表
- 1.1、添加 MyBatis 相关依赖
-
- 1、新建一个 MyBatis 项目
- 2、在老项目中引入 MyBatis 相关依赖
- 1.2、配置数据库连接字符串
- 1.3、配置 MyBatis 保存的 xml 的目录
- 使用 MyBatis 的操作模式 操作数据库
-
- MyBatis 的操作模式
- 第?个MyBatis查询:实现一个根据用户id来查询用户信息的操作
-
- 1、定义接口
- 2、创建 xml,实现上面的接口
- 运行结果展示
- 注意!有的人可能会在这一步出现问题
- MyBatis 执行过程
- Spring Boot的单元测试 – 穿插内容
-
- 1.什么是单元测试/li>
- 2、单元测试有哪些好处/li>
- 3.Spring Boot 单元测试使用
-
- 单元测试的实现步骤
-
- 1.?成单元测试类
- 2 添加单元测试代码
-
- 1.添加 Spring Boot 框架测试注解:@SpringBootTest
- 2.添加单元测试业务逻辑
- 3、开启测试
- 4、简单的断?说明
- 拓展:“小鸟” – 插件 MyBatisX
- 增、删、该操作
-
- MyBatis 修改操作
- 在不修改数据库中数据的情况下,完成单元测试 – 穿插
-
- MyBatis 删除操作
-
- 1、在 mapper 中的 UserInfoMapper 接口中定义 方法
- 2、在xml文件中 编写 SQL语句 的相关代码。
- 单元测试 – 验证功能效果
- MyBatis 插入操作
-
- 先实现最简单 的 插入操作
-
- 1、在 mapper 中的 UserInfoMapper 接口中定义 方法
- 2、在xml文件中 编写 SQL语句 的相关代码。
- 3、进行单元测试
- 上面最简单的实现方式,下面我们来看难一点的实现。
-
- 先来看第二步:在xml文件中 编写 SQL语句 的相关代码。
- 再来看一步:在 mapper 中的 UserInfoMapper 接口中定义 方法。
- 我们测试一下。
- 查询操作
-
- 单表查询
- 参数占位符 #{} 和 ${} 的区别
- ${} 的经典问题:SQL注入问题
- like 查询 – 特殊情况
- #{} 和 ${} 的区别总结
- 多表查询
-
- 前置知识
-
- 返回类型:resultType
- 返回字典映射: resultMap
-
- resultType && resultMap 的区别
- 有了 resultMap 和 resultType 的基础,我们下面就可以真正开始进行多表查询的操作了。
-
- MyBatis 多表查询:一对一关系
- MyBatis 多表查询:一对多关系
- 复杂情况:动态SQL使?
-
- 动态标签 – 标签
- 动态标签 – 标签
- 动态标签 – 标签
- 动态标签 – 标签
- 动态标签 – 标签
前言
经过前?的学习咱们 Spring 系列的基本操作已经实现的差不多了,接下来,咱们来学习更重要的知识,将前端传递的数据存储起来,或者查询数据库??的数据。
?
1.MyBatis 是什么/h2>
MyBatis 是?款优秀的持久层框架,它?持?定义 SQL、存储过程以及?级映射。
MyBatis 去除了?乎所有的 JDBC 代码以及设置参数和获取结果集的?作。
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接?和 Java POJO(Plain Old Java Objects,普通?式 Java 对象)为数据库中的记录。
简单来说 MyBatis 是更简单完成程序和数据库交互的?具,也就是更简单的操作和读取数据库?具。
Mybatis官?
?
针对 MyBatis 是?款优秀的持久层框架 进行分析和补充。
MyBatis,也是一个 ORM 框架。
ORM(Object Relational Mapping),即对象关系映射。
在?向对象编程语?中,将关系型数据库中的数据与对象建?起映射关系,进??动的完成数据与对象的互相转换:
1、 将输?数据(即传?对象)+SQL 映射成原? SQL
2、将结果集映射为返回对象,即输出对象
?
ORM 把数据库映射为对象:
数据库表(table)>>> 类(class)
记录(record,?数据)>>> 对象(object)
字段(field) >>> 对象的属性(attribute)
?般的 ORM 框架,会将数据库模型的每张表都映射为?个 Java 类。
也就是说使? MyBatis 可以像操作对象?样来操作数据库中的表,可以实现对象和数据库表之间的转换。
?
即:MyBatis 可以称为是一座“桥梁”。
它的作用就是:将 数据库 和 程序,映射起来。
映射起来之后,就可以做一系列的操作了。
比如:
查询,由于我们将 数据库 与 程序映射起来了,直接就把整个数据表映射到一个类里。
查询的结果,就是一个集合,存储的是类的对象(插叙到的一行行记录),那数据也就查询到了。
?
保存,还是一样的,我们已经将 数据库 与 程序 映射起来了,把表里面的数据,搞到对象里面了。那我们调用对象的某个方法,是不是就可以直接对象的成员直接保存到 MySQL 里面了呢!
MySQL 和 MyBatis,是不一样的。
MySQL,提供了一个 数据存取(数据管理) 的软件。
而 MyBatis 是一个“中间桥梁”,用于连接 程序 和 数据库,建立关系映射的,进行 数据操作 的中间层(持久层)。
总的来说:
MyBatis 的定义:MyBatis 是一个优秀的 ORM(对象关系映射)持久层框架。
其作用:实现 程序 和 数据库 之间的数据交互。
PS:
ORM 框架,并不是只有 MyBatis 一家!
只是说 MyBatis 在国内使用的标胶广泛,大概占据中国市场的90%以上。
国外用的最多的是Hibernate。
?
至于其中的原因,MyBatis 和 Hibernate 之间的区别等等。。。
包括 在 Hibernate 之后,又有一个 Spring JPA,与其又有和区别br> 等 MyBatis 讲完之后,再给你们讲。
(前提是我还记得,没写你们就自己百度吧)
MyBatis ?持?定义 SQL
自定义SQL,包含的范围就很广了。
数据库中的 “CURD(增删查改)”语句,都是可以实现的。
自定义SQL嘛,我们想写什么SQL,就写什么SQL。
由此,不难看出 MyBatis 一个 最大的特点:灵活!
这也是为什么 MyBatis 在国内能够流行的重要原因!!!
?
其背后的原因,就是国内用户的需求实在是太奇葩了,参差不齐!!
?
举个生活周围的例子:
几乎所有大学,都会有 计算机专业。
但是!有哪个学校是有 关于 互联 产品的专业有!!!
大学不会教,外面培训班又少。
大部分都是 考研的培训班,再其次就是关于 计算机 的培训。
计算机的发展,还是比较成熟的。
但是呢!关于 产品经理 和 产品 的 培训,基本上做这个培训的机构。
反正我是没见过。
原因,就是因为它的市场占有率不高,看不到利益的苗头。
自然也就不会与人去做这件事。
这么说吧:在有些公司,根本就没有产品经理,这个职位。
?
因此,我们以后所遇到的产品经理,大部分都是只长了一张嘴,会提需要,但是不知道这个需求实现起来,有多复杂!
因为没有培训过,再加上现在的产品经理,大部分都是不懂技术的,
因此,他们提出的需求,千奇百怪。
于是就有了 手机壳的那个段子,完全就是扯犊子。
一个软件,一个硬件,八竿子打不着的两个东西。
?
因此,MyBatis 灵活性 的作用,就体现出来了。
就是为了 适应 各种需求。
国外,对于 技术 和 产品 已经流程化了,都是经过培训的。
毕竟计算机,外国才是起源地嘛,发展的快,也是很容易理解的。
发展倒极致,就是稳定了。
存储过程
我之前将的 SQL,不管是多玛复杂的SQL,我们都是一行SQL解决。
因为 SQL中,并没有特别复杂的业务,像 for循环,if判断。。。这些都没有。
就是一个 很平滑,单一维度 的 SQL 操作,这是针对于 普通 SQL。
?
但是!存储过程,是SQL中的方法,它是由一大堆 SQL 的组成的。
这个组成里面,它是有循环的,判断的,分支的,有变量传递的。
这个就叫做存储过程,也就是将 SQL 方法化。
反过来理解:
SQL 方法化 的过程所产生的东西,就叫做存储的过程 。
?
以后,我们工作了之后,别人给我们一存储过程,里面就是密密麻麻的SQL语句。
还有 if 判断,for循环,设置变量的值…
然后,入参,出参,反正就是很大一串的SQL语句。
少则 几十行,多则 上千行。
?
那为什么我们程序员不会这个存储过程呢br> 这其实和 存储过程 的 特性相关的。
虽然 存储过程 能够实现复杂的业务,但是!这只是 将业务 从 程序方 移动到了 SQL 方。
这种情况下,公司对 程序员的要求 就会非常高!!!
?
试想一下:公司给一个 存储过程,一个几百行的 SQL语句,你估计眼睛都花了。
你能看得懂,才有鬼。。。
?
但是 总得有人来做吧,这就诞生一个特殊的职业 DBA。
DBA:Database Administrator —— 数据库管理员,又称数据库开发工程师 。
他的SQL是很牛的,他不用写程序的。
每天都是在捣鼓 SQL 语句的,只玩数据库的,玩数据的。
?
对于 大部分程序员来说:根本就搞不懂 存储过程 ,这么复杂的东西!
而且,存储过程中有一个特别特别难用的东西!
我们在敲一个很复杂的 java 代码的时候,可以通过 debug 可以一步一步去调试,进入类,方法,属性中,来观察运行时的状态。从而能够帮助我们排查程序中存在的错误。也及时 程序 是能够调试的。
?
但是 存储过程 是不能调式的。
也就是说:一个存储过程,有这几百行的SQL语句,要我们去写。
而且,出现了错误,只能通过肉眼去排查错误。【不支持调试】
我敢说:百分之90的程序员,都做不到这一点。
这是属于 真正的天才,才能胜任的工作。
但是!也请放心!
公司也不可能让我们程序员去做这件事的。
一般都是外聘的专业人员来操作的。
存储过程,用的最多的就是 医院。
医院需要对每天,每月,每年,进行数据(收入,考勤。。。)汇总(各种 表)。
总之涉及到数据,非常多。
这就需要从各个数据表中 抽取数据。
此时 简单的SQL语句,就搞不定了。
这个时候,才会用到存储过程。
?
由于存储过程 的难度,非常大!
对人要求很高,随之而来的就是高额的工资。
大概是我们程序员工资的 1.5 倍以上。
即:招一个程序员约定1万工资,那 DBA 的工资,至少是 1w5 以上,要不然你找不到人的。
高级映射
MyBatis 去除了?乎所有的 JDBC 代码以及设置参数和获取结果集的?作。
以往,我们在进行 JDBC 编程的时候,需要获取数据源对象(DataSource),然后设置三个属性 URL(数据源路径),用户名(默认是 root),密码(MySQL的登录密码)。
在设置完这三项之后,然后才能与数据连接,进行一系列的操作。
?
另外在获取 结果集的时候,我们需要使用到一个 类(ResultSet)的对象,来接收数据库返回的结果集,还需要通过 迭代器的方式,才能进行后续的打印。
?
使用了 MyBatis ,上鞋这些就都不需要了。
它会自动帮我们实现映射,
我们只需要写 SQL 语句(不要写错),写完之后,它会把这个 SQL语句 执行,将 查询到的结果(表数据),直接全部映射到对象里面。
也就是说: JDBC 的前置操作的代码,我们一行都不需要写。
MyBatis 直接全包了,你直接用就行。
特别爽!
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接?和 Java POJO(Plain Old Java Objects,普通?式 Java 对象)为数据库中的记录。
MyBatis 是?款优秀的持久层框架,它?持?定义 SQL、存储过程以及?级映射。
MyBatis 去除了?乎所有的 JDBC 代码以及设置参数和获取结果集的?作。
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接?和 Java POJO(Plain Old Java Objects,普通?式 Java 对象)为数据库中的记录。
简单来说 MyBatis 是更简单完成程序和数据库交互的?具,也就是更简单的操作和读取数据库?具。
Mybatis官?
?
针对 MyBatis 是?款优秀的持久层框架 进行分析和补充。
MyBatis,也是一个 ORM 框架。
ORM(Object Relational Mapping),即对象关系映射。
在?向对象编程语?中,将关系型数据库中的数据与对象建?起映射关系,进??动的完成数据与对象的互相转换:
1、 将输?数据(即传?对象)+SQL 映射成原? SQL
2、将结果集映射为返回对象,即输出对象
?
ORM 把数据库映射为对象:
数据库表(table)>>> 类(class)
记录(record,?数据)>>> 对象(object)
字段(field) >>> 对象的属性(attribute)
?般的 ORM 框架,会将数据库模型的每张表都映射为?个 Java 类。
也就是说使? MyBatis 可以像操作对象?样来操作数据库中的表,可以实现对象和数据库表之间的转换。
?
即:MyBatis 可以称为是一座“桥梁”。
它的作用就是:将 数据库 和 程序,映射起来。
映射起来之后,就可以做一系列的操作了。
比如:
查询,由于我们将 数据库 与 程序映射起来了,直接就把整个数据表映射到一个类里。
查询的结果,就是一个集合,存储的是类的对象(插叙到的一行行记录),那数据也就查询到了。
?
保存,还是一样的,我们已经将 数据库 与 程序 映射起来了,把表里面的数据,搞到对象里面了。那我们调用对象的某个方法,是不是就可以直接对象的成员直接保存到 MySQL 里面了呢!MySQL 和 MyBatis,是不一样的。
MySQL,提供了一个 数据存取(数据管理) 的软件。
而 MyBatis 是一个“中间桥梁”,用于连接 程序 和 数据库,建立关系映射的,进行 数据操作 的中间层(持久层)。
总的来说:
MyBatis 的定义:MyBatis 是一个优秀的 ORM(对象关系映射)持久层框架。
其作用:实现 程序 和 数据库 之间的数据交互。
PS:
ORM 框架,并不是只有 MyBatis 一家!
只是说 MyBatis 在国内使用的标胶广泛,大概占据中国市场的90%以上。
国外用的最多的是Hibernate。
?
至于其中的原因,MyBatis 和 Hibernate 之间的区别等等。。。
包括 在 Hibernate 之后,又有一个 Spring JPA,与其又有和区别br> 等 MyBatis 讲完之后,再给你们讲。
(前提是我还记得,没写你们就自己百度吧)
MyBatis ?持?定义 SQL
自定义SQL,包含的范围就很广了。
数据库中的 “CURD(增删查改)”语句,都是可以实现的。
自定义SQL嘛,我们想写什么SQL,就写什么SQL。
由此,不难看出 MyBatis 一个 最大的特点:灵活!
这也是为什么 MyBatis 在国内能够流行的重要原因!!!
?
其背后的原因,就是国内用户的需求实在是太奇葩了,参差不齐!!
?
举个生活周围的例子:
几乎所有大学,都会有 计算机专业。
但是!有哪个学校是有 关于 互联 产品的专业有!!!
大学不会教,外面培训班又少。
大部分都是 考研的培训班,再其次就是关于 计算机 的培训。
计算机的发展,还是比较成熟的。
但是呢!关于 产品经理 和 产品 的 培训,基本上做这个培训的机构。
反正我是没见过。
原因,就是因为它的市场占有率不高,看不到利益的苗头。
自然也就不会与人去做这件事。
这么说吧:在有些公司,根本就没有产品经理,这个职位。
?
因此,我们以后所遇到的产品经理,大部分都是只长了一张嘴,会提需要,但是不知道这个需求实现起来,有多复杂!
因为没有培训过,再加上现在的产品经理,大部分都是不懂技术的,
因此,他们提出的需求,千奇百怪。
于是就有了 手机壳的那个段子,完全就是扯犊子。
一个软件,一个硬件,八竿子打不着的两个东西。
?
因此,MyBatis 灵活性 的作用,就体现出来了。
就是为了 适应 各种需求。国外,对于 技术 和 产品 已经流程化了,都是经过培训的。
毕竟计算机,外国才是起源地嘛,发展的快,也是很容易理解的。
发展倒极致,就是稳定了。
存储过程
我之前将的 SQL,不管是多玛复杂的SQL,我们都是一行SQL解决。
因为 SQL中,并没有特别复杂的业务,像 for循环,if判断。。。这些都没有。
就是一个 很平滑,单一维度 的 SQL 操作,这是针对于 普通 SQL。
?
但是!存储过程,是SQL中的方法,它是由一大堆 SQL 的组成的。
这个组成里面,它是有循环的,判断的,分支的,有变量传递的。
这个就叫做存储过程,也就是将 SQL 方法化。
反过来理解:
SQL 方法化 的过程所产生的东西,就叫做存储的过程 。
?
以后,我们工作了之后,别人给我们一存储过程,里面就是密密麻麻的SQL语句。
还有 if 判断,for循环,设置变量的值…
然后,入参,出参,反正就是很大一串的SQL语句。
少则 几十行,多则 上千行。
?
那为什么我们程序员不会这个存储过程呢br> 这其实和 存储过程 的 特性相关的。
虽然 存储过程 能够实现复杂的业务,但是!这只是 将业务 从 程序方 移动到了 SQL 方。
这种情况下,公司对 程序员的要求 就会非常高!!!
?
试想一下:公司给一个 存储过程,一个几百行的 SQL语句,你估计眼睛都花了。
你能看得懂,才有鬼。。。
?
但是 总得有人来做吧,这就诞生一个特殊的职业 DBA。
DBA:Database Administrator —— 数据库管理员,又称数据库开发工程师 。
他的SQL是很牛的,他不用写程序的。
每天都是在捣鼓 SQL 语句的,只玩数据库的,玩数据的。
?
对于 大部分程序员来说:根本就搞不懂 存储过程 ,这么复杂的东西!
而且,存储过程中有一个特别特别难用的东西!
我们在敲一个很复杂的 java 代码的时候,可以通过 debug 可以一步一步去调试,进入类,方法,属性中,来观察运行时的状态。从而能够帮助我们排查程序中存在的错误。也及时 程序 是能够调试的。
?
但是 存储过程 是不能调式的。
也就是说:一个存储过程,有这几百行的SQL语句,要我们去写。
而且,出现了错误,只能通过肉眼去排查错误。【不支持调试】
我敢说:百分之90的程序员,都做不到这一点。
这是属于 真正的天才,才能胜任的工作。但是!也请放心!
公司也不可能让我们程序员去做这件事的。
一般都是外聘的专业人员来操作的。
存储过程,用的最多的就是 医院。
医院需要对每天,每月,每年,进行数据(收入,考勤。。。)汇总(各种 表)。
总之涉及到数据,非常多。
这就需要从各个数据表中 抽取数据。
此时 简单的SQL语句,就搞不定了。
这个时候,才会用到存储过程。
?
由于存储过程 的难度,非常大!
对人要求很高,随之而来的就是高额的工资。
大概是我们程序员工资的 1.5 倍以上。
即:招一个程序员约定1万工资,那 DBA 的工资,至少是 1w5 以上,要不然你找不到人的。
高级映射
MyBatis 去除了?乎所有的 JDBC 代码以及设置参数和获取结果集的?作。
以往,我们在进行 JDBC 编程的时候,需要获取数据源对象(DataSource),然后设置三个属性 URL(数据源路径),用户名(默认是 root),密码(MySQL的登录密码)。
在设置完这三项之后,然后才能与数据连接,进行一系列的操作。
?
另外在获取 结果集的时候,我们需要使用到一个 类(ResultSet)的对象,来接收数据库返回的结果集,还需要通过 迭代器的方式,才能进行后续的打印。
?
使用了 MyBatis ,上鞋这些就都不需要了。
它会自动帮我们实现映射,
我们只需要写 SQL 语句(不要写错),写完之后,它会把这个 SQL语句 执行,将 查询到的结果(表数据),直接全部映射到对象里面。
也就是说: JDBC 的前置操作的代码,我们一行都不需要写。
MyBatis 直接全包了,你直接用就行。
特别爽!
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接?和 Java POJO(Plain Old Java Objects,普通?式 Java 对象)为数据库中的记录。
?
为什么要学习 MyBatis
对于后端开发来说,程序是由以下两个重要的部分组成的
1、后端程序
2、数据库
?
怎么学 MyBatis/h2>
?
1、创建 MyBatis 项目
准备工作:创建数据库 和 数据表
下面我们会创建一个关于 博客 的 数据库 mycnblog
并且在 mycnblog 数据库中创建三张表。
代码给你们了,戴氏!里面暗藏 “杀机”。
会导致 产生一个 BUG,不然有解决的方法,
先就这么弄。不过有一点需要注意!
在 文章表中的 content字段,它的类型是 text。
text 能够表示文本内容有限,在实际情况中,一般是使用 longtext。
另外, createtime 字段,我们使用了一个 now 方法,这个 now 方法,需要 MySQL 的版本,在5.5以上。
不过应该问题不大,毕竟我们 与 jdk1.8 配套的数据库版本,是 5.7版本的。
?
你仔细看下面创建 SQL,无论是创建 数据库,还是数据表,我都设置了 字符集为 utf8。
确保一定是支持中文的。
这样做的好处,就是:哪怕你们没有修改数据库的配置,创建出来的表,仍是是支持中文的。
?
还有一个小细节:在添加一个用户信息的SQL语句中,我们的密码是明文存储的。
这样去写,势必会遭到 面试官的吐槽。
即使你使用了 md5 进行加密,其实也没有多大作用。
如果只是一个 md5,其实我们可以通过 “彩虹表” 进行穷举,来获取你的密码。(注意!这不是解密,是穷举你密码的可能性)
有人肯恩就会想法:
密码 在一次 md5 的情况下,能够通过 彩虹 表 来穷举 获取密码。
那我们 对 密码 md5 两次,甚至更多呢br> 那 彩虹表是不是就破解不了了
你都能想得到,别人黑客就想不到吗
别说两次,就算你 3次,4次,甚至是五次,人家 应对方法的。
而且,无论你md5加密几次,其实就是累加的效果,对于黑客来说无非就是多 穷举几次而已。
最靠谱的方式,就是有随机数的,有变量的。
这样做更靠谱!
因为是随机生成的嘛,没有规律可言!
想要获取密码,就非常难!
几乎是不可能的。
?
2、在老项目中引入 MyBatis 相关依赖
这个讲了很多次,使用 Edit Starter 插件 添加。
![]()
?
1.3、配置 MyBatis 保存的 xml 的目录
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!