Mybatis 实现简单增删改查

news2024/11/19 10:43:39

目录

前言

一、Mybatis是什么

二、配置Mybatis环境

 三、创建数据库和表

 四、添加业务代码

4.1、添加实体类

4.2、添加mapper接口 

4.3、添加实现接口方法的xml文件

五、简单的增删改查操作及单元测试

5.1、单元测试

 单元测试具体步骤:

单元测试如何才能不污染数据库

5.2、查询操作

不带参数的查询

带参数查询

5.3、 修改操作

接口方法传递对象的操作

5.4、删除操作

5.5、添加操作

添加之后返回受影响行数

添加操作之后返回自增id

5.6、like查询

5.7、#{}和${}的区别

六、使用注解来实现增删改查功能

6.1、@Select注解

6.2、@Insert注解

6.3、@Update注解

6.4、@Delete注解

使用注解的与使用xml方式书写SQL语句的对比

前言

        本篇博客主要介绍如何在spring boot项目中配置Mybatis、Mybatis如何连接MySQL数据库、使用Mybatis通过配置文件和注解的实现简单的单表的增删改查操作,还有使用单元测试进行数据库的操作测试。

一、Mybatis是什么

        MyBatis 是⼀款优秀的持久层框架,它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接⼝和 Java POJO(Plain Old Java Objects,普通⽼式 Java 对象)为数据库中的 记录。 简单来说 MyBatis 是更简单完成程序和数据库交互的⼯具,也就是更简单的操作和读取数据库⼯具。

二、配置Mybatis环境

        要配置Mybatis环境主要需要两大步骤,首先需要引入Mybaits的框架依赖还有MySQL数据库的驱动依赖,操作如下所示:只需要在创建项目的时候点击添加相关依赖即可

如果在创建时忘记添加可以在创建后在pom.xml中添加。

        第二步就是在项目创建好之后在配置文件中设置数据库的连接信息,这一步非常重要,如果没有配置的话,运行项目就会报错。(这里配置以MySQL为例)

配置操作如下:在application.properties中配置

        以下内容需要修改的就是url中连接的数据库名称,以及数据库密码,还有xml保存路径信息,其他的一般可以不修改。

# 配置数据库的连接字符串
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
spring.datasource.username=root
#设置自己数据库密码
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 设置 Mybatis 的 xml 保存路径,以下代表的意思是说明配置文件位于mapper包下以Mapper结尾的xml文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 配置打印 MyBatis 执行的 SQL属于debug级别的日志,所以需要设置成debug,项目上线后一般就不要去打印了
logging.level.com.example.blogmybatis=debug

 三、创建数据库和表

        我们要想操作数据库,那么要操作的数据库是必须有的以及数据库中的表也必须要有。这里我们创建一个userinfo表作为例子演示增删改查操作:代码如下

create table userinfo(
 id int primary key auto_increment,
 username varchar(100) not null,
 password varchar(32) not null,
 photo varchar(500) default '',
 createtime timestamp default now(),
 updatetime timestamp default now(),
 `state` int default 1
) default charset 'utf8mb4';
insert into userinfo(username,password) values('zhangsan','123');

 四、添加业务代码

4.1、添加实体类

在项目中添加与数据库表相对应的实体类:

        创建这个实体类主要是为了可以在项目中使用这个类来接收我们查询返回的信息,只要数据库中的字段名与实体类中属性名一致,框架就会自动的帮我们进行赋值。

package com.example.blogmybatis.model;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class UserInfo {//以下字段名要与数据库中字段名一致
    private int id;
    private String username;
    private String password;
    private String photo;
    private LocalDateTime createtime;
    private LocalDateTime updatetime;
    private int state;
}

4.2、添加mapper接口 

我们添加mapper接口的目的就是在接口中声明方法,而方法的具体实现是在xml配置文件中的。

代码如下:

package com.example.blogmybatis.model.mapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper//Mapper注解不能省
public interface UserMapper {//在以下类中定义方法

}

4.3、添加实现接口方法的xml文件

这个文件的位置是需要与我们前面的配置文件中设置的路径一致的,需要在mapper目录下,而且以Mapper结尾。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.blogmybatis.mapper.UserMapper">
    
</mapper>

        配置这个需要注意的是,接口的名字和实现接口的xml方法二者之间的名字不一定需要相同,因为二者之间的关联并不是通过这个名字关联的,二者之间是通过namespace属性关联的,所以一旦namespace属性写错了,就会无法正确的实现接口中的方法,执行就会报错。

五、简单的增删改查操作及单元测试

      我们这里的增删改查操作都需要现在接口中去声明方法,指定方法返回类型,接着去对应的xml文件中实现接口中声明的方法。

xml中实现方法的具体步骤:

        根据要进行的操作,进行选择标签,查询标签就是select,修改标签就是update,删除标签就是delete,增加标签就是insert。接着设置id,id就是接口中的方法名,最后再设置返回类型resultType,这个设置的是返回的基本类型,比如:返回的是List<User>,那么需要设置的就是User类型,而不是List类型

5.1、单元测试

这里介绍单元测试主要是为了后续可以快捷的测试我们写的代码是否可以正确的操作数据库。

单元测试的概念:

        单元测试(unit testing),是指对软件中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试。 单元测试是开发者编写的⼀⼩段代码,⽤于检验被测代码的⼀个很⼩的、很明确的(代码)功能是否正 确。执⾏单元测试就是为了证明某段代码的执⾏结果是否符合我们的预期。如果测试结果符合我们的预 期,称之为测试通过,否则就是测试未通过(或者叫测试失败)。

单元测试的好处:

1、可以⾮常简单、直观、快速的测试某⼀个功能是否正确。

2、使⽤单元测试可以帮我们在打包的时候,发现⼀些问题,因为在打包之前,所以的单元测试必须通过,否则不能打包成功。

3、使⽤单元测试,在测试功能的时候,可以不污染连接的数据库,也就是可以不对数据库进⾏任何改变的情况下,测试功能

Spring Boot中单元测试的使用: 

        我们要使用单元测试,那首先得有一个单元测试的框架,而我们在创建Spring Boot项目时,Spring已经帮我们内置了一个单元测试的框架了(内置了spring-boot-test),所以这里并不需要我们自己去引入依赖,这个内置的单元测试框架是基于Junit实现的,在pom.xml中就可以看到:如下

 单元测试具体步骤:

1.生成单元测试类:

2.编写单元测试代码

单元测试的类是必须加上SpringBootTest注解的,不然是无法正确执行的。

执行之后结果:这个也就是上面查询全部用户信息的结果

当我们在同一个类中再次使用相同的方法生成单元测试时,会出现报Error的情况:直接点击ok即可

单元测试如何才能不污染数据库

        我们前面的单元测试,都是直接去操作数据库,修改数据库中的内容,但是我们有时候是并不希望数据库的内容直接被修改的,而只是想要知道执行的结果是否正确。因此Spring Boot中是有提供一个@Transactional注解的,这个注解的作用就是开启一个事务,这个事务在我们测试方法返回前,会执行回滚操作,这个操作就是将我们修改过的数据库内容进行回滚,这样子我们在单元测试时,就不会真的去修改数据库了。

代码演示:(以下为插入数据的操作)

执行结果:从控制台打印的日志信息我们可以直观的看出我们的事务在执行回滚操作了 

5.2、查询操作

不带参数的查询

我们在xml文件中写sql语句是不需要带分号的,我们这里的需求是查询数据库中所有用户的信息

以上就是我们一个最简单的查询数据库中所有用户信息的操作。单元测试的结果如下所示:

带参数查询

sql语句中如何接收动态参数:

        从上面的sql语句中,我们可以看出,我们可以使用#{}和${}的方式来接收参数的,其中我们只要将参数的名称填入{}中就可以,这里使用#{}和${}之一都可以,至于这两者的区别后面再介绍。

        还有带参数查询在接口的方法中我们使用到了@Param注解,这个注解一般都要加上,不加的话有小部分人的程序会报错,这个注解的作用是用来命名的,注解中的名字要求要与我们实现的接口方法中的sql语句中{}中参数名字一致才可以。

执行单元测试的代码及结果:

5.3、 修改操作

现在我们的需求是要将数据库中id为1的用户名改为admin,这时候我们的操作如下:

单元测试的代码及结果:

接口方法传递对象的操作

        在上面的update操作中, 我们一共是传递了两个参数,这其实并不是很多,但是,有时候我们是需要传递多个参数进行修改或者查询操作的,但是,这时候我们如果一个参数一个参数的去传,那么我们的形参列表就会变得很长,代码并不美观,可读性可维护性都不强,所以这个时候我们就可以考虑 直接传递一个对象过去,这样子代码就更加的美观了,也更好维护了。

        那对象传递过去之后在xml中到底该如何拿到对象中的属性,如何去使用呢?我们直接将上一步的的修改操作的传递参数操作改为传递对象,接下来直接看代码:

单元测试代码及结果: 这里单元测试只需要看返回受影响行数就可以,因为修改成功的话,受影响行数就会是1,修改失败的话受影响行数就会是0

        通过代码我们可以得知:传递对象其实和传递参数的区别就在于接口方法中的形参列表的不同,在我们xml中的使用是完全不变的,我们只需要保证xml中#{}中的参数名字与对象中的属性名可以对应上就可以。 

5.4、删除操作

        删除操作与前面的操作也是类似的,只要使用delete标签就可以了。现在假设我们要把数据库中id为2的用户删了,相应的代码如下:

单元测试代码及结果:

5.5、添加操作

        普通的添加操作和之前的操作也是差不多的,普通的添加操作就是在添加之后会返回受影响的行数。但是添加操作中还有一个比较特别的就是,我们有时候需要在添加完之后去返回我们的自增id这个字段,返回自增id这个操作就比较麻烦了,接下去我们直接使用代码来演示这两个操作。

添加之后返回受影响行数

代码如下:

单元测试结果:

添加操作之后返回自增id

代码如下:

单元测试的代码及结果如下:

        这里需要注意的就是,我们需要将数据库中的自增主键赋值给某一个属性,所以这里我们一般是使用对象来传参之后才能将自增主键返回到对象的属性中,不使用对象的话就无法获取这里的自增id了。当然,也可以使用Map来传参,这里就不再演示,因为使用对象传参还是比较主流的写法的。

5.6、like查询

        like查询在实际的开发中,还是经常会使用到的,like查询就是给定关键字,然后我们可以去数据库中根据关键字进行查询。假设我们现在要查询名字中含有‘wang’这个关键字的,那么我们的sql就如下所示:

单元测试代码及结果:

        关于like查询需要注意的是:我们这里传过来的参数,一般得使用#{}来接收,这里如果使用${}来接收可能就会直接报错,这是因为${}会被认为是常量,而不是变量。换句话说,MyBatis会尝试直接在SQL查询中使用${}中的值,而不是将其视为一个变量来处理。而且使用${}还有可能会有sql注入的风险,因此like查询建议都使用#{}就不会出现问题

5.7、#{}和${}的区别

        这是一个我们在面试中经常会遇到的一个问题,我们这里先给出二者之间的区别,接着再使用代码来进行解释;

#{}和${}的区别:

1.#{}是安全的,不存在SQL注入的问题,${}是不安全的,存在SQL注入的问题;

2.#{}是预编译处理,而${}是直接替换;

        什么是SQL注入:SQL注入的场景有很多,但是简单来说,就是利用SQL语句的漏洞来查询到原本不应该查询到的数据,进而达成某种目的。

SQL注入的代码案例:

        从上面的代码我们就可以看出:我们输入的是一个完全错误的密码,但是却可以从数据库中查到正确的数据,所以这就很不安全,可能会被攻击,这就是因为使用${}直接替换的结果。

对于上面的SQL语句的分析:

#{}预编译和${}直接替换的区别: 

        从图中我们可以看出,使用${}就是直接将参数给替换进去就执行sql,而使用#{}是将sql中的参数先用?这个占位符进行替换,最后再使用set方法来为占位符进行赋值,预编译处理会将参数值作为参数传递给数据库,而不是直接将参数值拼接到SQL语句中,传递给数据库之后数据库就不是使用直接拼接的方式来完成了,数据库是根据参数的值来进行查找的。这样可以防止恶意用户通过参数值注入恶意的SQL代码。

六、使用注解来实现增删改查功能

6.1、@Select注解

代码演示:

单元测试代码及结果:

6.2、@Insert注解

代码演示:

单元测试代码及结果:

6.3、@Update注解

代码演示:

单元测试代码及结果:

6.4、@Delete注解

代码演示:

单元测试及结果:

使用注解的与使用xml方式书写SQL语句的对比

使用注解的优缺点:

优点:

简洁:使用注解可以直接在Java代码中编写SQL语句,不需要额外的XML文件,减少了配置的复杂性。

易于维护:注解方式将SQL语句与Java代码紧密结合,易于理解和维护。所有的SQL语句都在Java代码中,方便查找和修改。

更好的集成性:注解方式适合于简单的SQL语句和快速开发,特别是对于一些简单的CRUD操作,可以减少XML配置的工作量。

缺点:

可读性差:注解方式将SQL语句直接写在Java代码中,可能会导致代码可读性较差,特别是对于复杂的SQL语句。

不利于动态SQL和复杂SQL:注解方式不太适合编写动态SQL,因为注解是静态的,不容易根据条件动态生成SQL语句。

缺乏分离性:注解方式将SQL语句与Java代码紧密结合,缺乏了SQL和Java代码的分离,不利于维护和修改。

使用XML的优缺点:

优点:

可读性好:XML方式将SQL语句和映射配置分离,使得代码更加清晰可读,特别是对于复杂的SQL语句和映射关系。

动态SQL支持:XML方式支持动态SQL,可以根据条件动态生成SQL语句,提供了更大的灵活性。

易于维护:XML方式将SQL语句和映射配置集中在一个地方,便于维护和修改。

缺点:

繁琐:XML方式需要编写额外的XML文件来配置SQL语句和映射关系,相对于注解方式来说,配置的工作量较大。

学习成本高:XML方式需要了解和掌握MyBatis的XML配置规则,对于新手来说,学习成本可能较高。

不够直观:相对于注解方式,XML方式的配置不够直观,需要在XML文件中编写SQL语句和映射关系。

总的来说,一般是会使用xml的方式,因为xml的方式能够写动态SQL和复杂的SQL,但是如果项目比较简单也可以使用注解的方式。

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

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

相关文章

Everest Group发布《2023年RPA供应商评估报告》:2家中国厂商持续上榜

近日&#xff0c;全球知名信息咨询机构Everest Group发布了《2023年RPA供应商评估报告》&#xff0c;分析了全球 RPA 格局和 25 家技术提供商在几个关键维度上的动态变化&#xff0c;包括客户数量、同比增长、客户对价值和满意度的反馈以及公司的行业和企业规模细分覆盖范围等。…

SAP MM学习笔记35 - 请求书照合中的差额处理(发票扣减,受入)

SAP中&#xff0c;请求书照合之后&#xff0c;发现不一致&#xff0c;就会支付保留。 支付保留&#xff0c;可以参考如下文章。 SAP MM学习笔记34 - 请求书照合中的支付保留&#xff08;发票冻结&#xff09;_东京老树根的博客-CSDN博客 即使支付保留之后暂时不付钱&#xff…

消防建筑防火3d实景漫游展示方案及特点

随着科技的不断发展&#xff0c;3D线上展厅已经成为了展示产品和宣传品牌的重要方式之一。在火灾隐患排查领域&#xff0c;3D线上展厅也有着广泛的应用。相比于传统的火灾隐患排查方式&#xff0c;3D线上展厅突破了许多局限&#xff0c;具有以下优势&#xff1a; 众所周知&…

微调Yolov8动物姿势估计模型

本文主要以狗的姿势估计为例,展示如何对当下流行的YOLOv8姿势模型进行Fine-tuning,并附录完整代码。 动物姿势估计是计算机视觉领域的一个研究方向,它是人工智能的一个子领域,专注于自动检测和分析图像或视频中动物的姿势和位置。其目标是确定一个或多个动物身体部位的空间…

EMNLP 2023 录用论文公布,速看NLP各领域最新SOTA方案

EMNLP 2023 近日公布了录用论文。 开始前以防有同学不了解这个会议&#xff0c;先简单介绍介绍&#xff1a;EMNLP 是NLP 四大顶会之一&#xff0c;ACL大家应该都很熟吧&#xff0c;EMNLP就是由 ACL 下属的SIGDAT小组主办的NLP领域顶级国际会议&#xff0c;一年举办一次。相较于…

高德地图选择点位改变图标

一.循环渲染点位 如图所示&#xff0c;紫色点位为动态循环点位 首先&#xff0c;我们请求完接口&#xff0c;返回点位 这里是全部代码 下方有拆分讲解 this.map.remove(this.marks) this.marks [] this.map.plugin([AMap.PlaceSearch], () > {var PlaceSearchOptions …

echarts一些配置项的使用

前言:我是自己最近写项目用到的,我做个整理; 一. 基本使用 1.具有大小(宽高)的div ,id唯一; 例如: <div id"crewEchart"></div> 2.在项目中引入: import * as echarts from "echarts"; 3.写一个关于他的方法,在mounted的时候调用: moun…

好用的爬取静态页面谷歌浏览器工具:Save All Resources

说明 该插件可以下载网页中的所有资源 使用方法

1513:受欢迎的牛(DFStarjan强连通分量)

信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 解析&#xff1a; tarjan算法&#xff0c;将有向图缩点&#xff0c;转换为拓扑图&#xff0c;并且统计出度为0的强连通分量&#xff1b; 如果这样的强连通分量只有一个&#xff0c;那么答案即为这个强连通分量中点的个…

fatal:Could not read from remote repository解决方法

Linux服务器如何连接GitHub&#xff1f; 生成SSH密钥 ssh-keygen -C “邮箱” -t rsa 存放位置一般是/root/.ssh/id_rsa 登录个人github&#xff0c;添加客户端生成的公钥 打开Settings&#xff0c;点击SSH and GPG keys&#xff0c;点击New SSH Key。Key中粘贴id_rsa.pub…

AutoGPT:让 AI 帮你完成任务事情 | 开源日报 No.54

Significant-Gravitas/AutoGPT Stars: 150.4k License: MIT AutoGPT 是开源 AI 代理生态系统的核心工具包。它采用模块化和可扩展的框架&#xff0c;使您能够专注于以下方面&#xff1a; 构建 - 为惊人之作打下基础。测试 - 将您的代理调整到完美状态。查看 - 观察进展成果呈…

2023年中国数据库一体机行业现状分析:随着IT发展,需求量增加[图]

数据库一体机服务器特指将数据库软件与标准硬件相结合的产物&#xff0c;其一般集数据处理、数据传输、数据存储3方面于一体&#xff0c;通过采用并行处理架构显著增加数据处理能力、可线性或准线性扩展的数据存储能力以及数据处理与数据存储之间的数据带宽&#xff0c;实现数据…

03 | Defining Query Methods 的命名语法与参数

Spring Data JPA 的最大特色是利用方法名定义查询方法&#xff08;Defining Query Methods&#xff09;来做 CRUD 操作&#xff0c;这一课时我将围绕这个内容来详细讲解。 在工作中&#xff0c;你是否经常为方法名的语义、命名规范而发愁&#xff1f;是否要为不同的查询条件写…

大模型微调学习

用好大模型的层次&#xff1a;1. 提示词工程(prompt engineering); 2. 大模型微调(fine tuning)为什么要对大模型微调&#xff1a; 1. 大模型预训练成本非常高&#xff1b; 2. 如果prompt engineering的效果达不到要求&#xff0c;企业又有比较好的自有数据&#xff0c;能够通过…

IOS17 轻松签全能签还能不能用?多开能否使用?升级后微信底栏消失怎么办?BY:后厂村路灯

从iphone15还没出就有小伙伴们追着问&#xff0c; 到现在也有人一直再问iOS17能不能用&#xff0c;看来换手机的人很多呀。 这里统一回答一下&#xff1a;“iOS17苹果签名可以用&#xff0c;多开也可以用”但是还是有些地方注意。 如果你是16系统直接升级刀17就可以&#xff…

20.1CubeMx配置FMC控制SDRAM【W9825G6KH-6】

本文使用stm32h723zgt6的fmc驱动sdram&#xff0c;实现内存扩展 sdram型号W9825G6KH-6 原理图&#xff1a; MCU引脚与SDRAM对应关系 引脚说明&#xff1a; SDRAM引脚&#xff1a; DQ[15:0]:数据线&#xff1b;数据位宽16 A[12:0]:地址线&#xff1b;行地址A[0:12]&#xff…

10月13日丨第十六届智慧城市大会《实景三维技术创新与应用》论坛日程抢先看!

第十六届智慧城市大会 智慧城市是数字中国、智慧社会的核心载体&#xff0c;是数字时代城市发展的高级形态。由中国服务贸易协会中国测绘学会、中国遥感委员会主办的第十六届智慧城市大会&#xff0c;将以“数实融合开放创新智引未来为主题&#xff0c;邀请行业主管单位和智慧…

【UE 插件】UE4 虚幻引擎 插件开发(带源码插件打包、无源码插件打包) 有这一篇文章就够了!!!

目录 0 引言1 快速入门1.1 新建插件的前提1.2 创建插件步骤1.3 打包插件 2 无源代码的插件制作3 插件详细介绍3.1 插件的使用方法3.1 UE 预置插件模版3.1.1 空白3.1.2 纯内容3.1.3 编辑器独立窗口3.1.4 编辑器工具栏按钮3.1.5 编辑器模式3.1.6 第三方库3.1.7 蓝图库 3.2 插件中…

milvus和相似度检索

流程 milvus的使用流程是 创建collection -> 创建partition -> 创建索引(如果需要检索) -> 插入数据 -> 检索 这里以Python为例, 使用的milvus版本为2.3.x 首先按照库&#xff0c; python3 -m pip install pymilvus Connect from pymilvus import connections c…

Java初学者容易犯的错误,Java程序员必须知道的学习路线

万事开头难&#xff0c;java 编程的初学者常常会遇到各种各样的问题。对于自学的读者来说&#xff0c;则是需要花费更多的时间、精力来解决这些问题&#xff0c;而且一旦遇到的问题几天都得不到解决&#xff0c;往往会带来很大的挫败感。 所以本节介绍一些初学者经常出现的错误…