SpringBoot整合Mybatis并实现数据库增删改查

写在前面

Mybatis一个基于Java的持久层框架,它通过XML或注解的方式,将SQL语句和Java方法进行映射,使得开发者可以轻松地进行数据库操作。下面我会演示mybatis的配置与使用并实现数据库的增删改查。

1.准备测试数据

使用mybatis实现对数据库的增删改查之前,我们先创建一个数据库,,然后在数据库中新建一张表。我准备的数据(person表)如下(SQL Server):
在这里插入图片描述

2.创建SpringBoot项目

使用IDEA新建一个springboot项目:
在这里插入图片描述
在创建项目时导入依赖,也可以在项目创建后手动导入:
在这里插入图片描述

3.导入mybatis依赖

如果在创建项目时已导入依赖可以跳过这一步。
pom.xml文件中导入mybatis依赖:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter-test</artifactId>
    <version>3.0.3</version>
    <scope>test</scope>
</dependency>

导入sql server的依赖:

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <scope>runtime</scope>
</dependency>

如果想要使用其他版本的mybatis依赖,请前往https://mvnrepository.com/

4.如何使用mybatis

4.1 配置mybatis

4.1.1 配置数据源

application.properties中配置数据库:

spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.url=jdbc:sqlserver://localhost:1433;database=数据库名称
spring.datasource.username=sa
spring.security.user.password=123456

也可以在application.yamlapplication.yml文件中配置数据库:

spring:
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://localhost:1433;database=数据库名称
    username: sa
    password: 123456

4.1.2 相关配置

#配置映射文件路径(使用xml配置文件映射SQL语句时设置),此处的mapper是自己在resources目录下创建的子目录
mybatis.mapper-locations=classpath:/mapper/*.xml

4,2 使用mybatis

4.2.1 创建实体类(entity)

在启动类的所在目录下创建实体类:
在这里插入图片描述
Person类中:

@Data
public class Person {
    //Person类中的字段要与数据库对应
    private int id;
    private String name;
    private int age;
    private String gender;
}

4.2.2 创建mapper

在启动类的所在目录下创建mapper:
在这里插入图片描述
创建PersonMapper对应的xml文件,使用MybatisX插件创建xml文件,这个插件可以在idea的plugins中下载。
PersonMapper文件中将光标放在接口名上按下alt + enter后选择[MybatisX] Generate mapper of xml后如下图选择路径:
在这里插入图片描述
PersonMapper.xml中情况:
在这里插入图片描述

4.2.3 定义查询方法并编写SQL语句

PersonMapper中定义查询所有Person信息的方法:
在这里插入图片描述

① xml形式

在方法名处按下alt + enter后选择Generate statement,在xml文件中自动生成对应的映射语句:
在这里插入图片描述
<select>标签中编写SQL语句:

select * from person
② 注解形式

直接在方法的上面使用@Select注解:

@Select("select * from person")

4.2.4 创建controller并调用mapper

在启动类的所在目录下创建controller:
在这里插入图片描述
PersonController中:

@RestController
public class PersonController {
    @Autowired
    PersonMapper personMapper;
    
    @GetMapping("/allPerson")
    public List<Person> getAllPerson() {
        return personMapper.getAllPerson();
    }
}

4.2.5 在启动类中添加@MapperScan注解

在启动类添加@MapperScan注解可以使容器扫描到mapper:

@MapperScan(basePackages = "com.example.demo.mapper")

4.2.5 启动项目并使用controller

结果如下:
在这里插入图片描述

5.实现数据库的增删改查

5.1 查询

上面演示了获取全部person数据,这里举例通过id查询数据,我们可以模仿这个例子实现其他方式的查询。
定义查询方法并编写SQL语句

//使用@Param("id")接收前端传来的参数
@Select("select * from person where id = #{id}")
Person getPersonById(@Param("id") int id);

调用:

@GetMapping("/byId/{id}")
    public Person getPersonById(@PathVariable("id") int id) {
        return personMapper.getPersonById(id);
    }

结果:
在这里插入图片描述

5.2 新增

定义新增方法并编写SQL语句:

//由于id设置了自增,所以这里不需要传入id
@Insert("insert into person values (#{name},#{age},#{gender})")
void addPerson(Person person);

调用:

@GetMapping("/add")
    public void addPerson(@RequestParam("name") String name, 
                          @RequestParam("age") int age,
                          @RequestParam("gender") String gender) {
        Person person = new Person();
        person.setName(name);
        person.setAge(age);
        person.setGender(gender);
        personMapper.addPerson(person);
    }

使用:
在这里插入图片描述
查询所有person:
在这里插入图片描述

5.3 修改

这里我通过id修改person的信息,我们可以模仿这个例子通过名字来修改person信息,也可以修改person一个或多个字段信息。
定义修改方法并编写SQL语句:

//通过id修改person信息
@Update("update person set name = #{name}, age = #{age}, gender = #{gender} where id = #{id}")
void updatePerson(Person person);

调用:

@GetMapping("/update")
    void updatePerson(@RequestParam("id") int id,
                      @RequestParam("name") String name,
                      @RequestParam("age") int age,
                      @RequestParam("gender") String gender) {
        Person person = new Person();
        person.setId(id);
        person.setName(name);
        person.setAge(age);
        person.setGender(gender);
        personMapper.updatePerson(person);
    } 

使用:
在这里插入图片描述
修改前:
在这里插入图片描述
修改后:
在这里插入图片描述

5.4 删除

这里我通过姓名删除person信息,我们也可以通过其他字段删除person信息
定义删除方法并编写SQL语句:

@Delete("delete from person where name = #{name}")
void deletePersonByName(@Param("name") String name);

调用:

@GetMapping("/del")
    void deletePerson(@RequestParam("name") String name) {
        personMapper.deletePersonByName(name);
    }

使用:
在这里插入图片描述

删除前:
在这里插入图片描述
删除后:
在这里插入图片描述

写在后面

通过springboot整合mybatis,我们不仅可以进行简单的增删改查操作,还可以进行一些更高级的信息查询操作。通过接收前端传回来的信息对数据库进行相应的操作,可以让我们查询数据库更加方便快捷。

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

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

相关文章

石油化工厂为什么要用专业防爆手机?

防爆手机之所以必须使用专业设计的产品&#xff0c;主要是出于安全考虑&#xff0c;以防止在易燃易爆环境中因手机使用不当引发爆炸事故。以下几点详细解释了使用专业化工防爆手机的必要性&#xff1a; 本质安全设计&#xff1a;顶坚专业防爆手机采用了本质安全&#xff08;本安…

权重衰退及代码

一、硬性限制 1、通常不限制偏移b&#xff0c;因为限制不会有区别&#xff1b;seta越小&#xff0c;意味着正则项强 2、优化的是最小化的损失函数 3、后部的限制条件&#xff0c;每个项的平方和小于一个值&#xff1b;极端情况下&#xff0c;当seta等于0&#xff0c;意味着所…

【node】深入探讨 class URL

【node】深入探讨 class URL &#x1f4cc; 浅说 fileURLToPath() 在vite.config.ts中有这么一段代码&#xff1a; import { fileURLToPath, URL } from node:url import { defineConfig } from vite export default defineConfig({resolve: {alias: {: fileURLToPath(new U…

github无法访问,下载慢的解决方法

GitHub是一个存储分享无数的开源项目和代码的宝库网站。然而&#xff0c;由于一些原因&#xff0c;国内用户在访问GitHub时常常遭遇无法访问或下载速度缓慢的问题。这不仅影响了开发者的工作效率&#xff0c;也使一些想要访问下载github文件的普通用户遇到困难。下面小编就来和…

线性代数、矩阵计算

一、线性代数 1、对于向量&#xff0c;若a是标量&#xff0c;为a的绝对值乘以b的向量长度。 2、点乘 3、范数&#xff1a;向量或者矩阵的长度 L1范数&#xff1a;&#xff08;对向量&#xff09;每个元素的绝对值求和 L2范数&#xff1a;&#xff08;对向量&#xff09;torch.…

Websocket在Java中的实践——最小可行案例

WebSocket是一种先进的网络通信协议&#xff0c;它允许在单个TCP连接上进行全双工通信&#xff0c;即数据可以在同一时间双向流动。WebSocket由IETF标准化为RFC 6455&#xff0c;并且已被W3C定义为JavaScript API的标准&#xff0c;成为现代浏览器的重要特性之一。 WebSocket的…

【嵌入式Linux】i.MX6ULL 外部中断服务函数的初始化

文章目录 1. Cortex-A7 中断系统1.1 分析1.2 具体处理流程 2. 外部中断服务函数的初始化2.1 基本流程分析2.2 具体代码分析2.2.1. 定义中断处理类型和结构体2.2.2. 初始化中断系统2.2.3. 注册中断处理函数2.2.4. 具体的中断处理逻辑2.2.5. 默认的中断处理函数 3. 完整代码 本文…

002_unsigned long数据比较的坑?

【背景】 unsigned long 类似数据的比较问题&#xff0c;先上一段代码&#xff0c;如下图所示&#xff1a; 就是图中框出的部分&#xff0c;眨眼一看&#xff0c;应该没啥问题&#xff0c;而且我也在本地的编译器vs2019上编译了&#xff0c;确实也没有报错&#xff0c;所以就修…

【Linux】静态库、动态库

动静态库里面包含的是源文件通过汇编阶段生成的后缀为.o的可重定位目标文件。我们在使用C语言&#xff0c;包含一个stdio.h头文件就可以使用scanf方法&#xff0c;其实都是系统调用了相应的头文件和库&#xff0c;库里面有开发者已经写好各种方法。也就是说我们在使用C语言时&a…

Java | Leetcode Java题解之第191题位1的个数

题目&#xff1a; 题解&#xff1a; public class Solution {public int hammingWeight(int n) {int ret 0;while (n ! 0) {n & n - 1;ret;}return ret;} }

【学习】软件测试中常见的文档类型及其作用

在软件开发的生命周期中&#xff0c;软件测试是确保产品质量的关键步骤。为了系统地进行测试活动&#xff0c;并保证测试结果的有效性和可追溯性&#xff0c;产生了一系列标准化的测试文档。这些文档不仅为测试人员提供了执行指南&#xff0c;而且为项目管理者和利益相关者提供…

【排序 队列】1585. 检查字符串是否可以通过排序子字符串得到另一个字符串

本文涉及知识点 排序 队列 LeetCode1585. 检查字符串是否可以通过排序子字符串得到另一个字符串 给你两个字符串 s 和 t &#xff0c;请你通过若干次以下操作将字符串 s 转化成字符串 t &#xff1a; 选择 s 中一个 非空 子字符串并将它包含的字符就地 升序 排序。 比方说&a…

Discourse 的 AI 内容分享

虽然 Discourse 的 AI 接口调用是需要比较高的用户权限或者管理员权限。 但是对已经生成的结果&#xff0c;Discourse 是可以保存并且分享的。 例如&#xff0c;我们搜索了一些美食的做法。 在页面的下面有一个分享 AI 对话的按钮。 在随后弹出的界面中&#xff0c;会又一个…

服务运营 | MS文章精选:线上点单,当真免排队?餐饮零售与医疗场景中的全渠道运营

编者按&#xff1a; 小A走进了一家奶茶店&#xff0c;准备向店员点单&#xff0c;但却在屏幕上看到还有98杯奶茶待制作&#xff08;因为线上订单突然暴增&#xff09;。因此&#xff0c;小A不满地嘟囔着离开了奶茶店。这个例子展示了线上渠道可能会对线下渠道造成一些负面影响…

链表数组遍历输出的辨析(二者都含指针的情况下)----PTA期末复习题

输入输出三位学生的学号和信息 一开始我认为是指针&#xff0c;直接背了指针输出的方式&#xff1b;p;p!NULL;pp->next 这个是错误的 下面这个输出是正确的方式 分析怎么区分这两个 举个例子来 数组遍历&#xff1a; 链表遍历&#xff1a; 输出的结果&#xff1a; 如果将…

第十次作业

1.登陆界面 2.导航页面 3.接口&#xff08;我负责的主要是管理员管理用户和密码的界面&#xff09; import request from /utils/request// 登录 export function login(data) {return request({url: /user/login,method: post,data}) }// 获取用户信息 export function getIn…

网关登录校验

如何在网关转发之前做登录校验&#xff1f; 网关请求处理流程 如何在网关转发之前做登录校验&#xff1f; 网关如何将用户信息传递给微服务&#xff1f; 如何在微服务之间传递用户信息&#xff1f; 自定义过滤器 网关过滤器有两种&#xff0c;分别是&#xff1a; GatewayFi…

春秋云境:CVE-2022-25411[漏洞复现]

根据题目提示和CNNVD优先寻找后台管理地址 靶机启动后&#xff0c;使用AWVS进行扫描查看网站结构 在这里可以看到后台管理的登录地址&#xff1a;/admin/&#xff0c;根据题目提示可知是弱口令 尝试admin、123456、admin666、admin123、admin888...等等常见弱口令 正确的账户…

论文导读 | Manufacturing Service Operations Management近期文章精选

编者按 在本系列文章中&#xff0c;我们梳理了顶刊Manufacturing & Service Operations Management5月份发布有关OR/OM以及相关应用的文章之基本信息&#xff0c;旨在帮助读者快速洞察行业/学界最新动态。 推荐文章1 ● 题目&#xff1a;Robust Drone Delivery with Weath…

KVM网络模式设置

一、KVM网络模式介绍 1、NAT ( 默认上网 ) 虚拟机利用host机器的ip进行上网,对外显示一个ip;virbr0是KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供NAT访问外网的功能,默认ip为192.168.122.1 2、自带的Bridge 将虚拟机桥接到host机器的网卡上,vm和ho…