2025年Day01--mybatis-plus介绍

Day01--mybatis-plus介绍7 mybatis plus 简单查询 7 1 根据 id 查询记录 7 2 过多个 id 批量查询 7 3 简单的条件查询 8 mybatis plus 分页 9 mybatis plus 删除 9 1 物理删除 9 2 逻辑删除 第一步 表添加逻辑删除字段 对应实体类添加属性 属性添加注解 第二步 在项目的配置类中配置逻辑删除插件

大家好,我是讯享网,很高兴认识大家。
  • 7、mybatis-plus简单查询
    • 7.1、根据id查询记录
  • 7.2、过多个id批量查询
  • 7.3、简单的条件查询
  • 8、mybatis-plus分页
  • 9、mybatis-plus删除
    • 9.1、物理删除
  • 9.2、逻辑删除
    • 第一步:表添加逻辑删除字段,对应实体类添加属性,属性添加注解。
  • 第二步:在项目的配置类中配置逻辑删除插件
  • 第三步:application.properties 加入配置
  • 第四步:测试逻辑删除
  • 10、mybatis-plus性能分析
    • 10.1、配置插件
  • 10.2、测试
  • 11、mybatis-plus实现复杂条件查询

1、当使用mybatis-plus依赖时导入的坐标:baomidou


com.baomidou

mybatis-plus-boot-starter

3.0.5

2、@MapperScan


作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类

添加位置:是在Springboot启动类上面添加

3、要想在控制台看到sql输出日志,需要在application.properties配置文件中添加以下代码


#mybatis日志

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

4、主键生成策略


  • auto-increment
  • uuid:每次随机生成唯一值,排序不方便
  • redis
  • mybatis-plus (使用了snowplake算法)

常见的主键生成策略介绍:https://www.cnblogs.com/haoxinyue/p/5208136.html

mybatis-plus默认只用自己自带的主键生成策略,但可以自己设置要使用的主键生成策略,使用如下注解@TableId
  • @TableId(type = IdType.ID_WORKER)

mybatis-plus自带的策略,生成19位值,当属性类型类数字类型时使用该策略,比如long

  • @TableId(type = IdType.ID_WORKER_STR)

mybatis-plus自带的策略,生成19位值,当属性类型类字符串类型时使用该策略,比如String

在这里插入图片描述
讯享网

  • @TableId(type = IdType.UUID)

随机生成唯一值

  • @TableId(type = IdType.AUTO)

数据库ID自增

  • @TableId(type = IdType.INPUT)

用户输入ID, 该类型可以通过自己注册自动填充插件进行填充

  • @TableId(type = IdType.NONE)

没有策略

在需要设置主键的实体类属性上使用该注解,可以设置主键策略,主要有以下几种策略。

在这里插入图片描述

5、mbatis-plus自动填充


第一步:在实体类里需要自动填充的属性上面添加注解

如在下面User实体类的createTime和updateTime属性上添加注解

在这里插入图片描述

第二步:创建类,实现MetaObjectHandler接口,实现接口里的方法

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

import org.apache.ibatis.reflection.MetaObject;

import java.util.Date;

/

  • @Description :
  • @Author :lenovo
  • @Date :2021/2/20 21:34

*/

@Component

public class MyMetaObjectHandler implements MetaObjectHandler {

//用mybatis-plus实现添加操作,在这个方法内执行

@Override

public void insertFill(MetaObject metaObject) {

this.setFieldValByName(“createTime”,new Date(),metaObject);

this.setFieldValByName(“updateTime”,new Date(),metaObject);

}

//用mybatis-plus实现修改操作,在这个方法内执行

@Override

public void updateFill(MetaObject metaObject) {

this.setFieldValByName(“updateTime”,new Date(),metaObject);

}

}

6、丢失更新


多个人同时需改一条记录,最后提交的会把之前提交的数据覆盖更新。

在这里插入图片描述

6.1、丢失更新解决方案:

6.1.1 、悲观锁(表级锁):串行操作。

举例1:如上图修改数据,Lucy修改money数据时,别人都不能进行操作,只有lucy操作完成后,其他人才能操作。

举例2:又比如当一个人上网浏览新闻时,别人不能浏览,只有当这个人浏览完成后,别人才能浏览,如果这个人浏览一百年,其他所有人就要等一百年,这就是悲观锁。

6.1.2、 乐观锁

使用版本号进行并发的控制。比如多个人修改数据时,只有一个人才能修改成功,其他人不能同时修改。

在这里插入图片描述乐观锁的实现原理:

在这里插入图片描述乐观锁的具体实现:

mybatis-plus实现乐观锁官方步骤:https://mp.baomidou.com/guide/interceptor-optimistic-locker.html#optimisticlockerinnerinterceptor

  • 1、表中添加字段,作为乐观锁版本号。

在这里插入图片描述

  • 2、对应实体类添加版本号属性。

在这里插入图片描述

@version注解所在的包:

在这里插入图片描述

  • 3、插件配置

spring工程:在spring.xml配置文件中

spring-boot项目:新建一个存放配置类的包,在该包下新建个配置类:编写乐观锁插件

package com.nonglin.mpdemo.config;

import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

@MapperScan(“com.nonglin.mpdemo”)

public class Mpconfig {

//乐观锁插件

@Bean

public OptimisticLockerInterceptor optimisticLockerInterceptor() {

return new OptimisticLockerInterceptor();

}

}

  • 4、在测试类中测试乐观锁:

//测试乐观锁

@Test

public void testOptimisticLocker(){

User user = userMapper.selectById(L);

user.setAge(1);

int row = userMapper.updateById(user);

System.out.println(“修改”+row+“条数据”);

}

7、mybatis-plus简单查询


7.1、根据id查询记录

//根据id查询

@Test

public void findById(){

User user = userMapper.selectById(1L);

System.out.println(user);

}

控制台输出:

在这里插入图片描述

DBC Connection [HikariProxyConnection@ wrapping com.mysql.cj.jdbc.ConnectionImpl@28fd3dc1] will not be managed by Spring

==> Preparing: SELECT id,name,age,email,create_time,update_time,version FROM user WHERE id=?

==> Parameters: 1(Long)

<== Columns: id, name, age, email, create_time, update_time, version

<== Row: 1, Jone, 18, , null, null, null

<== Total: 1

Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@35342d2f]

User(id=1, name=Jone, age=18, email=, createTime=null, updateTime=null, version=null)

7.2、过多个id批量查询

//多个id批量查询

@Test

public void findByBatchIds(){

List users = userMapper.selectBatchIds(Arrays.asList(1L,2L,3L));

for(User user:users){

System.out.println(user);

}

}

控制台输出:

在这里插入图片描述

JDBC Connection [HikariProxyConnection@ wrapping com.mysql.cj.jdbc.ConnectionImpl@34fe326d] will not be managed by Spring

==> Preparing: SELECT id,name,age,email,create_time,update_time,version FROM user WHERE id IN ( ? , ? , ? )

==> Parameters: 1(Long), 2(Long), 3(Long)

<== Columns: id, name, age, email, create_time, update_time, version

<== Row: 1, Jone, 18, , null, null, null

<== Row: 2, Jack, 120, , null, null, null

<== Row: 3, Tom, 28, , null, null, null

<== Total: 3

打印输出:

Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@65eabaab]

User(id=1, name=Jone, age=18, email=, createTime=null, updateTime=null, version=null)

User(id=2, name=Jack, age=120, email=, createTime=null, updateTime=null, version=null)

User(id=3, name=Tom, age=28, email=, createTime=null, updateTime=null, version=null)

7.3、简单的条件查询

//简单条件查询

@Test

public void estSelectByMap(){

HashMap<String,Object> map = new HashMap<>();

map.put(“name”,“Lucy”);

map.put(“age”,18);

List users = userMapper.selectByMap(map);

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

}

控制台输出:

在这里插入图片描述

JDBC Connection [HikariProxyConnection@ wrapping com.mysql.cj.jdbc.ConnectionImpl@c4] will not be managed by Spring

==> Preparing: SELECT id,name,age,email,create_time,update_time,version FROM user WHERE name = ? AND age = ?

==> Parameters: Lucy(String), 18(Integer)

<== Columns: id, name, age, email, create_time, update_time, version

<== Row: , Lucy, 18, , null, null, null

<== Total: 1

Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2b917fb0]

User(id=, name=Lucy, age=18, email=, createTime=null, updateTime=null, version=null)

8、mybatis-plus分页


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

(1)创建配置类

在配置类中添加插件

//分页插件

@Bean

public PaginationInterceptor paginationInterceptor() {

return new PaginationInterceptor();

}

(2)测试selectPage分页

测试:最终通过page对象获取相关数据

//测试分页插件

@Test

public void testPage(){

//创建page参数

//传入两个参数 当前页和每页显示的记录数

Page page = new Page<>(1,4);

//调用mybatis-plus分页查询的方法

//调用mybatis-plus分页查询过程中底层进行了封装,把分页所有数据封装到page中

userMapper.selectPage(page,null);

//通过page对象获取分页数据

System.out.println(“当前页”+page.getCurrent());//当前页

System.out.println(“每页数据list集合”+page.getRecords());//每页数据list集合

System.out.println(“每页显示记录数”+page.getSize());//每页显示记录数

System.out.println(“总记录数”+page.getTotal());//总记录数

System.out.println(“总页数”+page.getPages());//总页数

System.out.println(“是否有上一页”+page.hasPrevious());//是否有上一页

System.out.println(“是否有下一页”+page.hasNext());//是否有下一页

}

控制台输出:

在这里插入图片描述

SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@71f96dfb] was not registered for synchronization because synchronization is not active

JDBC Connection [HikariProxyConnection@ wrapping com.mysql.cj.jdbc.ConnectionImpl@4b7c4456] will not be managed by Spring

JsqlParserCountOptimize sql=SELECT id,name,age,email,create_time,update_time,version FROM user

==> Preparing: SELECT COUNT(1) FROM user

==> Parameters:

<== Columns: COUNT(1)

<== Row: 11

==> Preparing: SELECT id,name,age,email,create_time,update_time,version FROM user LIMIT 0,4

==> Parameters:

<== Columns: id, name, age, email, create_time, update_time, version

<== Row: 1, Jone, 18, , null, null, null

<== Row: 2, Jack, 120, , null, null, null

<== Row: 3, Tom, 28, , null, null, null

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
dou.com, null, null, null

<== Row: 3, Tom, 28, , null, null, null

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-ZVneBhpX-47)]

[外链图片转存中…(img-sjveQ5HK-48)]

[外链图片转存中…(img-Kp7V4Gtk-48)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

小讯
上一篇 2025-03-04 22:44
下一篇 2025-02-06 10:04

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/50619.html