简单介绍My—Batis

news2025/4/21 21:08:56

1.什么是My—Batis?

My—Batis是一个持久层框架,提供了sql映射功能,能方便的将数据库表和java对象进行映射,通过My—Batis可以将项目中的数据存储在数据库中,以便我们进行调用。值得注意的是My—Batis和spring不是一回事,它们完全是两个框架,并不是说使用My—Batis就一定要用spring框架,不过我们后面进行代码演示时会用到spring框架的测试环境,

2如何使用My—Batis

利用My—Batis操作数据主要有两种方法:注解法和xml文件法,接下来我们一 一讲解。

3.使用注解实现crud

补充:要用的数据表
在这里插入图片描述
在实际项目中,我们处理数据的逻辑是:Controller—>Service—>Mapper(Mapper层有很多接口,每个接口对应一张表的业务逻辑)
也就是说当我们Controller层接收到请求后,会调用Service层进行业务逻辑处理,而Service进行处理时又往往会调用Mapper层方法,Mapper层就是我们真正使用注解写方法的地方,举个例子:
在这里插入图片描述
如上图:当用户访问getUserInfo方法时想要用数据库中获取用户信息就会调用userInfoService层的方法在这里插入图片描述
看!在Sservice层中调用了userInfoMapper层的方法
在这里插入图片描述

而Mapper层中的UserInfoMapper接口就实现了该方法,使用注解查询了用户信息。

3.1@select

补充:select语法:
select 字段名1, 字段名2, …
from 表名
where 条件;

顾名思义,就是进行查询操作,我们观察上图的数据表,要想查询用户表的gender为1的用户的所有信息该怎么写呢?
1.在Controller层写方法,传参数为1,调用Service层中方法
在这里插入图片描述

在这里插入图片描述
Service层中调用Mapper层方法,注意返回值类型,因为gender为1的数据肯定不止一个,所以我们用List接收

在这里插入图片描述
上面写的这个属于带参查询,注意第一个gender是指表中字段名,第二个gender就是我们传 的参数。gender=#{gender}经过编译后就成了gender=1,为什么要用#{]将参数括起来?嗯格式就是这么规定 的,你要用这个框架就要按这个格式写,总比手撕JDBC强吧。。
当然我们也可以传多个参数,中间使用and连接就好。

3.2@delete

补充delete语法:
delete from 表名
where 条件

;
这个注解用于进行删除操作,我们照例进行代码演示,不过由于Controller—>Service—>Mappe有点麻烦,我们可以直接在Mapper接口中写方法,然后借助spring框架 中的test测试环境进行演示,具体步骤如下:
1.在接口中写delete方法
在这里插入图片描述
2.生成test方法
首先鼠标右键单击——找到并点击Generate——点击Test——根据方法名找到方法并勾选——点击OK(弹出ERROR是正常的,接着 OK就行)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
随后在Test文件夹中对应接口生成的Test文件中就可以找到该方法,好处显而易见:我们可以直接测试该方法是否生效(通过刷新数据库),而不用在Controller层和Service层再写然后通过http请求调用该方法以测试方法是否生效。

3.测试delete方法
在这里插入图片描述
执行前:
在这里插入图片描述
执行后:
在这里插入图片描述
可以看到Id为20的用户信息已经被删除了 。

3.3@update

My—Batis能够将sql数据库表与java对象进行映射,可能在前两个注解我们体会不到这重意思,但是从这个注解我们就能感受到My—Batisd的便捷性,

更新数据库表中信息我们采取什么方式?一张表对应一个类,对于user_info表我们创建一个userInfo类,类中属性也与表中字段名一 一对应,当然我们用小驼峰的写法而不是_.如下图:
在这里插入图片描述
注解内更新语句就按照sql语句的规则写:
update 表名
set 字段名1 = value1, 字段名2 = value2
where 条件;

在这里插入图片描述
验证时刻:
在这里插入图片描述

在这里插入图片描述

我们观察这个SQL语句:
update user_info set username=#{username},password=#{password} where id=#{id}
第一个username是指表中字段名,而#{}中的则是我们所传递的参数,其他也是同理。
一个类对应一张表,一行信息对应一个对象,我们通过New一个对象作为参数传递,通过设置这个对象的属性信息来修改表中信息,新增信息也是同理,这就是My—Batis的SQL映射的功能。

3.4@insert

insert语法规则:
insert into 表名(字段名1,字段名2,字段名3)
values (值1, 值2, 值3, …);

在这里插入图片描述

在这里插入图片描述

所以用注解写基础的crud很简单,
**@注解类型(”SQL语句“)**就OK了

3.5#{}和${}的区别

虽然我们上图使用的一直是#{},但其实我们也可以使用${}去传递参数,关于它们之间的不同请看下图:
在这里插入图片描述
在这里插入图片描述
#{}是通过占位的方式传递参数,有点类似于c语言的占位符。如果识别到传递的参数是String类型,会自动添加引号。【预编译SQL】

${}则是将接收到的参数直接拼到sql语句中。【即时SQL】

两者各有优劣,假如说我们写了一个查询语句并将查询到的信息按照自增ID降序排序,我们如果使用 order by ID #{values} 就会出现语法错误,因为你写的是字符串,编译之后就成了:
order by ID ‘desc’ ,自动多了个字符串,就很难搞,这时使用${}就很合适, 填什么就是什么。

SQL注入

但是我们为什么不常用${}?因为也会导致SQL注入问题,所谓SQL注入就是利用即时SQL的特性在参数上添加关键字来改变定义好的SQL语句,以此查询数据,攻击数据库等等。。。如下图:
在这里插入图片描述
对这个sql语句,我传的参数是:fff’ or 1=1,通过or关键字绕过了where条件审查,直接查出来了该表所有的数据,我这写的还只是username,如果是密码呢?0我这还只是查个数据?如果是修改数据呢?如果我直接删表跑路呢?

那么如何避免sql注入问题呢?

我们可以在使用${}时候对接收的参数进行检查,比如排序功能,当参数不是desc或者asc的时候直接打回。

XML文件操作数据库

1.在.pom文件中配置相关依赖,
2.然后在resoures路径下找到.yml文件,指明xml文件位置。
xml文件一当要保证在resources路径下
在这里插入图片描述
3.通过namespace将 这个xml文件与对应的Java接口绑定,如下:
在这里插入图片描述

然后接口我们依然建在Mapper层,接口中写方法,方法的具体实现也就是sql语句,我们不使用注解写在方法上面,而是写在xml文件中

4.使用xml文件实现crud

4.1select

1.接口中写方法
在这里插入图片描述
可以点击generate statement或者按Alt+Enter在对应的.xml文件快捷生成具体实现方法,如下:
在这里插入图片描述

2.在标签内写sql语句就可以了,不用加引号,为什么会直接生成select标签呢?因为MyBatis发力了,简单理解就是方法名中包含select关键字,被检测到了,帮你生成的具体实现才有标签,不信你写个不包含crud的方法名,它自动生成的时候就不知道用哪个标签了,非要你去指定一下才行。
在这里插入图片描述
测试成功!

4.2delete

在这里插入图片描述
在这里插入图片描述

4.3update

在这里插入图片描述
在这里插入图片描述

4.4insert

在这里插入图片描述

在这里插入图片描述

5.动态SQL

5.1什么是动态SQL

动态SQL就是SQL语句不写死,取决于用户传递的参数,条件等等

5.1为什么要用动态SQL

在这里插入图片描述

在这里插入图片描述

看上图,假如我现在要写一个插入信息的方法,但 这个表所有字段都可以为空,那我参数列表就可以有很多中组合,难道我每一种组合都要在接口写一个对应的方法吗?嗯?要吗?回答我?look in my eyes!
额虽然这也是一种方法,,但我们作为程序员必须严格执行有懒必偷的原则

5.2动态SQL怎么写

动态SQL的实现还是依赖于一些标签实现的,标签!所以还是在SQL语句中写的。

5.3标签

这个标签有一个属性test:这个属性就用来写条件,满足这个条件我就执行标签内的内容,不满足就跳过,这样一来,我们就不用多写或者少写一个参数就写一个对应方法 了,我们直接把if标签写在参数列表中,你传递的内容有这个参数,我就在参数列表中加上这个参数。。。。。我在说什么,算了一图胜千言:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ALTER TABLE SHRINK SPACE及MOVE的区别与适用场景

以下是 ‌Oracle 数据库‌中三个收缩表空间命令的对比: 1. ALTER TABLE table_name SHRINK SPACE;‌ ‌作用‌:直接重组表数据并移动高水位线(HWM),释放未使用的空间到表空间‌。 影响‌: 会锁表&#…

docker远程debug

1. 修改 Java 启动命令 在 Docker 容器中启动 Java 程序时,需要添加 JVM 调试参数,jdk8以上版本 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 -jar your-app.jar jdk8及以下版本: java -Xdebug -Xrunjdwp:tra…

rosbag|ROS中.bag数据包转换为matlab中.mat数据类型

代码见代码 msg_dict中设置自定义消息类型 test_config中设置需要记录的具体的值 test_config中topic_name以及message_type照搬plotjuggler打开时的参数 最后生成.mat文件在matlab中进行使用

pytest-xdist 进行高效并行自动化测试

pytest-xdist 的核心功能是通过多进程分发测试任务,每个进程独立运行测试,确保测试隔离。2025 年 3 月 25 日,pytest-xdist 在 GitHub 上已有超过 1,200,000 次下载,表明其在测试社区中的广泛接受。 在自动化测试中,随…

位置编码再思考

最近在做多模态,发现基于 transformer 的多模态,position embedding 是一个非常重要的内容,而且还没有统一方案,先暂做记录,几篇还不错的博客: Transformer学习笔记一:Positional Encoding&…

Deepseek API+Python 测试用例一键生成与导出 V1.0.3

** 功能详解** 随着软件测试复杂度的不断提升,测试工程师需要更高效的方法来设计高覆盖率的测试用例。Deepseek API+Python 测试用例生成工具在 V1.0.3 版本中,新增了多个功能点,优化了提示词模板,并增强了对文档和接口测试用例的支持,极大提升了测试用例设计的智能化和易…

[c语言日寄MAX]深度解析:大小端字节序

【作者主页】siy2333 【专栏介绍】⌈c语言日寄MAX⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还…

Android ADB工具使用教程(从安装到使用)

目录 ADB工具介绍 什么是ADB? 组成 主要功能 ADB工具安装与连接设备 WIFI连接,提示计算机积极拒绝10061 WIFI成功连接后,拔掉数据线显示offline 提示adb版本不一致​编辑 ADB工具使用 ★日志操作命令 adb logcat:抓取日志 日志格式…

基于SSM框架的线上甜品销售系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。因此网上销售信息的…

Redis原理:Monitor 实现

在调用 Redis 的 MONITOR 命令后,可以在对应的客户端上实时查看服务器的执行情况。今天,我们将从源码的角度来深入探讨 MONITOR 机制是如何处理这些请求以及如何将数据反馈给用户的。 MONITOR 命令的实现 Redis 中所有命令的具体实现细节都可以在其源代…

计算机工具基础(七)——Git

Git 本系列博客为《Missing in CS Class(2020)》课程笔记 Git是一种分布式版本控制系统,被其跟踪的文件可被查询精细到行的修改记录、回退版本、建立分支等 模型 一般流程:工作区 → \to →暂存区 → \to →仓库(本地 → \to →远端) 工作区&#xff1…

23种设计模式-创建型模式-工厂方法

文章目录 简介场景问题1. 直接依赖具体实现2. 违反开闭原则3. 条件分支泛滥4. 代码重复风险 解决根本问题完整类图完整代码说明核心优势代码优化静态配置表动态策略 总结 简介 工厂方法是一种创建型设计模式,它提供了在父类中创建对象的接口,但允许子类…

142. 环形链表 II——考察数学,难!

142. 环形链表 IIhttps://leetcode.cn/problems/linked-list-cycle-ii/ 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,…

从零开始:使用Luatools工具高效烧录Air780EPM核心板项目的完整指南

本文将深入讲解如何使用Luatools工具烧录一个具体的项目到Air780EPM开发板中。如何使用官方推荐的Luatools工具(一款跨平台、命令行驱动的烧录利器),通过“环境配置→硬件连接→参数设置→一键烧录”四大步骤,帮助用户实现Air780E…

一套云HIS系统源码,系统融合HIS与EMR,基于云端部署,采用B/S架构与SaaS模式

云HIS系统完全基于云端部署,采用B/S架构,并通过软件即服务(SaaS)的形式面向二级及以下医院可快速交付、便捷运维、云化的医院核心业务平台产品。融合医院HIS和EMR两大主营系统,构建涵盖患者、费用、医嘱、电子病历等核…

C++数据结构(搜索二叉树)

1.二叉树搜索的概念 二叉搜索数也成为二叉排序树,它或者是一颗空树,或者是满足以下性质的树: 1.若他的左子树不为空,则左子树上的所有节点的值都小于等于根节点的值。 2.若他的右子树不为空,则右子树上的所有节点的值…

OpenCV图像拼接(6)图像拼接模块的用于创建权重图函数createWeightMap()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::createWeightMap 是 OpenCV 库中用于图像拼接模块的一个函数,主要用于创建权重图。这个权重图在图像拼接过程中扮演着重…

炫酷的HTML5粒子动画特效实现详解

炫酷的HTML5粒子动画特效实现详解 这里写目录标题 炫酷的HTML5粒子动画特效实现详解项目介绍技术栈项目架构1. HTML结构2. 样式设计 核心实现1. 粒子类设计2. 动画效果实现星空效果烟花效果雨滴效果 3. 鼠标交互 性能优化效果展示总结 项目介绍 本文将详细介绍如何使用HTML5 C…

YoloV8训练和平精英人物检测模型

概述 和平精英人物检测,可以识别游戏中所有人物角色,并通过绘制框将人物选中,训练的模型仅仅具有识别功能,可以识别游戏中的视频、图片等文件,搭配Autox.js可以推理,实现实时绘制,但是对手机性…

BC93 公务员面试

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;C语言练习题分享 &#x1f30d;文章目入 #include <stdio.h> int main() {int score 0, max 0, min 100, sum 0, count 0; while (scanf("%d", &score) ! EOF){…