mybatis-plus

笔记

spring-boot整合mybatis-plus

1.添加依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.4</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>


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


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


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.2.0</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.62</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>3.2.0</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.21</version>
    </dependency>


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


</dependencies>
View Code

 

2.配置mysql连接

# 数据源配置
spring:
  datasource:
    url: jdbc:mysql://localhost/db01?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
View Code

 

3.创建数据库表

 

 

4.编写实体类

@Setter     // lombok
@Getter    // lombok
@ToString    // lombok
@TableName("user")    // 表名
@Accessors(chain = true) // 链式编程
public class User {
    @TableId(type = IdType.ID_WORKER) // 配置主键id,增长策略
    private Long id;
    @TableField("name")   // 配置属性与字段映射
    private String name;
    @TableField("age")
    private Integer age;
    @TableField("email")
    private String email;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "created_time",fill = FieldFill.INSERT)
    private LocalDateTime createdTime;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "last_modified_time",fill = FieldFill.INSERT_UPDATE)     // 自动填充
    private LocalDateTime lastModifiedTime;
    @Version     // 乐观锁
    @TableField(value = "version")
    private Integer version;
    @TableField("is_delete")
    @TableLogic    // 逻辑删除
    private Integer isDelete;
View Code

 

5.编写dao接口mapper

@Repository
//@Mapper
public interface UserMapper extends BaseMapper<User> {

}
View Code

 

6.测试

//继承了BaseMapper,所有的方法都来自于继承了BaseMapper
    //也可以自己编写扩展方法扩展功能
    @Autowired
    private UserMapper userMapper;

    @Test
    void contextLoads() {
        //参数为Wrapper,条件构造器
        //查询所有用户
        List<User> userList = userMapper.selectList(null);
        userList.forEach(System.out::println);
    }

    //测试插入功能
    @Test
    public void testInsert() {
        User user = new User();
//        user.setId(10L);
        user.setName("mybatis-plus1");
        user.setAge(9);
        user.setEmail("1111111@qq.com");

        int i = userMapper.insert(user);
        System.out.println(i);
        System.out.println(user);

    }

    @Test
    //测试更新
    public void testUpdate() {
        User user = new User();
        user.setId(4L);
        user.setName("修改时间");
        //自动配置动态sql
        int i = userMapper.updateById(user);
        System.out.println(i);

    }
View Code

 

拓展

1.主键策略

@TableId(type = IdType.ID_WORKER)
private Long id;

AUTO(0),
NONE(1),
INPUT(2),
ID_WORKER(3),
UUID(4),
ID_WORKER_STR(5);
View Code

 

2.自动填充字段(LocalDateTime与Date格式不同)

添加对应字段
created_time
last_modified_time

添加属性
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "created_time",fill = FieldFill.INSERT)
private LocalDateTime createdTime;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "last_modified_time",fill = FieldFill.INSERT_UPDATE)
private LocalDateTime lastModifiedTime;


配置填充处理器
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        // 修改字段对应为实体类的属性(而不是数据库的字段)
        setFieldValByName("createdTime", LocalDateTime.now(),metaObject);
        setFieldValByName("lastModifiedTime",LocalDateTime.now(),metaObject);
    }


    @Override
    public void updateFill(MetaObject metaObject) {
        setFieldValByName("lastModifiedTime",LocalDateTime.now(),metaObject);
    }
}
View Code

 

3.乐观锁

数据库添加version字段


实体类添加version属性
@Version
@TableField(value = "version")
private Integer version;

配置乐观锁插件
@MapperScan("com.gg.mapper")
@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {

    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }

}

测试
/**
* 先查询再修改,测试乐观锁
* SQL结果:UPDATE user SET create_time=?, last_modify_time=?, name=?, version=?, email=?, age=? WHERE id=? AND version=?
*/
@Test
void update(){
   User user = userMapper.selectById(6L);
    // 2、修改用户信息
    user.setName("gg");
    user.setEmail("123456@qq.com");
    // 3、执行更新操作
    userMapper.updateById(user);
}
View Code

 

4.逻辑删除

添加对应字段

添加属性
@TableField("is_delete")
@TableLogic
private Integer isDelete;

配置yml文件
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    global-config:
      db-config:
        logic-delete-value: 1
        logic-delete-not-value: 0


配置开启
@Bean
public ISqlInjector sqlInjector(){
    return new DefaultSqlInjector();
}

测试
View Code

 

5.犯过错的需要多看一遍

细节:
        1.关于自动填充时间
            1.LocalDateTime与Date格式不匹配
            2.创建时间和修改时间对应的是类中的属性(##错误的以为是表中的字段##)
            @Component
            public class MyMetaObjectHandler implements MetaObjectHandler {


                @Override
                public void insertFill(MetaObject metaObject) {
                    setFieldValByName("createdTime", LocalDateTime.now(),metaObject);
                    setFieldValByName("lastModifiedTime",LocalDateTime.now(),metaObject);
                }


                @Override
                public void updateFill(MetaObject metaObject) {
                    setFieldValByName("lastModifiedTime",LocalDateTime.now(),metaObject);
                }
            }




        2.乐观锁
            1.类需要添加@EnableTransactionManagement
            @Bean
            public OptimisticLockerInterceptor optimisticLockerInterceptor(){
            return new OptimisticLockerInterceptor();
            }
            2.测试的时候先查再修改(错误测试直接修改没有输出带version的SQL语句)
            3.使用wms的BaseEntity2类测试时version添加实体显示为null
                @Version
                @TableField(value = "version", fill = FieldFill.INSERT_UPDATE)
                protected Long version;
                判定与wms中的自动填充实现有关


        3.逻辑删除(LogicSqlInjector这个类找不到->使用DefaultSqlInjector替换)
            @Bean
            public ISqlInjector sqlInjector(){
                return new DefaultSqlInjector();
            }
            
            配置文件添加
                mybatis-plus:
                  configuration:
                    global-config:
                      db-config:
                        logic-delete-value: 1    # 删除为1
                        logic-delete-not-value: 0    # 未删除为0
View Code

 

posted @ 2021-04-11 10:13  G-G  阅读(67)  评论(0)    收藏  举报