首页 > 其他分享 >MybatisPlus

MybatisPlus

时间:2024-01-15 10:38:44浏览次数:32  
标签:插件 MybatisPlus 删除 数据表 MyBatisPlus id 属性

springboot-guide/docs/MyBatisPlus.md at master · CodingDocs/springboot-guide (github.com) 1、mybatis查数据库,可以看到 id 是一串相当长的数字,这是什么意思呢?提前剧透一下,这其实是分布式 id,那又何为分布式 id 呢?

分布式 id 的解决方案有很多:UUID,SnowFlake,TinyID,Uidgenerator,Leaf,Tinyid

以 UUID 为例,它生成的是一串由数字和字母组成的字符串,显然并不适合作为数据表的 id,而且 id 保持递增有序会加快表的查询效率,基于此,MyBatisPlus 使用的就是 SnowFlake(雪花算法)。   2、我们可以在实体类中使用@TableId(type = IdType.AUTO) // 设置主键策略
来设置主键的策略:

 

这里多说一点, 当实体类的主键名为 id,并且数据表的主键名也为 id 时,此时 MyBatisPlus 会自动判定该属性为主键 id,倘若名字不是 id 时,就需要标注 @TableId 注解,若是实体类中主键名与数据表的主键名不一致,则可以进行声明:   springboot-guide/docs/MyBatisPlus.md at master · CodingDocs/springboot-guide (github.com) 3、属性自动填充 数据库插入或更新时自动维护时间属性注解如下-》然后编写一个类实现 MetaObjectHandler 接口:
    @TableField(fill = FieldFill.INSERT) // 插入的时候自动填充
    private LocalDateTime gmtCreate;
    @TableField(fill = FieldFill.INSERT_UPDATE) // 插入和更新的时候自动填充
    private LocalDateTime gmtModified;
属性填充其实可以进行一些优化,考虑一些特殊情况,对于一些不存在的属性,就不需要进行属性填充,对于一些设置了值的属性,也不需要进行属性填充,这样可以提高程序的整体运行效率:
 
4、逻辑删除

4.1 逻辑删除对应的是物理删除,分别介绍一下这两个概念:

  1. 物理删除 :指的是真正的删除,即:当执行删除操作时,将数据表中的数据进行删除,之后将无法再查询到该数据
  2. 逻辑删除 :并不是真正意义上的删除,只是对于用户不可见了,它仍然存在与数据表中
  /**
     * 逻辑删除属性
     */
    @TableLogic
    @TableField("is_deleted")
    private Boolean deleted;
还是参照《阿里巴巴Java开发手册》第 5 章 MySQL 数据库相关的建议,对于布尔类型变量,不能加 is 前缀,所以我们的属性被命名为 deleted,但此时就无法与数据表的字段进行对应了,
所以我们需要使用 @TableField 注解来声明一下数据表的字段名,而 @TableLogin 注解用于设置逻辑删除属性;此时我们执行删除操作:
 

4.2 增加了如上注解后,查询时携带了一个条件: is_deleted=0 ,这也说明了 MyBatisPlus 默认 0 为不删除,1 为删除。 若是你想修改这个规定,比如设置-1 为删除,1 为不删除,也可以进行配置,

如下是全局配置,也可以单独一个表一个属性进行配置如mybatisplus逻辑删除基本实现和坑点解决_java_脚本之家 (jb51.net)

mybatis-plus:
  global-config:
    db-config:
      id-type: auto
      logic-delete-field: deleted # 逻辑删除属性名
      logic-delete-value: -1 # 删除值
      logic-not-delete-value: 1 # 不删除值
 
 

4.3 我们可以输出 MyBatisPlus 生成的 SQL 来分析一下,在配置文件中进行配置:

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 输出SQL日志
 
分页插件
注册分页插件(和下面乐观锁插件在同一个地方注册)-》service使用分页插件提供的功能
 
乐观锁插件
然后注册乐观锁插件-》MyBatisPlus 已经提供了乐观锁机制,只需要在实体类中使用 @Version 声明版本号属性:
@Configuration
public class MyBatisConfig {
    /**
     * 注册插件
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        // 乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}
 
条件构造器 在分页插件中我们简单地使用了一下条件构造器(Wrapper),下面我们来详细了解一下。 先来看看 Wrapper 的继承体系:

 

  • Wrapper:条件构造器抽象类,最顶端的父类
    • AbstractWrapper:查询条件封装抽象类,生成 SQL 的 where 条件
      • QueryWrapper:用于对象封装
      • UpdateWrapper:用于条件封装
    • AbstractLambdaWrapper:Lambda 语法使用 Wrapper
      • LambdaQueryWrapper:用于对象封装,使用 Lambda 语法
      • LambdaUpdateWrapper:用于条件封装,使用 Lambda 语法

通常我们使用的都是 QueryWrapper 和 UpdateWrapper,如下

@SpringBootTest

@MapperScan("com.wwj.mybatisplusdemo.mapper")

class MybatisplusDemoApplicationTests {

    @Autowired

    private EmployeeMapper employeeMapper;

    @Test

    void contextLoads() {

        // 查询名字中包含'j',年龄大于20岁,邮箱不为空的员工信息

        QueryWrapper<Employee> wrapper = new QueryWrapper<>();

        wrapper.like("last_name", "j");  // like可以看到它是对 j 的前后都加上了 % ,若是只想查询以 j 开头的名字,则可以使用 likeRight 方法,若是想查询以 j 结尾的名字,,则使用 likeLeft 方法。

        wrapper.gt("age", 20);

        wrapper.isNotNull("email");

        List<Employee> list = employeeMapper.selectList(wrapper);

        list.forEach(System.out::println);

    }

}

标签:插件,MybatisPlus,删除,数据表,MyBatisPlus,id,属性
From: https://www.cnblogs.com/lengsong/p/17964854

相关文章

  • MybatisPlus条件构造器
    条件构造器MybatisPlus里的sql语句有些需要传入一个AbstractWrapperQueryWrapper(LambdaQueryWrapper)【用于查询操作】和UpdateWrapper(LambdaUpdateWrapper)【用于更新、修改操作】的父类用于生成sql的where条件,entity属性也用于生成sql的where条件部分判......
  • MybatisPlus查询返回Map,其中一个字段为key,另一个字段或者实体为value
    一、需求背景项目中有一些基础数据,以国家为例,字段有国家代码、国家名称、国家面积等等信息。在项目中其他位置需要验证并使用国家数据,比如商品每次批量保存时,只能拿到国家的编码,你需要校验国家是否合法,并把国家的名称面积等字段放到商品表(案例可能不恰当,为了表达业务场景)二、遇到的......
  • SpringCloud微服务实战——搭建企业级开发框架(三十一):自定义MybatisPlus代码生成器实现
      理想的情况下,代码生成可以节省很多重复且没有技术含量的工作量,并且代码生成可以按照统一的代码规范和格式来生成代码,给日常的代码开发提供很大的帮助。但是,代码生成也有其局限性,当牵涉到复杂的业务逻辑时,简单的代码生成功能无法解决。  目前市面上的代码生成器层出不穷,大多......
  • mybatisplus-批量更新
    1.<updateid="updateBatch"parameterType="java.util.List"><foreachcollection="list"item="item"index="index"separator=";">UPDATEenterprise_oil_adjust_recordSET......
  • 工作上使用mybatisplus时遇到的问题
    报错:org.apache.ibatis.session.Configuration.getLanguageDriver(Ljava/lang/Class;)原因:依赖低版本导致了了冲突,我们改为高版本即可思路1.根据引起问题的提示中的“org.apache.ibatis.session.Configuration.getLanguageDriver”,看看能否找到对应的类,如下所示:(shitf双击然后查......
  • MyBatisPlus简介及快速搭建
    一、简介MyBatisPlus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强,不做改变,为简化开发,提高效率而生。特性及官网链接(简称苞米豆):可在IDEA中安装以下插件:MybatisX:支持跳转,自动补全生成SQL;dynamic-datasource:基于SpringBoot的多数据源组件,功能强悍,支持Seat......
  • mybatis与mybatisplus
    使用这个不会造成冲突 同时不要把<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency>删除<dependency><grou......
  • mybatisPlus注解fill = FieldFill.UPDATE和updateStrategy = FieldStrategy.IGNORED的
    由于当时使用mybatisPlus的updateById更新数据,习惯性的认为字段为null的不更新。但是上线后,出问题了。只更新状态字段,其他的一些属性竟然被置空了。赶紧排查,发现实体类中这些字段有fill=FieldFill.UPDATE,导致更新的时候如果这个字段为null也会更新为null。 同样作用的还有@T......
  • MybatisPlus
    Mybatis-Plus1.0简介MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为了简化开发、提升效率而生。MyBatis-Plus提供了通用的mapper和service,可以在不编写任何SQL语句的情况下,快速的实现对单表的CRUD、批量、逻辑删除、分页等操作官网:https://baomidou.......
  • MybatisPlus配置逻辑删除
    1、步骤1:配置逻辑删除的信息全局配置mybatis-plus:global-config:db-config:logic-delete-field:flag#全局逻辑删除的实体字段名(since3.3.0,配置后可以忽略不配置步骤2)logic-delete-value:1#逻辑已删除值(默认为1)logic-not-delete......