springboot整合mybatis-plus

mybatis-plus是什么

MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

引入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.6.9</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

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

    <properties>
        <java.version>1.8</java.version>
        <lombok.version>1.18.28</lombok.version>
        <hutool-all.version>5.8.21</hutool-all.version>
        <fastjson.version>2.0.40</fastjson.version>
        <mysql-connector-java.version>8.0.33</mysql-connector-java.version>
        <mybatis-plus-boot-starter.version>3.5.3.2</mybatis-plus-boot-starter.version>
        <druid-spring-boot-starter.version>1.2.19</druid-spring-boot-starter.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>

            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>${hutool-all.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql-connector-java.version}</version>
            </dependency>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus-boot-starter.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid-spring-boot-starter.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

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

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置yml文件

yaml 复制代码
spring:
  application:
    name: demo

  #配置redis信息
  redis:
    host: ip
    port: 端口
    password: 密码
    lettuce:
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 8
        min-idle: 0

  #配置rabbitmq信息
  rabbitmq:
    host: ip
    port: 端口
    username: 账号
    password: 密码
    virtual-host: /
    #可以监听消息是否从生产者成功传递到交换机
    publisher-confirm-type: CORRELATED
    #可以监听消息是否从交换机传递到队列
    publisher-returns: true
    listener:
      simple:
        #可以监听消费者是否成功处理消息
        acknowledge-mode: MANUAL

  #配置数据库信息
  datasource:
    url: jdbc:mysql://ip:端口/数据库名?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&useAffectedRows=true&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: 账号
    password: 密码
    type: com.alibaba.druid.pool.DruidDataSource


server:
  port: 8080

#配置mybatis-plus信息
mybatis-plus:
  configuration:
    #日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #驼峰形式显示
    map-underscore-to-camel-case: true
  mapper-locations: classpath:mybatis-mapper/*.xml
  global-config:
    db-config:
      #全局逻辑删除的实体字段名
      logic-delete-field: isDeleted
      #逻辑已删除值(默认为1)
      logic-delete-value: 1
      #逻辑未删除值(默认为0)
      logic-not-delete-value: 0

编写配置类

日期时间格式化配置类

主要用于解决字段类型为LocalDate、LocalTime、LocalDateTime时,返回结果自动转换为对应时间格式。

java 复制代码
package com.example.springbootdemo.config;

import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

/**
 * <p>
 *  LocalDateTime格式化配置类
 * </p>
 *
 * @author yurenwei
 * @since 2023/9/7
 */
@Slf4j
@Configuration
public class LocalDateTimeFormatConfig {

    @Bean
    public ObjectMapper objectMapper() {
        log.info("日期格式转换,被调用了");
        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)));
        objectMapper.registerModule(javaTimeModule);

        return objectMapper;
    }

}

mybatis-plus配置类

主要配置分页插件

kotlin 复制代码
package com.example.springbootdemo.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * <p>
 *  MybatisPlus配置类
 * </p>
 *
 * @author yurenwei
 * @since 2023/9/7
 */
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }


}

元数据自动填充配置类

主要配置字段创建时间createTime,修改时间updateTime在新增和修改时自动填充数据。

java 复制代码
package com.example.springbootdemo.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * <p>
 *  自动填充元数据配置类
 * </p>
 *
 * @author yurenwei
 * @since 2023/9/7
 */
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 插入时自动填充
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        if (metaObject.hasSetter("createTime")) {
            metaObject.setValue("createTime", LocalDateTime.now());
        }

        if (metaObject.hasSetter("updateTime")) {
            metaObject.setValue("updateTime", LocalDateTime.now());
        }
    }

    /**
     * 更新时自动填充
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        if (metaObject.hasSetter("updateTime")) {
            metaObject.setValue("updateTime", LocalDateTime.now());
        }
    }

}

编写启动类

kotlin 复制代码
package com.example.springbootdemo;

import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 启动类
 * @author yurenwei
 */
@Slf4j
@MapperScan("com.example.springbootdemo.mapper")
@SpringBootApplication
public class SpringbootDemoApplication {

    public static void main(String[] args) {
        log.info("demo项目启动成功");
        SpringApplication.run(SpringbootDemoApplication.class, args);
    }

}

编写控制器controller

less 复制代码
package com.example.springbootdemo.controller;

import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.springbootdemo.entity.User;
import com.example.springbootdemo.mybatisplus.IUserService;
import com.example.springbootdemo.util.Result;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 *  用户控制器
 * </p>
 *
 * @author yurenwei
 * @since 2023/9/7
 */
@RestController
@RequestMapping("/api/user")
public class UserController {

    @Autowired
    private IUserService iUserService;

    /**
     * 新增
     *
     * @return
     */
    @PostMapping("/add")
    public Result add(@RequestBody User params){
        params.setId(IdUtil.getSnowflakeNextId());
        iUserService.save(params);
        return Result.ok();
    }

    /**
     * 修改
     *
     * @return
     */
    @PostMapping("/update")
    public Result update(@RequestBody User params){
        User user = iUserService.getById(params.getId());
        BeanUtils.copyProperties(params,user);
        iUserService.updateById(user);
        return Result.ok();
    }

    /**
     * 详情
     *
     * @return
     */
    @GetMapping("/queryDetail/{id}")
    public Result<User> update(@PathVariable Long id){
        return Result.ok(iUserService.getById(id));
    }

    /**
     * 删除
     *
     * @return
     */
    @GetMapping("/delete/{id}")
    public Result delete(@PathVariable Long id){
        iUserService.removeById(id);
        return Result.ok();
    }

    /**
     * 查询所有
     *
     * @return
     */
    @GetMapping("/getAll")
    public Result<List<User>> getAll(){
        return Result.ok(iUserService.list());
    }

    /**
     * 查询所有
     *
     * @return
     */
    @GetMapping("/page")
    public Result<Page<User>> page(@RequestParam Long current,@RequestParam Long size){
        Page<User> pageParams = new Page<>(current, size);
        return Result.ok(iUserService.page(pageParams));
    }
}

编写接口service

java 复制代码
package com.example.springbootdemo.mybatisplus;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.springbootdemo.entity.User;

/**
 * <p>
 *  用户接口
 * </p>
 *
 * @author yurenwei
 * @since 2023/9/7
 */
public interface IUserService extends IService<User> {
}

编写接口service实现

scala 复制代码
package com.example.springbootdemo.mybatisplus.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.springbootdemo.entity.User;
import com.example.springbootdemo.mapper.UserMapper;
import com.example.springbootdemo.mybatisplus.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  用户接口实现类
 * </p>
 *
 * @author yurenwei
 * @since 2023/9/7
 */
@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}

编写mapper

java 复制代码
package com.example.springbootdemo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.springbootdemo.entity.User;
import org.springframework.stereotype.Repository;

/**
 * <p>
 *  用户mapper
 * </p>
 *
 * @author yurenwei
 * @since 2023/9/7
 */
@Repository
public interface UserMapper extends BaseMapper<User> {
}

编写mapper.xml文件

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.example.springbootdemo.mapper.UserMapper">

</mapper>

编写实体类

kotlin 复制代码
package com.example.springbootdemo.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.example.springbootdemo.enums.GenderEnum;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * <p>
 *  用户实体类
 * </p>
 *
 * @author yurenwei
 * @since 2023/9/7
 */
@Data
@Accessors(chain = true)
@TableName("user")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键id
     */
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;

    /**
     * 姓名
     */
    private String userName;

    /**
     * 手机号
     */
    private String phone;

    /**
     * 性别
     */
    private GenderEnum gender;

    /**
     * 地址
     */
    private String address;

    /**
     * 创建人
     */
    private Long createBy;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 修改人
     */
    private Long updateBy;

    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 是否删除(0、否1、是)
     */
    private Boolean isDeleted;
}

测试

新增

修改

详情

创建时间和修改时间字段返回已自动格式化为yyyy-MM-dd HH:mm:ss

查询所有

分页查询

删除

总结

至此,springboot整合mybatis-plus完成了,通过整合过程中发现,使用mybatis-plus方便多了,尤其对于单表操作,不用像之前使用mybatis时写很多冗余的代码,xml里面也要写很多sql语句,mybatis-plus都帮我们做好了,我们直接调用相关的方法即可,注重关心业务实现。当然本文是手动编写了一些代码,如UserService、UserserviceImpl等,主要是做了解,这些其实在开发过程中是不用编写,可以借助mybatis-plus代码生成工具一键生成。 最后,mybatis-plus真香,简化日常开发不少工作。

相关推荐
二闹3 分钟前
三个注解,到底该用哪一个?别再傻傻分不清了!
后端
用户490558160812514 分钟前
当控制面更新一条 ACL 规则时,如何更新给数据面
后端
林太白16 分钟前
Nuxt.js搭建一个官网如何简单
前端·javascript·后端
码事漫谈18 分钟前
VS Code 终端完全指南
后端
该用户已不存在43 分钟前
OpenJDK、Temurin、GraalVM...到底该装哪个?
java·后端
怀刃1 小时前
内存监控对应解决方案
后端
码事漫谈1 小时前
VS Code Copilot 内联聊天与提示词技巧指南
后端
Moonbit1 小时前
MoonBit Perals Vol.06: MoonBit 与 LLVM 共舞 (上):编译前端实现
后端·算法·编程语言
Moonbit1 小时前
MoonBit Perals Vol.06: MoonBit 与 LLVM 共舞(下):llvm IR 代码生成
后端·程序员·代码规范
Moonbit2 小时前
MoonBit Pearls Vol.05: 函数式里的依赖注入:Reader Monad
后端·rust·编程语言