ICode9

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

MP:一些内容

2022-04-11 01:01:29  阅读:187  来源: 互联网

标签:语句 hashMap 删除 void 查询 内容 MP new 一些


MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

  • 引入依赖

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.1</version>
    </dependency>
    
  • 使接口继承BaseMapper

  • 直接使用BaseMapper中封装的方法

主键策略

使用@TableId中type类型指定主键策略

一般使用ASSIGN_ID或者AUTO

  • ASSIGN,通过雪花算法生成一个19位的数字
  • AUTO:自动自增。

雪花算法

长度共64bit(一个long型)。

首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。

41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。

10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。

12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。

image-20220410153243518

优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高。

#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto

自动填充

需求描述:项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。

我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作

  • 在表和类中添加createTime和updateTime

  • 使用@TableFiled注解指定修改时机

    • DEFAULT
    • INSERT,
    • UPDATE,
    • INSERT_UPDATE;
  • 创建一个类,实现MetaObjectHandler

    @Component
    public class UserHandler implements MetaObjectHandler {
        @Override
        public void insertFill(MetaObject metaObject) {
            this.setFieldValByName("createTime",new Date(),metaObject);
            //创建时,也需要把updateTime修改
            this.setFieldValByName("updateTime",new Date(),metaObject);
        }
        @Override
        public void updateFill(MetaObject metaObject) {
            this.setFieldValByName("updateTime",new Date(),metaObject);
        }
    }
    

乐观锁

主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新

乐观锁实现方式:

  • 取出记录时,获取当前version

  • 更新时,带上这个version

  • 执行更新时, set version = newVersion where version = oldVersion

  • 如果version不对,就更新失败

MP实现乐观锁

  • 添加 @Version 注解

  • 添加组件

    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
    //在MP3.4.0之后使用OptimisticLockerInnerInterceptor
    @Bean
    public OptimisticLockerInnerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInnerInterceptor();
    }
    

MP的查询

  • 批量查询
/**
 * 批量查询
 */
@Test
void batchQuery() {
    List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
}
  • 多条件查询

    此时所述多条件为“与”

/**
 * 多条件查询
 */
@Test
void MultiQuery(){
    HashMap hashMap = new HashMap();
    hashMap.put("name","zhangsan");
    hashMap.put("age","12");
    userMapper.selectByMap(hashMap);
}

MP的删除

  • 批量删除

    与批量查询类似,使用Array的方法

/**
 * 批量删除
 */
void batchDelete(){
    userMapper.deleteBatchIds(Arrays.asList(1,2,3));
}
  • 多条件删除

    与多条件查询类似

    此时所述多条件为“与”

/**
 * 多条件删除
 */
@Test
void MultiDelete(){
    HashMap hashMap = new HashMap();
    hashMap.put("name","zhangsan");
    hashMap.put("age","12");
    userMapper.selectByMap(hashMap);
}
  • 逻辑删除与物理删除

    物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据

    逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录

    实现逻辑删除

    • 数据库修改(添加字段)

    • 实体类修改,添加属性,并使用@TableLogic注解

    • 修改配置

      mybatis-plus.global-config.db-config.logic-delete-value=1 #1为逻辑删除
      mybatis-plus.global-config.db-config.logic-not-delete-value=0 #0为未被删除
      

MP的复杂查询

image-20220410202323687

查询方式 说明
setSqlSelect 设置 SELECT 查询字段
where WHERE 语句,拼接 + WHERE 条件
and AND 语句,拼接 + AND 字段=值
andNew AND 语句,拼接 + AND (字段=值)
or OR 语句,拼接 + OR 字段=值
orNew OR 语句,拼接 + OR (字段=值)
eq 等于=
allEq 基于 map 内容等于=
ne 不等于<>
gt 大于>
ge 大于等于>=
lt 小于<
le 小于等于<=
like 模糊查询 LIKE
notLike 模糊查询 NOT LIKE
in IN 查询
notIn NOT IN 查询
isNull NULL 值查询
isNotNull IS NOT NULL
groupBy 分组 GROUP BY
having HAVING 关键词
orderBy 排序 ORDER BY
orderAsc ASC 排序 ORDER BY
orderDesc DESC 排序 ORDER BY
exists EXISTS 条件语句
notExists NOT EXISTS 条件语句
between BETWEEN 条件语句
notBetween NOT BETWEEN 条件语句
addFilter 自由拼接 SQL
last 拼接在最后,例如:last(“LIMIT 1”)

标签:语句,hashMap,删除,void,查询,内容,MP,new,一些
来源: https://www.cnblogs.com/Boerk/p/16128336.html

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

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

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

ICode9版权所有