Java进阶 – MyBatis查询数据库 && Spring Boot 单元测试 – 细节狂魔

文章目录

  • 前言
  • 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

对于后端开发来说,程序是由以下两个重要的部分组成的

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 插件 添加。

Java进阶 - MyBatis查询数据库 && Spring Boot 单元测试 - 细节狂魔

?

1.3、配置 MyBatis 保存的 xml 的目录

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年7月16日
下一篇 2022年7月16日

相关推荐