当前位置: 首页 > news >正文

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项目 本文总体代码结构图预览 三、编写代码 &#xff08;一&#xff09;新建实体层属性类 &#xff08;二&#xff09;新建数据层mapper接口 &#xff08;三&#xff09;新建mapper的映射SQL&#xff08…...

springboot文件上传异步报错

因为迁移的生产环境&#xff0c;在新的服务器发生了之前没有遇到的问题&#xff0c;这种问题是在异步文件上传的时候才会出现 错误信息如下 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 问题环境&#xff1a;centos 部署gitlab-runner 执行脚本方式 选的shell 产生问题的原因&#xff1a;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业务日志输出,重要

目录 环境&#xff1a; 一、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 集成:实现数据分析速度提升

导语&#xff1a;恭喜 OceanBase 生态全景图中又添一员&#xff0c;Apache Linkis 构建了一个计算中间件层&#xff0c;以促进上层应用程序和底层数据引擎之间的连接、治理和编排。 近日&#xff0c;计算中间件 Apache Linkis 在其新版本中通过数据源功能&#xff0c;支持用户通…...

EXPLAIN概述与字段剖析

6. 分析查询语句&#xff1a;EXPLAIN(重点) 6.1 概述 定位了查询慢的sQL之后&#xff0c;我们就可以使用EXPLAIN或DESCRIBE 工具做针对性的分析查询语句。DESCRIBE语句的使用方法与EXPLAIN语句是一样的&#xff0c;并且分析结果也是一样的。 MySQL中有专门负责优化SELECT语句…...

基于Java IO 序列化方案的memcached-session-manager多memcached节点配置

session的序列化方案官方推荐的有4种 java serializationmsm-kryo-serializermsm-javolution-serializermsm-xstream-serializer 关于这几种&#xff0c;官方也给出了比较: 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时数据不同&#xff0c;前者是对象json数组&#xff0c;后者是对象&#xff0c;导致了el-form-ite…...

K8S 基础概念学习

1.K8S 通过Deployment 实现滚动发布&#xff0c;比如左边的ReplicatSet 的 pod 中 是V1版本的镜像&#xff0c;Deployment通过 再启动一个 ReplicatSet 中启动 pod中 镜像就是V2 2.每个pod 中都有一个pause 容器&#xff0c;他会连接本pod中的其他容器&#xff0c;实现互通。p…...

Java之正则表达式的详细解析

正则表达式 1.1 正则表达式的概念及演示 在Java中&#xff0c;我们经常需要验证一些字符串&#xff0c;例如&#xff1a;年龄必须是2位的数字、用户名必须是8位长度而且只能包含大小写字母、数字等。正则表达式就是用来验证各种字符串的规则。它内部描述了一些规则&#xff0c…...

移动端的屏幕分辨率与浏览器的视口宽度(视口大小)是两回事儿

问&#xff1a;在移动端的Web设计中&#xff0c;屏幕的分辨率和视口大小是不是是两回事儿&#xff1f; 答&#xff1a; 是的&#xff0c;屏幕的分辨率和视口大小在移动端的Web设计中是两个不同的概念。 屏幕分辨率&#xff08;Screen Resolution&#xff09;&#xff1a;这指的…...

分布式 - 服务器Nginx:基础系列之Nginx静态资源优化配置指令sendfile | tcp_nopush | tcp_nodelay

文章目录 1. sendfile 指令2. tcp_nopush 指令3. tcp_nodelay 指令 1. sendfile 指令 请求静态资源的过程&#xff1a;客户端通过网络接口向服务端发送请求&#xff0c;操作系统将这些客户端的请求传递给服务器端应用程序&#xff0c;服务器端应用程序会处理这些请求&#xff…...

Sentinel配置的blockHandler方法不生效

①首先配置流控的资源名跟SentinelResource中的Value配置的一定要一直且唯一 ②其次blockhandler后面的方法一定要跟下面指定的方法名称是一样的 ③也就是我犯下的错误&#xff0c;一定要注意是上面那个才是Sentinel的&#xff0c;下面的是sun公司的…我说呢&#xff0c;一直…...

Mybatis的三种映射关系以及联表查询

目录 一、概念 二、一对一 1、配置generatorConfig.xml 2、Vo包的编写 3、xml的sql编写 4、编写对应接口及实现类 5、测试 三、一对多 1、Vo包类的编写 2、xml的sql编写 3、编写对应接口及实现类 4、测试 四、多对多 1、Vo类 2、xml的sql配置 3、接口及接口实现…...

基于串口校时的数字钟设计

文章目录 设计目标硬件设计数码管串口 软件设计顶层模块串口接收模块数据处理模块时钟模块串口发送模块 总结 设计目标 环境&#xff1a;ACX720开发板 实现功能&#xff1a; 数码管能够显示时分秒能够接收串口数据修改时间能够将当前时间以1s一次速率发送到电脑 硬件设计 数…...

支持向量机(二)

文章目录 前言具体内容 前言 总算要对稍微有点难度的地方动手了&#xff0c;前面介绍的线性可分或者线性不可分的情况&#xff0c;都是使用平面作为分割面的&#xff0c;现在我们采用另一种分割面的设计方法&#xff0c;也就是核方法。 核方法涉及的分割面不再是 w x b 0 wx…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...