springboot整合mybatis实现增删改查(xml)--项目阶段1
目录
一、前言
二、创建项目
创建MySQL数据库和表
创建springboot项目
本文总体代码结构图预览
三、编写代码
(一)新建实体层属性类
(二)新建数据层mapper接口
(三)新建mapper的映射SQL(xml)
(四)新建服务层接口
(五)新建服务层的实现类
(六)控制层类
(七)配置文件加入扫描xml文件
四、运行代码
查询全部
根据ID查询
根据ID删除
新增
修改
五、代码获取
一、前言
在之前使用了mybatis-plus做项目,感觉不是很方便,特别是涉及到多表查询,虽然MP不用写SQL语句,但是缺点就是不够灵活。做做一些小demo就差不多了。 真正项目里面使用最多的还是mybatis,根据自己的需要写SQL语句。中小型项目sql语句用注解可能会方便一点,大型的项目用xml会更好一些,所以我这里直接演示用的是xml形式
二、创建项目
创建MySQL数据库和表
创建MySQL数据库和创建表的详细步骤(navicat)_mysql navicat新建数据库_云边的快乐猫的博客-CSDN博客
创建springboot项目
使用这个文章里面的方式二创建springboot项目
IDEA创建SpringBoot项目的两个方式详细步骤(2023)_云边的快乐猫的博客-CSDN博客
源码链接:https://pan.baidu.com/s/1TA9QvOG8rRzen6CROvpIeQ?pwd=jiu1
本文总体代码结构图预览
👆按照上面的方式创建springboot项目。这里面的东西都会有的

总体配置文件(仅供参考,可跳过)
server:port: 80
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/dndata?serverTimezone=GMT%2b8username: rootpassword: 123456mybatis:mapper-locations: classpath:mapping/*.xmltype-aliases-package: com.example.jiu.entity
pom.xml依赖文件(仅供参考,可跳过)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>Jiu</artifactId><version>0.0.1-SNAPSHOT</version><name>Jiu</name><description>Jiu</description><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>2.3.1</version><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.16</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
三、编写代码
(一)新建实体层属性类
1.新建一个entity包,里面再创建一个和数据库表名对应的类(驼峰命名)
类名:User
这个类是和数据库表里面的字段对应上的,用Date注解里面包含了实体属性常用的get、set构造函数这些,具体可以去自行了解一下。
package com.example.jiu.entity;
import lombok.Data;
//使用@Data注解
@Data
public class User {private Integer id;private String username;private String password;
}
(二)新建数据层mapper接口
2.新建一个mapper包,里面创建一个数据层的接口
接口名:UserMapper
这里面的方法都是自定义的,是最开始的数据层的方法语句,后续的命名调用都根据这里的来
package com.example.jiu.mapper;
import com.example.jiu.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;@Mapper
public interface UserMapper {//自定义查询全部的方法List<User> findAll();//根据id查询User findById(Integer id);//自定义根据删除的方法int deleteUserById(Integer id);//自定义增加的方法int addUser(User user);//自定义修改的方法int updateUser(User user);
}
(三)新建mapper的映射SQL(xml)
3.在resources目录下新建一个mapping包,里面创建一个xml文件
这个xml映射文件:UserMapper.xml
mapper标签里面对应的路径是mapper包里面对应映射接口的位置
SQL语句标签里面的id对应mapper接口里面定义的方法名
如果是查询的语句用resultType,后面跟着实体属性类的位置
其他的增删改用parameterType,后面跟着的是代表要往这个SQL里面传入什么,一般只有删除是int类型,其他的也都是实体属性类位置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--这里面是映射mapper接口里面的,在这里编写sql语句-->
<mapper namespace="com.example.jiu.mapper.UserMapper"><!--namespace:对应mapper接口的全部路径--><!--映射查询方法--><select id="findAll" resultType="com.example.jiu.entity.User"><!--参数一:接口对应的方法名 参数二:封装类的详细地址-->select * from user;<!--要执行的sql语句--></select><select id="findById" resultType="com.example.jiu.entity.User">select * from user where id =#{id}</select><!--映射删除的方法--><delete id="deleteUserById" parameterType="java.lang.Integer">delete from user where id = #{id}</delete><!-- 这里映射增加的方法 --><insert id="addUser" parameterType="com.example.jiu.entity.User">insert into user (username,password) values (#{username},#{password})</insert><!-- 这里定义修改的方法 --><update id="updateUser" parameterType="com.example.jiu.entity.User">update user set username = #{username},password = #{password} where id = #{id}</update></mapper>
(四)新建服务层接口
4.新建一个service包,这里是服务层,主要就是编写逻辑代码的,拿mapper层的数据来编写逻辑代码,然后再交给控制层去调用。
服务层接口:UserService
这个接口里面的方法和mapper层接口里面的方法一样,这个接口存在的意义是为了降低耦合度
package com.example.jiu.service;
import com.example.jiu.entity.User;
import java.util.List;//这里写的和mapper接口里面的一样
public interface UserService {List<User> findAll();User findById(Integer id);int deleteUserById(Integer id);int addUser(User user);int updateUser(User user);
}
(五)新建服务层的实现类
5.在service包下再建立一个Impl包(包名首字母大写的),里面写上服务类接口的实现类
服务层实现类名称:UserServiceImpl
这里是实现了服务层的接口,并把mapper数据层注入到里面,里面的方法都是用快捷键去实现的,return后面跟着的全局变量.方法
package com.example.jiu.service.Impl;import com.example.jiu.entity.User;
import com.example.jiu.mapper.UserMapper;
import com.example.jiu.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;import java.util.List;@Service
public class UserServiceImpl implements UserService {//调用mapper的接口用做全局变量private final UserMapper userMapper;//代表当这个实现类被实例化就会自动找到mapper接口,并注入其中@Autowiredpublic UserServiceImpl(UserMapper userMapper) {this.userMapper = userMapper;}//这里都是用快捷键去实现生成接口里面的方法的。不过return后面跟着的要自己写,全局变量.方法//查询全部@Overridepublic List<User> findAll() {return userMapper.findAll();}//根据id查询@Overridepublic User findById(Integer id) {return userMapper.findById(id);}//根据id删除@Overridepublic int deleteUserById(Integer id) {return userMapper.deleteUserById(id);}//增加@Overridepublic int addUser(@RequestBody User user) {return userMapper.addUser(user);}//修改@Overridepublic int updateUser(User user) {return userMapper.updateUser(user);}
}
(六)控制层类
6.新建一个controller包,里面创建对应的控制类
控制层类名:UserController
这里面要自动注入服务层的实现类供下面的方法调用
方法名字可以自定义
package com.example.jiu.controller;
import com.example.jiu.entity.User;
import com.example.jiu.service.Impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserServiceImpl userServiceImpl;//查询全部的方法,调用服务层@GetMappingpublic List<User> findAll(){return userServiceImpl.findAll();}//根据id查询@GetMapping("/{id}")public User findById(@PathVariable Integer id){return userServiceImpl.findById(id);}//根据id删除,调用服务层@DeleteMapping("/{id}")public int delete(@PathVariable Integer id){return userServiceImpl.deleteUserById(id);}//增加的方法,调用服务层@PostMappingpublic int add(@RequestBody User user){return userServiceImpl.addUser(user);}//修改的方法,调用服务层@PutMappingpublic int put(@RequestBody User user){return userServiceImpl.updateUser(user);}}
(七)配置文件加入扫描xml文件
7.在yml配置文件里面加入这个,代表可以把xml的文件加载扫描到
第一个是代表扫描到xml文件的包路径里面
第二个是代表实体类的包路径
mybatis:mapper-locations: classpath:mapping/*.xmltype-aliases-package: com.example.jiu.entity
四、运行代码
这里用的是postman测试
postman测试后端增删改查_云边的快乐猫的博客-CSDN博客
查询全部
get请求。就可以直接网页上面运行
http://localhost:80/user
根据ID查询
get请求。例如查询id为1的就这样可以查询
http://localhost:80/user/1
根据ID删除
delete请求。例如删除id为8的那行数据,删除成功返回1
http://localhost:80/user/8

新增
post请求。例如添加一个数据进去,由于数据库里面的id是设置为自增的,这里就不用添加id
了
http://localhost:80/user


修改
put请求,往里面传入数据,用json格式,修改id为9的数据,修改成功返回1
http://localhost:80/user


五、代码获取
链接:https://pan.baidu.com/s/18Cy1RluCx04_9TRi4nsiVg?pwd=jiux
提取码:jiux
相关文章:
springboot整合mybatis实现增删改查(xml)--项目阶段1
目录 一、前言 二、创建项目 创建MySQL数据库和表 创建springboot项目 本文总体代码结构图预览 三、编写代码 (一)新建实体层属性类 (二)新建数据层mapper接口 (三)新建mapper的映射SQL(…...
springboot文件上传异步报错
因为迁移的生产环境,在新的服务器发生了之前没有遇到的问题,这种问题是在异步文件上传的时候才会出现 错误信息如下 16:17:50.009 ERROR c.w.einv.minio.service.impl.MinioFileServiceImpl - 文件上传错误! java.io.FileNotFoundException: /applicati…...
error: unable to unlink old ‘.gitlab-ci.yml‘: Permission denied
#gitlab-runner 执行代码git pull origin xxx 更新时候报 error: unable to unlink old ‘.gitlab-ci.yml’: Permission denied 问题环境:centos 部署gitlab-runner 执行脚本方式 选的shell 产生问题的原因:gitlab-runner程序进程占用锁定了.gitlab-ci…...
AJAX学习笔记3练习
AJAX学习笔记2发送Post请求_biubiubiu0706的博客-CSDN博客 1.验证用户名是否可用 需求,用户输入用户名,失去焦点-->onblur失去焦点事件,发送AJAX POST请求,验证用户名是否可用 新建表 前端页面 WEB-INF下新建lib包引入依赖,要用JDBC 后端代码 package com.web;import jav…...
springboot实战(五)之sql业务日志输出,重要
目录 环境: 一、mybatis-plus之sql分析日志输出 1.配置 2.验证 3.高级输出方式 二、业务日志输出到文件 1.添加log4j2依赖 2.排除logback依赖 3.新增log4j2的配置文件 4.添加配置 5.启动测试 6.给日志请求加个id 6.1、过滤器filter实现 6.2、测试 6.3、…...
redis7.2.0 centos源码编译安装并设置开机自启动
下载源码包 wget https://github.com/redis/redis/archive/7.2.0.tar.gz tar -zxf 7.2.0.tar.gz 编译编码 编译编码 cd redis-7.2.0 make && make install 此时默认redis-server redis-cli等命令行安装到目录/usr/local/bin/目录中。 如果你想安装命令行到指定目录中你…...
网易低代码引擎Tango正式开源
一、Tango简介 Tango 是一个用于快速构建低代码平台的低代码设计器框架,借助 Tango 只需要数行代码就可以完成一个基本的低代码平台前端系统的搭建。Tango 低代码设计器直接读取前端项目的源代码,并以源代码为中心,执行和渲染前端视图,并为用户提供低代码可视化搭建能力,…...
Apache Linkis 与 OceanBase 集成:实现数据分析速度提升
导语:恭喜 OceanBase 生态全景图中又添一员,Apache Linkis 构建了一个计算中间件层,以促进上层应用程序和底层数据引擎之间的连接、治理和编排。 近日,计算中间件 Apache Linkis 在其新版本中通过数据源功能,支持用户通…...
EXPLAIN概述与字段剖析
6. 分析查询语句:EXPLAIN(重点) 6.1 概述 定位了查询慢的sQL之后,我们就可以使用EXPLAIN或DESCRIBE 工具做针对性的分析查询语句。DESCRIBE语句的使用方法与EXPLAIN语句是一样的,并且分析结果也是一样的。 MySQL中有专门负责优化SELECT语句…...
基于Java IO 序列化方案的memcached-session-manager多memcached节点配置
session的序列化方案官方推荐的有4种 java serializationmsm-kryo-serializermsm-javolution-serializermsm-xstream-serializer 关于这几种,官方也给出了比较: Java serialization is very robust and a proven technology. The biggest disadvantage IMHO is th…...
LinkedList(3):并发异常
1 LinkedList并发异常 package com.example.demo;import java.util.Iterator; import java.util.LinkedList;public class TestLinkedList {public static void main(String[] args) {LinkedList linkedList new LinkedList(); //双向链表linkedList.add(11);linkedList.add(…...
vue里el-form+el-table实现验证规则的写法
vue里el-formel-table实现验证规则的写法 vue里el-formel-table实现验证规则的写法 vue里el-formel-table实现验证规则的写法 重点是因为使用el-form el-table与单独使用el-form时数据不同,前者是对象json数组,后者是对象,导致了el-form-ite…...
K8S 基础概念学习
1.K8S 通过Deployment 实现滚动发布,比如左边的ReplicatSet 的 pod 中 是V1版本的镜像,Deployment通过 再启动一个 ReplicatSet 中启动 pod中 镜像就是V2 2.每个pod 中都有一个pause 容器,他会连接本pod中的其他容器,实现互通。p…...
Java之正则表达式的详细解析
正则表达式 1.1 正则表达式的概念及演示 在Java中,我们经常需要验证一些字符串,例如:年龄必须是2位的数字、用户名必须是8位长度而且只能包含大小写字母、数字等。正则表达式就是用来验证各种字符串的规则。它内部描述了一些规则,…...
移动端的屏幕分辨率与浏览器的视口宽度(视口大小)是两回事儿
问:在移动端的Web设计中,屏幕的分辨率和视口大小是不是是两回事儿? 答: 是的,屏幕的分辨率和视口大小在移动端的Web设计中是两个不同的概念。 屏幕分辨率(Screen Resolution):这指的…...
分布式 - 服务器Nginx:基础系列之Nginx静态资源优化配置指令sendfile | tcp_nopush | tcp_nodelay
文章目录 1. sendfile 指令2. tcp_nopush 指令3. tcp_nodelay 指令 1. sendfile 指令 请求静态资源的过程:客户端通过网络接口向服务端发送请求,操作系统将这些客户端的请求传递给服务器端应用程序,服务器端应用程序会处理这些请求ÿ…...
Sentinel配置的blockHandler方法不生效
①首先配置流控的资源名跟SentinelResource中的Value配置的一定要一直且唯一 ②其次blockhandler后面的方法一定要跟下面指定的方法名称是一样的 ③也就是我犯下的错误,一定要注意是上面那个才是Sentinel的,下面的是sun公司的…我说呢,一直…...
Mybatis的三种映射关系以及联表查询
目录 一、概念 二、一对一 1、配置generatorConfig.xml 2、Vo包的编写 3、xml的sql编写 4、编写对应接口及实现类 5、测试 三、一对多 1、Vo包类的编写 2、xml的sql编写 3、编写对应接口及实现类 4、测试 四、多对多 1、Vo类 2、xml的sql配置 3、接口及接口实现…...
基于串口校时的数字钟设计
文章目录 设计目标硬件设计数码管串口 软件设计顶层模块串口接收模块数据处理模块时钟模块串口发送模块 总结 设计目标 环境:ACX720开发板 实现功能: 数码管能够显示时分秒能够接收串口数据修改时间能够将当前时间以1s一次速率发送到电脑 硬件设计 数…...
支持向量机(二)
文章目录 前言具体内容 前言 总算要对稍微有点难度的地方动手了,前面介绍的线性可分或者线性不可分的情况,都是使用平面作为分割面的,现在我们采用另一种分割面的设计方法,也就是核方法。 核方法涉及的分割面不再是 w x b 0 wx…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
