SpringBoot整合mybatis-plus

springboot整合mybatis-plus【详细版】 MyBatis-Plus(简称MP)是一个MyBatis的增强工具,旨在在MyBatis的基础上只做增强不做改变,以简化开发、提高效率。MyBatis-Plus保持了MyBatis原有的所有特性,同时增加了一些实用的功能,使得开发者能够更加便捷地进行数据库操作。主要用于指定表名,实现实体类与表名的绑定,作用于类上,适用于表名与实体类名称不统一的情况,统一的情况可以不用写。 阅读详情

环境准备

SpringBoot2.7.10 + JDK17 + MySQL8.0.30社区版 + Mybatis-plus(简介 | MyBatis-Plus (baomidou.com)),这是一个简单的SpringBootWeb项目。

数据库数据如下

数据库数据可以直接使用Navicat直接导入运行SQL文件就行了,或者复制下面的SQL语句进行导入数据,也可以复制下面语句到txt文件中,然后重命名为SQL。然后使用Navicat导入数据

/*
 Navicat Premium Data Transfer

 Source Server         : mysql8.0.30
 Source Server Type    : MySQL
 Source Server Version : 80030
 Source Host           : localhost:3306
 Source Schema         : test

 Target Server Type    : MySQL
 Target Server Version : 80030
 File Encoding         : 65001

 Date: 05/11/2023 23:39:10
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID',
  `role_name` varchar(35) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '角色名称',
  `describe` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '角色描述',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `sys_role_id_uindex`(`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role` VALUES (1, '超级管理员', '超级管理员');
INSERT INTO `sys_role` VALUES (2, '管理员', '管理员');
INSERT INTO `sys_role` VALUES (3, '普通角色', '普通角色');

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `name` varchar(35) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓名',
  `age` int NULL DEFAULT 0 COMMENT '年龄',
  `sex` int NULL DEFAULT 0 COMMENT '性别(0,女,1,男)',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `sys_user_id_uindex`(`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (1, '张三', 98, 1);
INSERT INTO `sys_user` VALUES (2, '李四', 80, 1);
INSERT INTO `sys_user` VALUES (3, '王五', 60, 1);
INSERT INTO `sys_user` VALUES (4, '赵六', 40, 1);
INSERT INTO `sys_user` VALUES (5, '赵柳', 24, 0);
INSERT INTO `sys_user` VALUES (6, '钱七', 24, 0);
INSERT INTO `sys_user` VALUES (7, '逻辑', 108, 1);
INSERT INTO `sys_user` VALUES (8, '程心', 24, 0);
INSERT INTO `sys_user` VALUES (9, '张小三', 40, 0);
INSERT INTO `sys_user` VALUES (10, '李小四', 24, 1);
INSERT INTO `sys_user` VALUES (11, '王小五', 24, 0);
INSERT INTO `sys_user` VALUES (12, '赵小柳', 24, 0);

-- ----------------------------
-- Table structure for sys_user_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE `sys_user_role`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户角色联系表ID',
  `user_id` bigint NULL DEFAULT NULL COMMENT '用户ID',
  `role_id` bigint NULL DEFAULT NULL COMMENT '角色ID',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `sys_user_role_id_uindex`(`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户角色联系表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of sys_user_role
-- ----------------------------
INSERT INTO `sys_user_role` VALUES (1, 1, 1);
INSERT INTO `sys_user_role` VALUES (2, 1, 2);
INSERT INTO `sys_user_role` VALUES (3, 2, 1);
INSERT INTO `sys_user_role` VALUES (4, 2, 3);

SET FOREIGN_KEY_CHECKS = 1;


三张表的内容如下图所示:
在这里插入图片描述

maven坐标依赖如下所示

这里有一点需要注意的地方就是,不同版本的SpringBoot对MySQL的驱动依赖的支持可能会有所区别,可以参考这里:SpringBoot中mysql的驱动依赖问题_mysql依赖-CSDN博客,建议使用本文章的SpringBoot版本。

<?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.10</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.ygy</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>demo</description>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>

        <!--引入Knife4j的官方start包,该指南选择Spring Boot版本<3.0,开发者需要注意-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
            <version>4.3.0</version>
        </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>
    </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>

application.yml配置如下所示

简介 | MyBatis-Plus (baomidou.com)

server:
  port: 8888

# 连接接数据库,这里就不用druid连接池了,使用SpringBoot默认的吧,简单例子没必要搞那么复杂
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: root
# mybatis-plus配置,在控制台打印SQL语句
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在启动类中设置Mapper包的扫描

在启动类中设置了Mapper目录下的包扫描,这样使用mybatis-plus代码生成器生成的Mapper层的接口就不需要再每个Mapper接口中自己手动添加@Mapper注解也可以使用Mapper层提供的方法了
这里需要先建立一个mapper目录
在这里插入图片描述
在这里插入图片描述

package com.ygy;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
// 开启扫描Mapper层
@MapperScan("com.ygy.mapper")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

接下来就是代码中整合Mybatis-plus了

快速开始 | MyBatis-Plus (baomidou.com)
在上面给出的maven坐标依赖中,我已经导入了mybatis-plus的坐标。具体看上面的的

 <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3</version>
        </dependency>

假设我使用mybatis-plus对sys_user表个进行代码开发。

这里需要手写Controller、domain、mapper/dao、Service、ServiceImpl层的代码。需要为每张表都手动建立对应的层级的内容。这个过程很繁琐,而且重复性很高。所以这里需要了解一下整合MP之后每一层的内容需要继承或者实现什么。

温馨提示:这里了解一下就可以了,这个建立各个项目的过程太过繁琐了,后面后代码生成器,这届直接根据表明生成对应的内容哦!!!

目录结构如下所示:
在这里插入图片描述

domain层

User.java

package com.ygy.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

/**
 * <p>
 * 用户表
 * </p>
 *
 * @author ygy
 * @since 2023-11-05
 */
@Getter
@Setter
@TableName("sys_user")
@ApiModel(value = "User对象", description = "用户表")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty("用户ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @ApiModelProperty("姓名")
    private String name;

    @ApiModelProperty("年龄")
    private Integer age;

    @ApiModelProperty("性别(0,女,1,男)")
    private Integer sex;
}

Mapper/Dao层

在mapper层或者Dao层,需要继承mybatis-plus内置的BaseMapper,然后什么都不用写,这一层就具有了对单表增删改查的所有功能了,如这里下面这里是对sys_user表具有了增删改查的功能了
UserMapper.java

package com.ygy.mapper;

import com.ygy.domain.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import java.util.List;

/**
 * <p>
 * 用户表 Mapper 接口
 * </p>
 *
 * @author ygy
 * @since 2023-11-05
 */
public interface UserMapper extends BaseMapper<User> {
    
}

Service层

在Service层,需要继承mybatis-plus内置的IService,然后什么都不用写。这一层就具有了对单表增删改查的所有功能了,如这里下面这里是对sys_user表具有了增删改查的功能了

IUserService.java

package com.ygy.service;

import com.ygy.domain.User;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author ygy
 * @since 2023-11-05
 */
public interface IUserService extends IService<User> {
}

在ServiceImpl中

在UserServiceImpl中,需要继承mybatis-plus内置的ServiceImpl,同时是实现IUserService接口,然后什么都不用写。这一层就具有了对单表增删改查的所有功能了,如这里下面这里是对sys_user表具有了增删改查的功能了

package com.ygy.service.impl;

import com.ygy.domain.User;
import com.ygy.mapper.UserMapper;
import com.ygy.service.IUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 用户表 服务实现类
 * </p>
 *
 * @author ygy
 * @since 2023-11-05
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

}

Controller层就是写接口就行了

Controller层直接调用MP内置的方法就行了,如这里调用MP内置的查询所有的方法list()

package com.ygy.controller;

import com.ygy.domain.User;
import com.ygy.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * <p>
 * 用户表 前端控制器
 * </p>
 *
 * @author ygy
 * @since 2023-11-05
 */
@Api(tags = "用户管理模块") // 这个是swagger的注解
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    @GetMapping()
    @ApiOperation("获取所有用户") // 这个也是swagger的注解
    public List<User> getUserAll() {
        List<User> list = userService.list();
        return list;
    }
}

MP代码生成器

简介 | MyBatis-Plus (baomidou.com),这里需要导入代码生成器的Maven坐标,具体看上面给出的Maven坐标中的

 <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>

这里是一个MP代码生成器类,然后通过右键运行,就可以生成domain、Mapper、Service、ServiceImpl层的代码了。当然这个也可以使用IDEA插件如mybatisX、easyCode等插件生产,我这里直接使用代码生成了,方便一点。只要数据库中有对应的表格就可以了,可以根据自己的需求配置。MpGenerator.java

package com.ygy;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;

import java.util.Collections;

public class MpGenerator {
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai", "root", "root")
                .globalConfig(builder -> {
                    builder.author("ygy") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            // .fileOverride() // 覆盖已生成文件
                            .outputDir("D:\\javastudykeshanchu\\wodexiewenzhangjiluxiangmu\\Java-Module-Wen-Zhang-Ji-Lu-Xiang-Mu\\demo\\src\\main\\java"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.ygy") // 设置父包名
                            .entity("domain") // 这里默认生成实体类为放在entity目录下,我这里改成放在domain目录下了
                            .pathInfo(Collections.singletonMap(OutputFile.xml, "D:\\javastudykeshanchu\\wodexiewenzhangjiluxiangmu\\Java-Module-Wen-Zhang-Ji-Lu-Xiang-Mu\\demo\\src\\main\\resources\\mapper")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("sys_user") // 设置需要生成的表名
                            .addTablePrefix("sys_", "tb_") // 设置过滤表前缀
                            .entityBuilder()
                            .enableLombok()
                            .controllerBuilder()
                            .enableRestStyle();
                })
                .templateEngine(new VelocityTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    }
}

如下图所示,找到代码生成器的类,输入对应的表明(前提是数据库中有这个表明),然后
在这里插入图片描述
生成的结果如下所示:
在这里插入图片描述
上图中的controller层并没有生成一系列的代码,这个也可以配置,有兴趣的自己去了解一下就行了,这里只是生成一个controller对应的目录和对应的Controller类。

测试一下能不能得到MySQL的数据

在UserController.java中写如下代码,进行测试,看看MP配置,以及是否能够正确连接MySQL了,截图后面有代码,可以直接复制

在这里插入图片描述
在resources目录的mapper目录中,也会生成一个对应表格的Mapper.xml的文件,这个是上面代码生成器的配置的mapper位置,具体看代码生成器的内容就知道了
在这里插入图片描述

package com.ygy.controller;

import com.ygy.domain.User;
import com.ygy.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * <p>
 * 用户表 前端控制器
 * </p>
 *
 * @author ygy
 * @since 2023-11-05
 */
@Api(tags = "用户管理模块") // 这个是swagger的注解
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    @GetMapping()
    @ApiOperation("获取所有用户") // 这个也是swagger的注解
    public List<User> getUserAll() {
        List<User> list = userService.list();
        return list;
    }
}

接口测试

为了更好的测试代码,这里需要进行knif4j的配置,生成接口文档。方便测试,懒得安装其他软件或者插件,直接使用kinf4j测试方便,而且代码中关于swagger的注解,都是来自这个knif4j框架的。这里不一定必须是使用knif4j测试的,也可以使用postman或者Apifox测试,我推荐使用Apifox,这个IDEA中有一个插件,可以通过右键的形式然后Upload to Apifox,直接生成Controller层的接口测试用例。

knif4j配置

Knife4j · 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j (xiaominfo.com),这个是官网,具体可以看官网,这里有两种配置方式,我选择通过代码的形式配置,代码往后看,有可以直接复制,如果想通过yml的形式配置的,可以看官网。这里还有一点需要注意的是,我没有配置拦截器,如果配置了拦截器或者过滤器,需要放行关于knif4j的接口和资源,具体怎么放行,看官网。代码在截图后面,这个截图只是告诉一声我代码放的位置

在这里插入图片描述
Knife4jConfiguration.java

package com.ygy.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

/**
 * knif4j配置
 */
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {

    @Bean(value = "dockerBean")
    public Docket dockerBean() {
        //指定使用Swagger2规范
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder()
                        //描述字段支持Markdown语法
                        .description("# Knife4j RESTful APIs")
                        .title("这是接口文档测试")
                        .termsOfServiceUrl("http://localhost:8888/doc.html")
                        .contact("ygy@qq.com")
                        .version("1.0")
                        .build())
                //分组名称
                .groupName("用户服务")
                .select()
                //这里指定Controller扫描包路径
                .apis(RequestHandlerSelectors.basePackage("com.ygy.controller"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }
}

启动项目测试接口

因为配置了knif4j的缘故,这样就可以直接通过启动项目然后访问knif4j生成的接口文档进行接口测试了,如过这里启动那个日志中端口号为8888
在这里插入图片描述
这样我们就可以访问knif4j生成的接口文档了:http://localhost:8888/doc.html,然后再浏览器访问这个地址就可以了
在这里插入图片描述
在这里插入图片描述
我们去IDEA的运行控制台中看一下,Mybatis-plus给我们打印的SQL语句
在这里插入图片描述
到这里,SpringBoot + MySQL + Mybatis-plus的整合就完成了。剩下的就是熟悉Mybatis-plus,然后开发了。

Mybatis-plus除了使用内置的方法,我们也可以使用mybatis的方式开发项目,mybatis-plus是在mybatis的基础上增强而已,所以说并不影响我们使用mybatis的形式进行开发,也就是如在对应的xml文件写SQL语句,然后进行开发,也就是说,你可以把它当成mybatis使用。具体如下所示:

User.java

package com.ygy.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

/**
 * <p>
 * 用户表
 * </p>
 *
 * @author ygy
 * @since 2023-11-05
 */
@Getter
@Setter
@TableName("sys_user")
@ApiModel(value = "User对象", description = "用户表")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty("用户ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @ApiModelProperty("姓名")
    private String name;

    @ApiModelProperty("年龄")
    private Integer age;

    @ApiModelProperty("性别(0,女,1,男)")
    private Integer sex;
}

UserController.java

package com.ygy.controller;

import com.ygy.domain.User;
import com.ygy.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * <p>
 * 用户表 前端控制器
 * </p>
 *
 * @author ygy
 * @since 2023-11-05
 */
@Api(tags = "用户管理模块") // 这个是swagger的注解
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    @GetMapping()
    @ApiOperation("获取所有用户") // 这个也是swagger的注解
    public List<User> getUserAll() {
        List<User> list = userService.list();
        return list;
    }

    @GetMapping("/getAllUserByXML")
    @ApiOperation("通过在XML中写SQL实现数据库查询")
    public List<User> getAllUserByXML() {
        List<User> userList = userService.getAllUserByXML();
        return userList;
    }
}

IUserService.java

package com.ygy.service;

import com.ygy.domain.User;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author ygy
 * @since 2023-11-05
 */
public interface IUserService extends IService<User> {

    /**
     * 通过在XML中写SQL实现数据库查询
     * @return
     */
    List<User> getAllUserByXML();
}

UserServiceImpl。java

package com.ygy.service.impl;

import com.ygy.domain.User;
import com.ygy.mapper.UserMapper;
import com.ygy.service.IUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 用户表 服务实现类
 * </p>
 *
 * @author ygy
 * @since 2023-11-05
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 通过在XML中写SQL实现数据库查询
     * @return
     */
    @Override
    public List<User> getAllUserByXML() {
        List<User> userList = userMapper.getAllUserByXML();
        return userList;
    }
}

UserMapper.java

package com.ygy.mapper;

import com.ygy.domain.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * <p>
 * 用户表 Mapper 接口
 * </p>
 *
 * @author ygy
 * @since 2023-11-05
 */
public interface UserMapper extends BaseMapper<User> {

    /*@Select("select * from sys_user")
    List<User> getAllUserByXML();*/

    List<User> getAllUserByXML();
}

UserMapper.xml

<?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.ygy.mapper.UserMapper">

    <select id="getAllUserByXML" resultType="com.ygy.domain.User">
        select * from sys_user
    </select>
</mapper>

然后访问knif4j生成的接口文档得到的结果如下所示
在这里插入图片描述
在IDEA控制台中打印的内容如下所示
在这里插入图片描述
如果不想要mybatis-plus打印的SQL日志,可以在application.yml中直接注释对应的mybatis-plus的配置就好了,这个建议在开发环境中还是开启吧,在打包的时候注释掉就好了
在这里插入图片描述

下一篇文章

我打算写,利用mybatis-plus的分页插件在xml文件中联表查询实现分页(MySQL数据库),这个看时间,有空再写

SpringBoot快速教程四整合Mybatis-plus SpringBoot3版本整合最新版Mybatis-plus的教程方便自己日常无缝迁移,那么来了,本篇教程就是基于SpringBoot3.3.4整合最新版的Mybatis-plus的3.5.7的SpringBoot3专属版本,希望大家可以和之前的Mybatis做一下对比,俗话说,没有对比,就没有伤害! 阅读详情

相关推荐

【Spring Boot】整合Mybatis与Mybatis-plus

介绍Spring Boot如何整合Mybatis和Mybatis-plus

Decade0712的博客 2249

SpringBoot整合Mybatis-plus及用法

一、mybatis-plus简介: Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。并且3.X系列支持lambda语法,让我在写条件构造的时候少了很多的"魔法值",从代码结构上更简洁了.

qq_42281649的博客 7万+

SpringBoot与MyBatis-Plus的整合与综合实例

MyBatis 是一款优秀的持久层框架,它支持定制化SQL、存储过程、以及高级映射。MyBatis3 提供的注解可以取代 XML。例如,使用注解 @Select 直接编写 SQL 完成数据查询。MyBatis-Plus 是一个对 MyBatis 进行增强的工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

pan_junbiao的博客 1701

Spring Boot3整合MyBatis Plus

⛰️个人主页: 蒾酒🔥系列专栏:《spring boot实战》目录1.前置条件2.导坐标3.配置数据源4.mybatis-plus基础配置5.配置mapper扫描路径6.配置分页拦截器7.MyBatis Plus代码生成器整合1.导坐标2.编写代码生成逻辑8.整合Druid连接池已经初始化好一个spring boot项目且版本为3X,项目可正常启动初始化教程:新版idea创建spring boot项目-CSDN博客https://blog.csdn.net/qq_62262918/article/

蒾酒的博客 8940

SpringBoot 整合mybatis,mybatis-plus

SpringBoot 整合mybatis,mybatis-plus

congge_study的博客 2万+

SolidWorks参数化建模实战:从规则定义到智能装配

本文深入探讨SolidWorks参数化建模的实战技巧,从规则定义到智能装配的全流程。通过实际案例展示如何提升设计效率300%,确保一致性,并加速系列化开发。重点解析草图阶段植入设计意图、装配体级参数化及高级技巧,帮助工程师掌握三维建模的核心竞争力。

weixin_29306317的博客 413

spring boot3整合mybatis-plus

配置mybatis-plus之属性自动填充。配置mybatis-plus分页插件。编写业务逻辑测试代码。

weixin_38716921的博客 5319

MuJoCo 关节角速度记录与可视化,监控机械臂运动状态

1. 手动计算关节速度,其中timestep为仿真步长。2. 使用data.qvel直接取得关节速度。

darcsdn 762

SpringBoot与mybatis整合以及mybatis-plus

springboot与mybatis整合以及代码自生成,数据库逆向生成插件配置,mybatis-plus相关配置

m0_57406300的博客 770

ZedBoard+Vivado(二)——PS + PL实现流水灯

硬件:Zedboard 软件:Vivado2018.2 + Win10 本文参考了http://blog.chinaaet.com/cuter521/p/35978的设计 1 设计 功能:PS + PL流水灯 语言:C 流程:创建工程-&amp;gt;IP Integrator-&amp;gt;综合、实现、生成Bitstream-&amp;gt;SDK 2 流程 2.1 创建工程 跟上一篇步骤完全相同,这里不用添加源文...

q416524389的博客 3691

手把手教你用STM32F103的IO口模拟XY2-100协议驱动数字振镜(附Keil O3优化代码)

本文详细介绍了如何使用STM32F103的IO口模拟XY2-100协议驱动数字振镜,包括协议解析、偶校验算法、寄存器级优化及Keil O3编译下的性能调优。通过硬件配置、核心代码实现和优化技巧,帮助开发者实现高速二维偏转控制,适用于工业激光雕刻和精密定位系统。

weixin_42527401的博客 258

【SpringBoot】SpringBoot整合MyBatis-Plus

SpringBoot 整合 MyBatis-Plus

liuwanqing233333的博客 1034

PLSQL Developer新手必看:如何避免安装过程中的常见坑

本文为PL/SQL Developer新手提供了详尽的安装与配置避坑指南。从版本选择、注册码使用、汉化包安装到Oracle客户端连接配置,逐一解析常见问题并提供解决方案,帮助开发者快速搭建稳定的PL/SQL开发环境,顺利开启Oracle数据库编程工作。

g9h0i1的博客 638

Spring Boot 整合MyBatis 和 Spring Boot 整合MyBatis-Plus

1. MyBatis-Plus (简称MP)是一个MyBatis 的增强工具,在MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。2. 强大的CRUD 操作:内置通用Mapper、通用Service,通过少量配置即可实现单表大部分CRUD 操作,更有强大的条件构造器,满足各类使用需求。

业精于勤,荒于嬉 4109

人大金仓集群部署(主备)

4.2 上传安装包镜像和授权文件到install目录下并授权。1、复制系统脚本到/opt/kingbase目录下(主节点)4.2 修改cluster_install.sh。回车进行下一步,直到出现以下界面,回复Y键回车。三、安装kingbase客户端段(都要安装)install目录作为安装包具体存放目录。4.1 修改install.conf文件。2、复制授权文件到安装目录下(主节点)3、修改ssh参数(节点都要配置)5、安装kingbase客户端。二、基本环境配置(都要配置)6、数据库集群安装(主节点)

edutech_wang的博客 1987

A100 NVLink集群极致优化指南

《A100 NVLink集群通信优化指南》摘要:针对A100 80G SXM机型NVLink 3.0集群,提供硬件配置检查方法(nvidia-smi topo -m)和强制启用指令。重点介绍NCCL参数调优(算法选择、低延迟协议配置)、GPUDirect RDMA启用步骤,以及单机/多机场景下的通信模式选择。包含PyTorch all_reduce基准测试方法,并给出带宽异常排查方案(dmesg检查、NCCL缓存重置)。通过CUDA Graph通信重叠和混合精度优化,可实现90%+带宽利用率。附猿界算力监控

2401_89353317的博客 580

SpringBoot整合Mybatis-Plus 实战之Mybatis-Plus的一级缓存、二级缓存详解

前言 现在的JAVA行业,貌似已经是SpringBoot + SpringCloud 的天下了,早期的SSH,SSM框架已经老去,与SpringBoot相结合的JPA框架虽然省去了很多的增删改查sql,但是比较笨拙,在面对一些复杂多变的逻辑时常常力不从心,而相对应的Mybatis由于其高度的灵活性受到广大码农的欢迎。之前整合过了springboot+mybatis,前几天看到一个面试的问一个问题,Mybatis的一级缓存,二级缓存。我想这个应该也是一个重点吧,所以今天决定来详细解读一下神秘的一二级缓存。

爱吃早餐的程序员 1万+

C#实现OPC客户端与S7-1200 PLC通信:工控场景稳定通信的实战指南(附完整代码)

标准化优先:OPC UA是工业通信的标准,相比直接通信,更适合多设备集成的工控场景;稳定性第一:必须封装断线重连、异常处理、资源释放逻辑,满足7×24小时运行需求;效率优化:高频采集场景优先用批量读写,避免单个变量频繁请求;细节把控:节点ID、变量类型、端口配置等细节是新手最容易踩坑的地方,建议先用UA Expert验证。这套代码和方案已在多个工业项目中落地,从单台S7-1200到多台S7-1200/1500集群,都能稳定运行。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1019

SpringBoot整合MyBatis-plus

SpringBoot整合Mybatis自整理使用文档

dxq11的博客 1034

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

springboot整合mybatis以及mybatis-plus 开发

MyBatis最佳搭档,只做增强不做改变,为简化开发、提高效率而生。详细信息请看官方文档MyBatis-Plus 🚀 为简化开发而生。

m0_68041576的博客 1697

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SpringBoot介绍及整合Mybatis Plus

SpringBoot通过自动配置、默认配置可以简化配置过程;3、统一的异常处理(GenericExceptionHandler、BusinessExceptionCode、BusinessException)1、自动配置、默认配置:SpringBoot提供自动配置功能,根据项目的依赖和环境自动设置Spring应用程序,减少了手动配置的复杂度。4、健康检查、监控:SpringBoot提供健康检查、应用监控、日志管理等。4、实体、dto、Mapper接口、mapper.xml。1、增加依赖【pom.xml】

xujinwei_gingko的专栏 1360

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【五】springboot整合mybatis-plus

springboot整合mybatis-plus

weixin_56995925的博客 3145

SpringBoot整合Mybatis-Plus

SpringBoot整合Mybatis-Plus 一、环境配置 1、IDEA导入插件 2、数据库导入数据 3、导入依赖 二、测试数据源和数据库连接情况 1、application.yaml 2、在测试类test一下 3、显示效果 三、编写代码 1、pojo实体类 2、mapper接口类 3、service业务逻辑层 4、controller控制层 5、index前端页面 四、最终效果

酷小亚 2776

SpringBoot 整合Mybatis-plus

小伙伴们!五一小长假回来了,玩的开不开心呢。利用五一小长假,总结了一下利用Spring-Boot工程整合mybatis-plus 。 希望可以帮助到大家!废话不多说,直接开始 一:创建Spring-Boot工程 1:创建完了之后,删除一些不需要的东西,大家自定对照下图。 也可以不删,主要是看起来很不舒服。 2: 导入 坐标(pom.xml) 由于是在SpringBoot基础上创建,依赖很简单,先只有三个...

a__wjsjs的博客 7449
上一篇: el-tree中展示项换行展示
下一篇: 利用mybatis-plus的分页插件在xml文件中联表查询实现分页(MySQL数据库)
m0_62317155
博客等级 码龄5年 342粉丝 63原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值