【Java Web】009 -- MyBatis(入门 增删改查 动态SQL)

目录

前言

什么是MyBatis?

一、MyBatis 入门

1、快速入门

①、案例介绍

②、实现过程

③、小结

④、扩展:配置SQL提示

2、JDBC介绍

①、本质

②、JDBC操作数据库代码示例

③、原始JDBC存在的问题

④、MyBatis是如何解决原始JDBC存在的问题的?

⑤、小结

3、数据库连接池

①、有无数据库连接池的对比

②、数据库连接池的优势

③、怎么实现数据库连接池

④、小结

4、lombok

①、介绍

二、MyBatis基础操作

1、环境准备

①、需求说明

②、准备工作

2、删除

①、根据主键删除

②、日志输出

③、预编译SQL

④、SQL注入

⑤、参数占位符(占位符不只#{},还有${})

⑥、小结

3、新增(插入数据)

①、新增示例

②、主键返回

③、小结

4、更新

①、更新示例

②、小结

5、查询

①、示例:根据ID查询

②、MyBatis的数据封装

③、条件查询

④、参数名说明

6、XML映射文件(通过XML文件实现MyBatis)

①、规范(三点)

②、XML映射文件插件(MyBatisX)

③、如何选择注解和XML?

④、小结

三、MyBatis动态SQL

1、标签

①、基础写法

②、案例:完善更新员工操作,改为动态SQL

③、小结

2、标签

①、批量删除操作

②、小结

3、标签(这两个标签配套使用)

4、小结


前言

什么是MyBatis?

MyBatis 官网: MyBatis中文网

一、MyBatis 入门

1、快速入门

①、案例介绍

案例:使用 MyBatis 查询所有用户数据

在 Java 中编写 SQL 语句,发送给服务器

实现步骤

注意:在 MyBatis 的开发当中,我们只需要定义这个 Mapper 接口即可,是不需要定义它的实现类的,因为程序在运行时,框架底层会自动生成这个接口的实现类对象。

②、实现过程

Ⅰ、创建一个SpringBoot工程:

勾选 MyBatis 相关依赖:

Ⅱ、删除多余文件,保持项目整洁:

Ⅲ、数据库表与实体类的创建:

数据库表的创建可以在数据库中直接执行SQL文件解决;

实体类的创建:

Ⅳ、配置数据库的连接信息 -- application.properties(四要素):

Ⅴ、创建 Mapper 接口:

Ⅵ、基础代码写好后,进行单元测试:

效果展示:

③、小结

第一步:

第二步:

第三步:

第四步:

④、扩展:配置SQL提示

我们可以在Mapper接口中配置SQL提示:

配置方法:

但是一开始配置的提示,是无法识别数据表信息的,解决办法就是 IDEA中配置MySQL数据库连接

2、JDBC介绍

①、本质

②、JDBC操作数据库代码示例

这里的封装结果数据,需要有多少个字段就要解析多少个字段,最终效果展示:

③、原始JDBC存在的问题

  • 硬编码:每次改动都需要重新编译
  • 封装数据臃肿且繁琐
  • 频繁的创建/释放数据库连接,会造成资源的浪费,导致性能下降

④、MyBatis是如何解决原始JDBC存在的问题的?

我们使用SpringBoot来整合MyBatis进行数据库操作的时候,主要关注两点:

⑤、小结

3、数据库连接池

类似于线程池:

①、有无数据库连接池的对比

如果没有数据库连接池:(随用随创建)

而有了数据库连接池:(在一开始就初始化了一定数量的连接对象),这样的话就可以做到连接的复用,而不是每一次都要新创建一个连接,同时数据库连接池还具有(空闲时间检测,当其监测到分配给客户端的连接对象空闲时间超过了指定时间,则将会把该连接释放,归还给连接池)

②、数据库连接池的优势

③、怎么实现数据库连接池

SpringBoot项目默认连接池:(HikariCP 来源于日语,意思为「光」,意味着它很快)

而Druid是阿里巴巴开源的数据库连接池项目:

切换数据库连接池:(主要就是切换pom.xml中的依赖)GitHub上有详细介绍

运行效果展示:

结构框图:

④、小结

4、lombok

简化实体类的方法:

①、介绍

但要想使用lombok,那么首先就要引入lombok的依赖:

示例:

注意事项:

lombok插件:

二、MyBatis基础操作

1、环境准备

①、需求说明

②、准备工作

具体可参考一中的快速入门案例

实体类中的注意点:

Mapper接口:(加上了@Mapper注解,就代表程序在运行时会自动的创建接口的代理对象,并且会将这个代理对象放入到 IOC 容器当中)

2、删除

①、根据主键删除

示例

根据 ID 删除数据

EmpMapper.java(delete这里是有返回值的,返回的是影响的操作数)

单元测试:

效果展示:

②、日志输出

运行之后效果展示:

③、预编译SQL

采用预编译SQL具有两大优势:

④、SQL注入

示例:(直接拼接SQL的方式)

而在预编译SQL中,这种方法则无法奏效:(这是因为在预编译SQL中无论你输入了什么,你输入的参数都将作为一个完整的数据添到占位符?处)

⑤、参数占位符(占位符不只#{},还有${})

但${}会直接将参数拼接在SQL语句中,存在SQL注入风险,所以一般情况下都使用#{}方式即可

⑥、小结

3、新增(插入数据)

①、新增示例

示例

新增员工:(Mapper)

单元测试:

效果展示:

先写出SQL语句,再考虑在MyBatis当中,我该如何执行这条语句:(属性名一般以驼峰命名)

②、主键返回

默认情况下,执行基础的插入操作是不会把主键值返回的,我们如果想拿到这个主键值,我们该怎么做呢?(加入注解@Options()

③、小结

4、更新

①、更新示例

示例:根据主键修改员工的信息

更新数据:(SQL语句)

(Mapper):

单元测试:

效果展示:

②、小结

5、查询

①、示例:根据ID查询

SQL语句:

Mapper:

单元测试:

效果展示:

我们仔细看一下示例中的效果展示,结果发现,前面的数据都返回回来了,但是最后的三个属性却显示为null:

这就需要看一下MyBatis中的数据封装

②、MyBatis的数据封装

属性没有封装成功的原因就是因为类中的属性名与表中的字段名不一致

解决方案一:给字段起别名,让别名与实体类属性一致

解决方案二:通过@Results@Result注解手动映射封装(因为其写法过于臃肿,实际开发中一般不怎么用)

解决方案三:开启MyBatis的驼峰命名自动映射开关

application.properties:

开启之后,就可以按照原来的写法返回查询了

但使用第三种方式是有前提的,你需要严格按照书写规范,数据库中的字段名用下划线分隔,类中的属性名采用驼峰命名的方式,才能自动完成映射

③、条件查询

示例:

Mapper语句

【注意点】:#{}是不能出现在‘’中的,那么在进行模糊查询的时候,我们可以把 #{} 改为 ${}

应将其改为:

单元测试:

效果展示:

但是由于模糊查询这里我们使用的是 ${} 的方式实现的,这就会导致性能低,存在SQL注入问题的风险,我们可以通过 concat 字符串拼接函数来解决该问题:

④、参数名说明

这是因为在1.x版本中,在对Mapper接口进行编译的过程中,它并不会保留方法的形参名称,就比如:name, gender, begin, end 并不会在编译之后的字节码文件中保留,在生成的字节码文件中最终形成的形参的名字就成了下列的形式:

此时,就无法将形参和名称对应起来,所以需要额外加上一个@Param注解进行解释,而在2.x版本,在编译时,这些形参名会被保留下来:

6、XML映射文件(通过XML文件实现MyBatis)

①、规范(三点)

示例:创建一个XML映射文件

Ⅰ、在 resources 目录下创建包:(不用.,而是使用/ 分隔)

Ⅱ、创建XML文件,XML语法规范可以在MyBatis官网查询到

问题:为什么要遵循以上三点规范?

:因为两个文件是独立的,没有任何关联,我们需要通过以上规范来给它们建立关联关系

②、XML映射文件插件(MyBatisX)

可以实现语法的快速定位:

③、如何选择注解和XML?

简单来说:

④、小结

三、MyBatis动态SQL

我们想实现的效果:这个查询是根据输入的条件动态组装的,如我们要查询姓名,则只根据姓名进行查询,而实现这种查询的方式就是动态SQL

1、<if>标签

①、基础写法

XML语句:

单元测试:

效果展示:(没有查询 entrydate 与 update_time)

我们将单元测试语句改为下列形式:

如果XML中的语句没变,则会出现以下错误:(提示语法错误,多了一个and)

解决办法:将where关键字替换为<where>标签,用来动态生成where关键字,以及自动清除语句中的and 或者 or

 

②、<if>案例:完善更新员工操作,改为动态SQL

之前写的update方法,如果某些字段没有赋值为空的话,也会将对应的字段赋值为空:

所以需要为其改为动态更新:(由于我们之前安装了MyBatisX,所以可以利用其自动生成)

生成:(标签会根据方法名进行生成,如这里是update,就给你生成update标签)

改造SQL语句:

单元测试:

效果展示:(仅更新了赋值的字段)

但是上列改造之后的SQL语句仍不完美,需要将其set关键字替换为<set>标签,作用与<where>类似

③、小结

2、<foreach>标签

①、批量删除操作

示例:

批量删除员工:(Mapper)

(XML):

单元测试:

②、小结

3、<sql><include>标签(这两个标签配套使用)

如果XML中存在大量的重复语句时,就可以使用<sql><include>标签进行复用

4、小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/7457.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis学习】Redis10大数据类型

总体概述 这里说的数据类型是value的数据类型&#xff0c;key的类型都是字符串。 redis字符串&#xff08;String&#xff09; string是redis最基本的类型&#xff0c;一个key对应一个Tvalue。 string类型是二进制安全的&#xff0c;意思是redis的string可以包含任何数据&am…

Java并发编程(4) —— Java 内存模型(JMM)详解

一、CPU缓存一致性问题 1. CPU缓存模型 CPU Cache 通常分为三级缓存&#xff1a;L1 Cache、L2 Cache、L3 Cache&#xff0c;级别越低的离 CPU 核心越近&#xff0c;访问速度也快&#xff0c;但是存储容量相对就会越小。其中&#xff0c;在多核心的 CPU 里&#xff0c;每个核心…

勒索软件正在从 Windows 转向 Linux

导读听说勒索软件正在从 Windows 转向 Linux了勒索软件正在从 Windows 转向 Linux 最近几周&#xff0c;黑客们一直在对 Linux 企业网络部署 IceFire 勒索软件&#xff0c;这是一个值得注意的转变&#xff0c;因为它曾经是一个只针对 Windows 的恶意软件。与 Windows 相比&…

统一结果封装异常处理

统一结果封装&异常处理2&#xff0c;统一结果封装2.1 表现层与前端数据传输协议定义2.2 表现层与前端数据传输协议实现2.2.1 环境准备2.2.2 结果封装步骤1:创建Result类步骤2:定义返回码Code类步骤3:修改Controller类的返回值步骤4:启动服务测试3&#xff0c;统一异常处理3…

基于Pytorch的可视化工具

深度学习网络通常具有很深的层次结构&#xff0c;而且层与层之间通常会有并联、串联等连接方式。当使用PyTorch建立一个深度学习网络并输出文本向读者展示网络的连接方式是非常低效的&#xff0c;所以需要有效的工具将建立的深度学习网络结构有层次化的展示&#xff0c;这就需要…

chatGPT的未来应用有哪些-ChatGPT对未来工作的影响

ChatGPT对未来的影响 ChatGPT 是一种先进的自然语言处理技术&#xff0c;能够处理和理解大量的自然语言数据和信息&#xff0c;具有广泛的应用价值。以下是 ChatGPT 可能对未来的影响&#xff1a; 改变人与计算机的交互方式。ChatGPT 的普及应用&#xff0c;将使得人们可以通过…

网络安全书籍推荐+网络安全面试题合集

一、计算机基础 《深入理解计算机系统》《鸟哥的Linux私房菜》《TCP/IP详解&#xff08;卷1&#xff1a;协议&#xff09;》《HTTP权威指南》《Wireshark数据包分析实战》《Wireshark网络分析的艺术》《Wireshark网络分析就这么简单》 二、网络渗透 《白帽子讲Web安全》《Web…

2023年五一数学建模竞赛来袭

1.竞赛介绍 五一数学建模竞赛由江苏省工业与应用数学学会&#xff0c;中国矿业大学&#xff0c;徐州市工业与应用数学学会联合举办&#xff0c;历史悠久&#xff0c;距离第一届比赛已经有20年历史&#xff0c;可以说是仅次于高教社杯国赛的一项数学建模竞赛。比较适合数模竞赛…

浅谈JVM(五):虚拟机栈帧结构

上一篇&#xff1a; 浅谈JVM(一)&#xff1a;Class文件解析 浅谈JVM(二)&#xff1a;类加载机制 浅谈JVM(三)&#xff1a;类加载器和双亲委派 浅谈JVM(四)&#xff1a;运行时数据区 5.虚拟机栈帧结构 ​ 方法是程序执行的最小单元&#xff0c;每个方法被执行时都会创建一个栈帧…

关于CH32F203程序下载方式说明

关于CH32F203程序下载方式说明&#x1f389;好久没有写有关wch单片机的相关内容了&#xff0c;具体焊接完2块CH32F203&#xff0c;发现烧写程序遇到了各种囧事。 &#x1f4d3;CH32F203程序下载方式 &#x1f528;通过串口下载。接口为PA9和PA10不知道是不是各厂商之间默契的规…

Linux VIM编辑器常用指令

普通模式的基本指令 按键作用yy 复制一行 通常会与p一起使用p将复制的内容写出 数字yy 从当前行往下数数字行进行复制y^复制当前行的起始位到光标的前一位y$复制光标当前位置到行末尾yw复制光标所在的位置之后&#xff08;包括光标&#xff09;的&#xff08;不完整&#xff0…

ffmpeg关于视频前几秒黑屏的问题解决

关于音频播放器视频前两秒黑屏的解决&#xff0c;及QtAV和ffmpeg的环境搭建&#xff08;软件包可以找李青璠提供&#xff0c;也可以自己下&#xff09;首先我们可以参考下面两个博客进行ffmpeg的搭建&#xff0c;第一个博客的问题可以在第二个博客里寻求方法解决。其中第一个博…

多线程的锁策略

文章目录前言一.乐观锁与悲观锁二.轻量级锁和重量锁三.自旋锁和挂起等待锁四.互斥锁和读写锁五.不可重入锁和可重入锁六.公平锁和非公平锁前言 其实这里指的锁策略&#xff0c;不只只是线程才存在的。也不只是针对Java的&#xff0c;我现在就即将介绍常见的锁策略。 一.乐观锁…

Python 自动化指南(繁琐工作自动化)第二版:八、输入验证

原文&#xff1a;https://automatetheboringstuff.com/2e/chapter8/ 输入验证代码检查用户输入的值&#xff0c;比如来自input()函数的文本&#xff0c;格式是否正确。例如&#xff0c;如果您希望用户输入他们的年龄&#xff0c;您的代码不应该接受无意义的答案&#xff0c;如负…

中间表示- 三地址码

使用三地址码的编译器结构 三地址码的基本思想 &#xff08;1&#xff09;给每个中间变量和计算结果命名&#xff0c;没有复合表达式 &#xff08;2&#xff09;只有最基本的控制流&#xff0c;没有各种控制结构&#xff08;if、do、while、for等等&#xff09;&#xff0c;只…

2 新建工程步骤

2 新建工程步骤 0.建立工程文件夹 选择一个程序储存文件&#xff0c;新建一个2-1 STM32工程模板文件夹&#xff0c;在2-1 STM32工程模板文件夹新建一个Start&#xff0c;User,Library文件夹 1.Keil中新建工程&#xff0c;选择型号 打开keil5&#xff0c;project->new pr…

045:cesium加载OpenStreetMap地图

第045个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中加载加载OpenStreetMap地图。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 注意OpenStreetMap国内加载有问题,需要曲线救图。 文章目录 示例效果配置方式示例源代码(共79行)相关API参考:…

询问ChatGPT的高质量答案艺术——提示工程指南(更新中……)

目录前言一、提示工程简介二、提示技巧2-1、生成法律文件2-2、添加提示技巧三、角色扮演3-1、智能手机产品描述3-2、添加角色扮演四、标准提示4-1、写一篇有关于新智能手机的评论4-2、添加标准提示、角色提示、种子词提示等等五、示例很少、或者没有示例5-1、生成一个手机配置六…

什么是服务架构?微服务架构的优势又是什么?

文章目录1.1 单体架构1.2 微服务架构1.3 单体架构和微服务架构的区分1.4 两种服务架构的优劣点1.4.1 单体架构1.4.2 微服务架构1.5 总结1.1 单体架构 单体架构&#xff08;Monolithic Architecture&#xff09;是一种传统的应用程序架构模式&#xff0c;它指的是将一个应用程序…

聚会Party

前言 加油 原文 聚会常用会话 ❶ He spun his partner quickly. 他令他的舞伴快速旋转起来。 ❷ She danced without music. 她跳了没有伴乐的舞蹈。 ❸ The attendants of the ball are very polite. 舞会的服务员非常有礼貌。 ❶ Happy birthday to you! 祝你生日快乐!…
最新文章