SpringBoot整合mybatis-plus

254 阅读2分钟

一,环境配置

导入依赖

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

主类中配置扫包

@SpringBootApplication
@ServletComponentScan(basePackages = "com.example.demo1")
@MapperScan("com.example.demo1.mapper") //mapper接口的路径
public class Demo1Application {}

配置类,application.yaml

# 配置数据源
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/login
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

# 配置日志,输出sql语句
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

二,使用

pojo类

@Data
@ToString
@TableName(value = "user") //指定数据库表名
public class User {
    @TableId(type= IdType.AUTO)  //设置id自动递增
    private Integer id;
    private String account;
    private String password;
}

Dao层接口 com.example.demo1.mapper路径下创建

//@Mapper 有扫包不需要
public interface UserMapper extends BaseMapper<User> {
}

服务层接口

public interface UserService extends IService<User> {
}

服务层实现类

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

三,自动填充功能

有些时候我们可能会有这样的需求,插入或者更新数据时,希望有些字段可以自动填充数据,比如密码、version 等。在MP中提供了这样的功能,可以实现自动填充。

原理:

  • 实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
  • 注解填充字段 @TableField(.. fill = FieldFill.INSERT) 生成器策略部分也可以配置!
public class User {

    // 注意!这里需要标记为填充字段
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime date;
    
    ....
}
  • 自定义实现类 MyMetaObjectHandler
package com.example.boot.mybatisplus;

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;

/**
 * @date 2021/11/14 - 19:35
 */
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        //得到属性date,如果为空就进行填充
        Object date = getFieldValByName("date", metaObject);
        if (date == null) {
            setFieldValByName("date",LocalDateTime.now(),metaObject);
        }

        this.strictInsertFill(metaObject, "date", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
        // 或者
       // this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
        // 或者
        //this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        Object date = getFieldValByName("date", metaObject);
        if (date == null) {
            setFieldValByName("date",LocalDateTime.now(),metaObject);
        }
        this.strictUpdateFill(metaObject, "date", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)

    }
}

四,枚举的使用

修改表结构

ALTER TABLE `tb_user` ADD COLUMN `sex` int(1) NULL DEFAULT 1 COMMENT '1-男,2-女' AFTER `deleted`;

定义枚举

package com.example.boot.enumm;

/**
 * @date 2021/11/14 - 20:19
 */
import com.baomidou.mybatisplus.core.enums.IEnum;
import com.fasterxml.jackson.annotation.JsonValue;
public enum SexEnum implements IEnum<Integer> {
    MAN(1,"男"),
    WOMAN(2,"女");
    private int value;
    private String desc;
    SexEnum(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }
    @Override
    public Integer getValue() {
        return this.value;
    }
    @Override
    public String toString() {
        return this.desc;
    }
}

配置

#枚举包扫描 
mybatis-plus
    type-enums-package: com.example.boot.enumm

修改实体

private SexEnum sex;

测试

@Test
void testDate(){
    User user = new User();
    user.setAccount("李四");
    user.setPassword("1233");
    user.setSex(SexEnum.WOMAN); //数据库存的是2
    userMapper.insert(user);
  System.out.println("======="+user);//输出的是女
}