springboot整合mybatis实现增删改查(xml)--项目阶段1

news2024/11/19 9:22:48

目录

一、前言

二、创建项目

创建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.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/dndata?serverTimezone=GMT%2b8
    username: root
    password: 123456

mybatis:
  mapper-locations: classpath:mapping/*.xml
  type-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 mapper
        PUBLIC "-//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接口,并注入其中
    @Autowired
    public UserServiceImpl(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    //这里都是用快捷键去实现生成接口里面的方法的。不过return后面跟着的要自己写,全局变量.方法
    //查询全部
    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }

    //根据id查询
    @Override
    public User findById(Integer id) {
        return userMapper.findById(id);
    }

    //根据id删除
    @Override
    public int deleteUserById(Integer id) {
        return userMapper.deleteUserById(id);
    }
    //增加
    @Override
    public int addUser(@RequestBody User user) {
        return userMapper.addUser(user);
    }
    //修改
    @Override
    public 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 {

    @Autowired
    private UserServiceImpl userServiceImpl;

    //查询全部的方法,调用服务层
    @GetMapping
    public 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);
    }
    //增加的方法,调用服务层
    @PostMapping
    public int add(@RequestBody User user){
        return userServiceImpl.addUser(user);
    }

    //修改的方法,调用服务层
    @PutMapping
    public int put(@RequestBody User user){
        return userServiceImpl.updateUser(user);
    }

}

(七)配置文件加入扫描xml文件

7.在yml配置文件里面加入这个,代表可以把xml的文件加载扫描到

第一个是代表扫描到xml文件的包路径里面

第二个是代表实体类的包路径

mybatis:
  mapper-locations: classpath:mapping/*.xml
  type-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

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

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

相关文章

QProcess 调用 ffmpeg来处理音频

项目场景&#xff1a; 在文章 qt 实现音视频的分贝检测系统中&#xff0c;实现的是边播放变解析音频数据来统计音频的分贝大小&#xff0c;并不满足实际项目的需求&#xff0c;有的视频声音正常&#xff0c;有的视频声音就偏低&#xff0c;即使放到最大音量声音也是比较小&…

Apache实现weblogic集群配置

安装apache&#xff0c;安装相对稳定的版本。如果安装后测试能否正常启动&#xff0c;可以通过访问http://localhost/进行测试。安装Weblogic&#xff0c;参见文档将bea安装目录 weblogic81/server/bin 下的 mod_wl_20.so 文件copy到 apache安装目录下Apache2/modules/目录下A…

90、00后严选出的数据可视化工具:奥威BI工具

90、00后主打一个巧用工具&#xff0c;绝不低效率上班&#xff0c;因此当擅长大数据智能可视化分析的BI数据可视化工具出现后&#xff0c;自然而然地就成了90、00后职场人常用的数据可视化工具。 奥威BI工具三大特点&#xff0c;让职场人眼前一亮&#xff01; 1、零编程&…

【STM32】学习笔记-时间戳RTC

Unix时间戳 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒 时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同&#xff0c;不同时区通…

Arrays.asList 和 null 类型

一、Arrays.asList 类型简析 Arrays.asList() 返回的List 是它的内部类&#xff0c;不能使用 retainAll() 取交集&#xff0c;导致元素的删除&#xff0c;会报错。 List<String> list Arrays.asList(value.split(",")); 替换为> List<String> list…

物联网应用中蓝牙模块怎么选?_蓝牙模块厂家

在蓝牙模块选型前期&#xff0c;一定要了解应用场景以及需要实现的功能&#xff08;应用框图&#xff09;&#xff0c;以及功能实现过程中所能提供调用的接口&#xff08;主从设备&#xff0c;功能&#xff09;&#xff0c;考虑模块供电&#xff0c;尺寸&#xff0c;接收灵敏度…

leetcode每日一练-第53题-最大子数组和

一、思路 动态规划 二、解题方法 使用了两个变量 maxSum 和 currentSum 来分别记录全局的最大和和当前连续子数组的和。遍历数组时&#xff0c;我们不断更新 currentSum&#xff0c;并比较是否需要更新 maxSum。最后&#xff0c;maxSum 就是最大的连续子数组和。 三、code …

视频监控/视频汇聚/视频云存储EasyCVR平台接入国标GB协议后出现断流情况,该如何解决?

视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。安防监控平台EasyCVR既具备传统安防视频监控的能…

【js】防抖和节流的使用场景和区别:

文章目录 一、防抖 &#xff08;多次触发 只执行最后一次&#xff09;二、节流 &#xff08;规定时间内 只触发一次&#xff09;三、防抖和节流的使用场景【1】防抖&#xff08;debounce&#xff09;【2】节流&#xff08;throttle&#xff09; 一、防抖 &#xff08;多次触发 …

功率放大器主要要求有哪些

功率放大器是电子设备中常用的组件&#xff0c;用于将输入信号的功率放大到更高的水平。为了确保功率放大器的正常工作和性能表现&#xff0c;它需要满足一系列要求。下面西安安泰将详细介绍功率放大器的主要要求&#xff0c;希望大家可以对功率放大器有清晰的认识。 一、功率放…

hadoop3.3.1单机版环境搭建详细流程记录

1、在centos7中创建必要的目录&#xff1b; 2、上传JDK安装包到tools目录&#xff1b; 3、解压JDK到/opt/server/目录&#xff1b; tar -zxvf jdk-8u221-linux-x64.tar.gz -C /opt/server/ 4、“vim&#xff1a;未找到命令”的解决办法&#xff1b; 安装vim即可&#xff1b; …

2023年产业地产研究报告

第一章 行业概况 1.1 定义 产业地产是一种特殊类型的房地产&#xff0c;它以土地为基本要素&#xff0c;以企业为投资、开发、运营的主要主体。这种类型的房地产以区域“产、城、人”的有效聚合和持续发展为核心&#xff0c;产业运营和空间运营为主要盈利途径。产业地产的主要…

【串口通信】K210与STM32串口通信、K210与OpenMV串口通信

【串口通信】K210与STM32串口通信、K210与OpenMV串口通信 串口通信前言为何需要串口通信 K210如何进行串口通信K210串口配置K210串口发送相关定义K210串口发送测试K210串口接收相关定义K210串口接收测试 STM32如何进行串口通信STM32串口配置STM32串口发送相关定义STM32串口发送…

定时任务job (现成直接用)

1. 任务调度的2种方式 1. bean调用示例: 对应的类上加Component或Service注解, 类名.方法名(ryTask.ryNoParams) 类名首字母小写; 该类必须要在com.ruoyi 包下, 因为有校验 2. 权限类名调用示例: com.ruoyi.quartz.task.RyTask.ryNoParams 注意: class(类名)调用的时候, 只能调…

C++多态案例3---电脑组装

案例描述: 电脑主要组成部件为 CPU (用于计算) &#xff0c;显卡 (用于显示) &#xff0c;内存条 (用于存储)将每个零件封装出抽象基类&#xff0c;并且提供不同的厂商生产不同的零件&#xff0c;例如Intel厂商和Lenovo厂商创建电脑类提供让电脑工作的函数&#xff0c;并且调用…

uni-app 之 vue语法

uni-app 之 vue语法 image.png --- v-html 字符 --- image.png <template><view><view>{{title}}</view>--- v-html 字符 ---<view>{{title2}}</view><view v-html"title2"></view><view>{{arr}}</view&g…

【FusionInsight 迁移】HBase从C50迁移到6.5.1(02)C50上准备FTP Server

【FusionInsight 迁移】HBase从C50迁移到6.5.1&#xff08;02&#xff09;C50上准备FTP Server HBase从C50迁移到6.5.1&#xff08;02&#xff09;C50上准备FTP Server登录老集群FusionInsight C50的Manager准备FTP User准备FTP Server HBase从C50迁移到6.5.1&#xff08;02&am…

js+html实现打字游戏v2

实现逻辑&#xff0c;看jshtml实现打字游戏v1&#xff0c;在此基础之上增加了从文件读取到的单词&#xff0c;随机选取10个单词。 效果演示 上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&l…

系统架构设计师(第二版)学习笔记----系统架构概述

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----系统架构概述 文章目录 一、系统架构的定义与发展历程1.1 架构的定义1.2 架构设计的作用1.3 架构设计产生的背景1.4 软件架构的发展历程1.5 模块化开发方法1.6 模块法方法分解模块遵循的原则1.7 软件工程…

SQLite简单介绍

一.简单介绍 SQLite是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的&#xff0c;而且已经在很多嵌入式产品中使用了它&#xff0c;它占用资源非常的低&…