25、Mybatis-Pul 主键生成、自动填充、乐观锁、逻辑删除

1、添加Mybatis-puls的依赖

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!-- mysql 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>

2、编写application.yml配置文件

spring:
  application:
    name: mybatis-plus
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://8.129.215.115:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: root
    hikari:
      minimum-idle: 5
      idle-timeout: 600000
      maximum-pool-size: 10
      auto-commit: true
      pool-name: MyHikariCP
      max-lifetime: 1800000
      connection-timeout: 30000
      connection-test-query: SELECT 1
mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
#  configuration:
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:
  level:
    com.weishun.mybatispuls.mapper: debug

3、编写实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyUser {
    private Long id;
    private String username;
    private String password;
}

4、编写Mapper接口 和测试Mapper能否使用

@Mapper
public interface MyUserMapper extends BaseMapper<MyUser> {
}

@Autowired
MyUserMapper myUserMapper;

@Test
void contextLoads() {
List<MyUser> myUsers = myUserMapper.selectList(null);
myUsers.forEach(System.out::println);
}

 5、测试插入方法insert,Id主键生成策略:默认使用雪花算法(全球唯一ID)id数据类型必须为bigint

    @Test
    void insertTest() {
        MyUser myUser = new MyUser();
        myUser.setUsername("joe");
        myUser.setPassword("123456");
        int insert = myUserMapper.insert(myUser);
        System.out.println(insert);
        System.out.println(myUser);
    }

 

 

 

 

 

 6、自动填充处理:首先在实体类上标上注解

 

 

 7、定义自己的处理类,实现 MetaObjectHandler 接口 两个方法,再次测试新增和修改

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
        //this.setFieldValByName("version",1,metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

8、乐观锁处理 :数据表里添加version(乐观锁字段) 这里要注意的是version字段要设置默认值是0

 

 

 9、同步实体类

 

 

 

 

 

 10、编写MybatisPuls的组件,添加乐观锁的插件

@EnableTransactionManagement
@Configuration
public class MyBatisPlusConfig {
    //乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

    //分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

    //逻辑删除插件
    @Bean
    public ISqlInjector sqlInjector(){
        return new LogicSqlInjector();
    }
    //性能分析插件
    @Bean
    @Profile({"dev","test"})
    public PerformanceInterceptor performanceInterceptor(){
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(2000);
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }
}

11、测试乐观锁是否生效

//乐观锁测试
    @Test
    void updateTest2() {
        MyUser myUser = myUserMapper.selectById(1407598187476226049L);
        myUser.setUsername("测试乐观锁");
        int update = myUserMapper.updateById(myUser);
        System.out.println(update);
        System.out.println(myUser);
    }

11、批量查询和条件查询测试

    @Test
    void test01() {
        List<MyUser> myUsers = myUserMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        myUsers.forEach(System.out:: println);
        Map<String,Object> maps = new HashMap<>();
        maps.put("username","root");
        List<MyUser> myUsers1 = myUserMapper.selectByMap(maps);
        myUsers1.forEach(System.out:: println);
    }

 

12、MybatisPuls 实现分页查询

 

 

 13、测试分页查询

    @Test
    void pageTest() {
        Page<MyUser> page = new Page<>(1,5);
        myUserMapper.selectPage(page,null);
        page.getRecords().forEach(System.out:: println);
    }

14、实现物理删除(根据id删除,批量删除)

 @Test
    void deleteTest() {
        int deleteById = myUserMapper.deleteById(1L);
        int i = myUserMapper.deleteBatchIds(Arrays.asList(1, 2, 3));
    }

15、实现逻辑删除,这里要注意设置该字段必须设置默认值是:0

 

 

 

 

 

 

 

 

 

 

posted @ 2021-06-23 00:27  shunnWcs  阅读(116)  评论(0)    收藏  举报