ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Mybatis-Plus一些简单使用技巧

2022-05-29 09:32:54  阅读:183  来源: 互联网

标签:metaObject 技巧 page println MybatisPlusInterceptor version Plus Mybatis public


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

Insert插入

主键生成策略

默认生成,通过雪花算法生成ID 参考博客:https://blog.csdn.net/lq18050010830/article/details/89845790

==>  Preparing: INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
==>  Parameters: 1423577873627734017(Long), 哈撒给(String), 19(Integer), 2238770242@qq.com(String)

可以观察到@TableId注下有很多主键生成方案

AUTO(0),自增长ID,前提是将数据库设置为自增长
INPUT(2),自己输入ID
ASSIGN_ID(3),雪花算法,默认
ASSIGN_UUID(4),不带下划线的UUID,但是是String类型的

自动填充

gmt_create (创建时间)gmt_modified(修改时间)这两个属性都需要操作自动化完成,我们并不能手动的去控制。

 

先在数据库里加上这两个字段

然后更改实体类,在要操作的字段上加@TableField注解,注意这里是时间的类型是LocalDateTime

@TableField(fill = FieldFill.INSERT)
private LocalDateTime gmtCreate;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime gmtModified;

这个注解下有一个FieldFill类下有这么几个常量

DEFAULT,
INSERT,
UPDATE,
INSERT_UPDATE;

然后写一个类实现MetaObjectHandler接口

这个类必须@Component注册为组件

  • public void insertFill(MetaObject metaObject)是执行插入时候执行的方法
  • public void updateFill(MetaObject metaObject)是修改时执行的方法
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("gmtCreate", LocalDateTime.now(), metaObject);
        this.setFieldValByName("gmtModified",LocalDateTime.now(),metaObject);
    }

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

 

乐观锁OptimisticLockerInnerInterceptor

当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version(作为oldVersion)
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

 

在数据库新增一个version列,默认值为1

在实体类中同样增加version,并且加上@version注解

  • 写一个MP的配置类,再次配置乐观锁的组件
@Configuration
@MapperScan("com.lyk.mapper")
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

 

分页查询

写一个MP的配置类

@Configuration
@MapperScan("com.lyk.mapper")
public class MyBatisPlusConfig {
    //分页查询
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor2() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        return interceptor;
    }
}

然后测试

  • 先获取Page对象Page(long current, long size)
    • current是当前页数
    • size是当前页数大小
Page<User> userPage = userMapper.selectPage(page, null);
List<User> records = page.getRecords();

page.getRecords()获取分页数据。

@Test
void limitText(){
    Page<User> page = new Page<>(1,5);
    Page<User> userPage = userMapper.selectPage(page, null);
    List<User> records = page.getRecords();
    System.out.println("是否有前一页"+page.hasPrevious());
    System.out.println("是否有后一页"+page.hasNext());
    System.out.println("一页有"+page.getSize()+"条数据");
    System.out.println("总页数: "+page.getPages());
    System.out.println("总记录数: "+page.getTotal());
    for (User record : records) {
        System.out.println(record);
    }

 

逻辑删除

给数据库新增一个del字段作为删除标记

  • 0代表未删除,是默认值
  • 1代表已删除

给实体类增加这个字段,并标注@TableLogic注解

@TableLogic
private int del;

在配置文件中配置

mybatis-plus.global-config.db-config.logic-delete-field=del
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

逻辑删除特点

  • 并不是在数据库层面删除了数据,只是修改了删除标记。
  • 在我们之后做查询操作的时候会追加一个条件del=0
  • 也就是说逻辑删除的数据我们仍然是查询不到的,只有数据库管理员在后台可以查看。

 

标签:metaObject,技巧,page,println,MybatisPlusInterceptor,version,Plus,Mybatis,public
来源: https://www.cnblogs.com/davidofme/p/16323196.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有