一,环境配置
导入依赖
<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);//输出的是女
}