欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 简单介绍My—Batis

简单介绍My—Batis

2025/3/26 8:39:50 来源:https://blog.csdn.net/Tony__Ferguson/article/details/146492726  浏览:    关键词:简单介绍My—Batis

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标签写在参数列表中,你传递的内容有这个参数,我就在参数列表中加上这个参数。。。。。我在说什么,算了一图胜千言:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词