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真香,简化日常开发不少工作。