首页 > 其他分享 >Mybatis-Plus必会知识点(精美最全)

Mybatis-Plus必会知识点(精美最全)

时间:2023-06-12 16:03:04浏览次数:33  
标签:知识点 queryWrapper System println Plus Mybatis new public out


1首先说下引入

pom里面添加:
      <!--mybatis-plus-->
     <dependency>
         <groupId>com.baomidou</groupId>
         <artifactId>mybatis-plus-boot-starter</artifactId>
         <version>3.3.1</version>
     </dependency>yml添加:
 # 数据源
spring:
  datasource:
       username: root
       password: root
       url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
       driver-class-name: com.mysql.jdbc.Driver
  创建包 mapper 编写Mapper 接口:
 
 



     
   
 
   



public interface UserMapper extends BaseMapper<User> {
     ...........
}
 
在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:
例如:
  @SpringBootApplication
 @MapperScan("com.zx.mapper")
 public class MybatisPlusApplication {
     ......
 }




2MP的主键策略

1、ASSIGN_ID

MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法)

  • 雪花算法:分布式ID生成器
  • 雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。
  • 核心思想:
  • 长度共64bit(一个long型)。
  • 首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。
  • 41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。
  • 10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。
  • 12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。

小项目我们用自增

AUTO 自增策略


  • 需要在创建数据表的时候设置主键自增
  • 实体字段中配置 @TableId(type = IdType.AUTO)

 

3自动填充

实体上增加字段并添加自动填充注解

@Data
 public class User {
     ......
         
     @TableField(fill = FieldFill.INSERT)
     private Date createTime;    //@TableField(fill = FieldFill.UPDATE)
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Date updateTime;
 }实现MetaObjectHandler接口 重写   insertFill  和 updateFill      不要忘记@Component     | 这里的数据库是datetime类型   然后在实体类里面写 Date类型
package com.zx
@Slf4j
 @Component
 public class MyMetaObjectHandler implements MetaObjectHandler {    @Override
     public void insertFill(MetaObject metaObject) {
         log.info("start insert fill ....");
         this.setFieldValByName("createTime", new Date(), metaObject);
         this.setFieldValByName("updateTime", new Date(), metaObject);
     }    @Override
     public void updateFill(MetaObject metaObject) {
         log.info("start update fill ....");
         this.setFieldValByName("updateTime", new Date(), metaObject);
     }
 }

4乐观锁

 

1、场景

一件商品,成本价是80元,售价是100元。老板先是通知小李,说你去把商品价格增加50元。小李正在玩游戏,耽搁了一个小时。正好一个小时后,老板觉得商品价格增加到150元,价格太高,可能会影响销量。又通知小王,你把商品价格降低30元。

此时,小李和小王同时操作商品后台系统。小李操作的时候,系统先取出商品价格100元;小王也在操作,取出的商品价格也是100元。小李将价格加了50元,并将100+50=150元存入了数据库;小王将商品减了30元,并将100-30=70元存入了数据库。是的,如果没有锁,小李的操作就完全被小王的覆盖了。

现在商品价格是70元,比成本价低10元。几分钟后,这个商品很快出售了1千多件商品,老板亏1多万。

2、乐观锁与悲观锁

  • 上面的故事,如果是乐观锁,小王保存价格前,会检查下价格是否被人修改过了。如果被修改过了,则重新取出的被修改后的价格,150元,这样他会将120元存入数据库。
  • 如果是悲观锁,小李取出数据后,小王只能等小李操作完之后,才能对价格进行操作,也会保证最终的价格是120元。

乐观锁实现流程

(1)修改实体类

添加 @Version 注解

      

         @Version
       
 
      

         
       
 
       
private Integer version;

(2)创建配置文件 

创建包config,创建文件MybatisPlusConfig.java
  
 
  
@MapperScan 扫描注解
  
 
  

      
    
 
    

       
     
 
    
package com.zx.config;
@EnableTransactionManagement
 @Configuration
 @MapperScan("com.zx.mapper")
 public class MybatisPlusConfig {
     
 }

 

(3)注册乐观锁插件

在 MybatisPlusConfig 中注册 Bean
 
  



      
    
 
    


           /**
      
      * 乐观锁插件
      
      */
      
 @Bean
      
 public OptimisticLockerInterceptor optimisticLockerInterceptor() {
      
     return new OptimisticLockerInterceptor();
      
 }


5查询

通过多个id批量查询

@Test
 public void testSelectBatchIds(){    List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
     users.forEach(System.out::println);
 }

简单的条件查询

通过map封装查询条件

注意:map中的key对应数据库中的列名。如:数据库user_id,实体类是userId,这时map的key需要填写user_id

@Test
 public void testSelectByMap(){    HashMap<String, Object> map = new HashMap<>();
     map.put("name", "Helen");
     map.put("age", 18);
     List<User> users = userMapper.selectByMap(map);    users.forEach(System.out::println);
 }

6分页

分页插件

MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能

(1)添加分页插件

配置类中添加@Bean配置

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

(2)selectPage实现分页

@Test
 public void testSelectPage() {    Page<User> page = new Page<>(1,5);
     Page<User> pageParam = userMapper.selectPage(page, null);    pageParam.getRecords().forEach(System.out::println);
     System.out.println(pageParam.getCurrent());
     System.out.println(pageParam.getPages());
     System.out.println(pageParam.getSize());
     System.out.println(pageParam.getTotal());
     System.out.println(pageParam.hasNext());
     System.out.println(pageParam.hasPrevious());
 }

返回指定列

Page<Map<String, Object>> page = new Page<>(1, 5);
     QueryWrapper<User> queryWrapper = new QueryWrapper<>();
     queryWrapper.select("name", "age");
     Page<Map<String, Object>> pageParam = userMapper.selectMapsPage(page, queryWrapper);    List<Map<String, Object>> records = pageParam.getRecords();
     records.forEach(System.out::println);
     System.out.println(pageParam.getCurrent());
     System.out.println(pageParam.getPages());
     System.out.println(pageParam.getSize());
     System.out.println(pageParam.getTotal());
     System.out.println(pageParam.hasNext());
     System.out.println(pageParam.hasPrevious());

7删除

逻辑删除

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

1 添加 deleted字段

2 添加deleted 字段,并加上 @TableLogic 注解 

@TableLogic
 private Integer deleted;

3配置(可选)application.properties 加入以下配置,此为默认值,如果你的默认值和mp默认的一样,该配置可无

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

根据id删除记录  

@Test
 public void testDeleteById(){    int result = userMapper.deleteById(5L);
     System.out.println(result);
 }

批量删除

@Test
 public void testDeleteBatchIds() {
    int result = userMapper.deleteBatchIds(Arrays.asList(8, 9, 10));
     System.out.println(result);
 }

简单条件删除

@Test
 public void testDeleteByMap() {    HashMap<String, Object> map = new HashMap<>();
     map.put("name", "Helen");
     map.put("age", 18);deleteByMap(map);
     System.out.println(result);
 }

8条件构造器

一、wapper介绍 

Mybatis-Plus必会知识点(精美最全)_mybatis

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

 

查询方式
说明
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”)

测试用例

1 ge、gt、le、lt、isNull、isNotNull

Test
 public void testDelete() {    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
     queryWrapper
         .isNull("name")
         .ge("age", 12)
         .isNotNull("email");
     int result = userMapper.delete(queryWrapper);
     System.out.println("delete return count = " + result); }

2eq、ne

注意:seletOne()返回的是一条实体记录,当出现多条时会报错

@Test
 public void testSelectOne() {    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
     queryWrapper.eq("name", "张旭");    User user = userMapper.selectOne(queryWrapper);//只能返回一条记录,多余一条则抛出异常
     System.out.println(user);
 }

3、between、notBetween

@Test
 public void testSelectCount() {    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
     queryWrapper.between("age", 20, 30);    Integer count = userMapper.selectCount(queryWrapper); //返回数据数量
     System.out.println(count);
 }

4、like、notLike、likeLeft、likeRight

selectMaps()返回Map集合列表,通常配合select()使用

@Test
 public void testSelectMaps() {    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
     queryWrapper
         .select("name", "age")
         .like("name", "e")
         .likeRight("email", "5");    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表
     maps.forEach(System.out::println);
 }

5、in、notIn、inSql、notinSql、exists、notExists

in、notIn:
• notIn("age",{1,2,3})--->age not in (1,2,3)
• notIn("age", 1, 2, 3)--->age not in (1,2,3)
inSql、notinSql:可以实现子查询
• 例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)

• 例: inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)

  @Test
     public void testSelectObjs() {        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
 //        queryWrapper.in("id", 1, 2, 3);
         queryWrapper.inSql("id", "select id from user where id <= 3");        List<Object> objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表
         objects.forEach(System.out::println);
     }

6、or、and

注意:这里使用的是 UpdateWrapper 

不调用or则默认为使用 and 连接

@Test
 public void testUpdate1() {    //修改值
     User user = new User();
     user.setAge(99);
     user.setName("Andy");    //修改条件
     UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
     userUpdateWrapper
         .like("name", "h")
         .or()
         .between("age", 20, 30);    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);
 }

7、lambda表达式

lambda表达式内的逻辑优先运算

@Test
 public void testUpdate2() {    //修改值
     User user = new User();
     user.setAge(99);
     user.setName("Andy");    //修改条件
     UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
     userUpdateWrapper
         .like("name", "n")
         .or(i -> i.like("name", "a").eq("age", 20));    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);
 }

8、orderBy、orderByDesc、orderByAsc

@Test
 public void testSelectListOrderBy() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
     queryWrapper.orderByDesc("age", "id");
    List<User> users = userMapper.selectList(queryWrapper);
     users.forEach(System.out::println);
 }

9、set、setSql

最终的sql会合并 user.setAge(),以及 userUpdateWrapper.set()  和 setSql() 中 的字段

@Test
 public void testUpdateSet() {    //修改值
     User user = new User();
     user.setAge(60);    //修改条件
     UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
     userUpdateWrapper
         .like("name", "h")
         .set("name", "Peter")//除了可以查询还可以使用set设置修改的字段
         .setSql(" email = '[email protected]'");//可以有子查询    int result = userMapper.update(user, userUpdateWrapper);
 }

标签:知识点,queryWrapper,System,println,Plus,Mybatis,new,public,out
From: https://blog.51cto.com/u_14689911/6463150

相关文章

  • CNCF Alibaba 云原生技术底层知识点以及核心概念
    1、入门:1.Kubernetes并不支持为应用固定IP,于是我自己通过编写网络插件把应用IP管理在了etcd里,然后上线。请问这破坏了云原生的理念了吗?AA.否B.是2.云原生技术与容器技术的关系是?BA.完全相同B.容器技术是云原生的基础技术之一C.没有关系3.容器启动后,我会时常SSH......
  • mybatis-config.xml配置文件有顺序限制
    Thecontentofelementtype"configuration"mustmatch"(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".......
  • SSM框架 使用逆向工程生成Bean、XxxMapper 和XxxMapper.xml【MyBatis Generator 】
    在properties配置文件中,数据库用户名的键不能设为username,你随便改个其他的应该都可以,例如jdbc.username,甚至拼错usernaem都可以jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8jdbc.u......
  • 教培行业的“智能GPT私教”?WorkPlusAI助理帮助教培机构实现十倍人效!
    从横空出世到掀起高潮,当下,AIGC(人工智能生成内容)模式下的ChatGPT它正以惊人的速度席卷各个领域,在线教培行业也不例外。那么,正式进入落地期的ChatGPT,在在线教培行业有那些应用前景呢?首先,我们再来了解一下ChatGPT。它作为一种基于深度学习的自然语言处理技术,能根据上下文理解用户输入......
  • 【React工作记录一百】前端小知识点扫盲笔记记录5
    前言我是歌谣放弃很容易但是坚持一定很酷微信公众号关注前端小歌谣带你进入前端巅峰交流群今天继续对前端知识的小结事件委托<!DOCTYPEhtml><htmllang="en"> <head> <metacharset="UTF-8"/> <metahttp-equiv="X-UA-Compatible"content="IE=edge"/&g......
  • mybatis-plus-generator-ui 可视化代码生成器!
    它提供交互式的WebUI用于生成兼容mybatis-plus框架的相关功能代码,包括Entity,Mapper,Mapper.xml,Service,Controller等。可以自定义模板以及各类输出参数,也可通过SQL查询语句直接生成代码。git地址:https://github.com/davidfantasy/mybatis-plus-generator-ui一、使用示例1......
  • 通用mapping实现的SSM项目:SSM 框架:是 Spring + Spring MVC + MyBatis
    1.结合通用mapping实现的SSM项目:SSM框架:是Spring+SpringMVC+MyBatis的缩写mybatisgenerator:配置插件通用mapper:tk.mybatis2.MyBatis逆向工程组件是MyBatisGenerator,简称MBG,是专为MyBatis框架制定代码自动生成解决方案,MBG可以根据数据表结构快速生成对应的实体类......
  • Linux知识点 – 随缘更新
    Linux基础篇1.桥接模式:虚拟系统可以和外部系统相互通讯,但是容易造成ip冲突,只能使用与物理机同一个网段2.nat模式:NAT模式与外界通话需要经过物理机(的NAT转换),不会多占一个局域网IP,可以与外部系统相互通讯,不会造成ip冲突,但是外部设备也无法访问虚拟设备3.主机模式:不和外部通讯4......
  • 【八股cover#2】CPP语法 Q&A与知识点
    CPP语法Q&A与知识点简历cover1、熟练使用C的指针应用及内存管理指针与引用的区别指针是一个存储地址的变量,可以有多级,可以为空,并且在初始化后可以改变指向;引用是原变量的别名,只有一级,不能为NULL,必须在定义时初始化,并且一旦初始化后就不能再改变。指针在作为参数传递时不会......
  • 【C】 Primer Plus 5th Edition 阅读笔记
      一.GettingReady 1.ANSIC(C89)andISOC(C90)areessentiallythesamestandard.2.#include<>, 预处理指令,include等同于在当前位置复制和粘贴代码。它的存在是为了方便的分享公共代码。3.stdio.h,The stdio.h file is supplied as part ......