【MyBatis-Plus 进阶学习笔记】

这篇具有很好参考价值的文章主要介绍了【MyBatis-Plus 进阶学习笔记】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、 MyBatis Plus 七大功能

0. 数据准备

数据库表:
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL COMMENT '主键 ',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `manager_id` bigint(20) DEFAULT NULL COMMENT '直属上级id',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  `version` int(11) DEFAULT '1' COMMENT '版本',
  `deleted` int(1) DEFAULT '0' COMMENT '逻辑删除标识(0未删除,1已删除)',
  PRIMARY KEY (`id`),
  KEY `manager_fk` (`manager_id`),
  CONSTRAINT `manager_fk` FOREIGN KEY (`manager_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
实体类:

@Data
@Accessors(chain = true)
@TableName("user")
public class User extends Model<User> implements Serializable {

    private static final long serialVersionUID = 1L;
    /**
     * 主键ID
     */
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;

    /**
     * 姓名
     */
    @TableField("name")
    private String name;

    /**
     * 年龄
     */
    @TableField("age")
    private Integer age;

    /**
     * 邮箱
     */
    @TableField("email")
    private String email;

    @TableField("manager_id")
    private Long  manageId;

    /**
     * 出生时间
     */
    @TableField("create_time")
    private LocalDateTime createTime;
    @TableField("update_time")
    private LocalDateTime updateTime;

    /**
     * 是否置顶
     */
    @TableField("version")
    private Integer version;

    /**
     * 字段排除
     */
    @TableLogic
    @TableField("deleted")
    private Integer deleted;
}
xml配置:
server:
  port: 8088
spring:
  # 配置数据源信息
  datasource:
    # 配置连接数据库信息
    #本地地址:“127.0.0.1”
    #数据库名称:“db2”
    url: jdbc:mysql://127.0.0.1:3306/db2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
    #数据库账户
    username: root
    #数据库密码
    password: root
mybatis-plus:
  global-config:
    db-config:
    #逻辑删除字段
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

1. 逻辑删除

逻辑删除语句:
 int i = userMapper.deleteById(2);
        System.out.println(i);
真实执行语句:
==>  Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
==> Parameters: 2(Integer)
<==    Updates: 1
实际未删除,只修改删除字段的值
这时候如果执行查询语句,则只会展示逻辑删除为0的字段记录:
 List<User> list = userMapper.selectList(null);
        list.forEach(System.out::println);
虽然库中有三条记录但是有两条删除字段为1,则list中只展示一条
    @TableField(value = "deleted",select = false)
    private Integer deleted;
    select=false; 查询语句将不出现deleted字段

2. 自动填充

自动填充 创建和 更新时间
  @TableField(value = "create_time",fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(value = "update_time",fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        System.out.println("==============insertFill");
        setFieldValByName("createTime", LocalDateTime.now(),metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
        System.out.println("==============updateFill");
    }
}

2.1 优化1 自动填充 有的类没有更新和创建时间字段


@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        boolean hasSetter = metaObject.hasSetter("createTime");
        if (hasSetter){
            System.out.println("==============insertFill");
            setFieldValByName("createTime", LocalDateTime.now(),metaObject);
        }

    }

    @Override
    public void updateFill(MetaObject metaObject) {
        boolean hasSetter = metaObject.hasSetter("updateTime");
        if (hasSetter){
            setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
            System.out.println("==============updateFill");
        }

    }
}

2.2 优化2 自己设置时间时填充自己设置的,不设置时自动填充


@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        Object createTime = getFieldValByName("createTime", metaObject);
        if (ObjectUtils.isNull(createTime)){
            boolean hasSetter = metaObject.hasSetter("createTime");
            if (hasSetter){
                System.out.println("==============insertFill");
                setFieldValByName("createTime", LocalDateTime.now(),metaObject);
            }
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        Object updateTime = getFieldValByName("updateTime", metaObject);
        if (ObjectUtils.isNull(updateTime)){
            boolean hasSetter = metaObject.hasSetter("updateTime");
            if (hasSetter){
                setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
                System.out.println("==============updateFill");
            }
        }


    }
}

3. 乐观锁插件 注:wrapper不能服用

乐观锁和悲观锁是在并发编程中用来处理资源竞争和保证数据一致性的两种不同策略。它们各自适用于不同的使用场景:
乐观锁:
乐观锁的核心思想是假设并发访问的操作不会发生冲突,因此在读取资源时不会进行加锁,而是在更新资源时进行冲突检测。如果发现有其他线程已经对资源进行修改,则放弃当前操作或尝试重新执行。
使用场景:
并发写入操作较少的情况下,冲突发生的概率较低。
数据库表中的数据很少被修改,在持续时间较短的事务中进行读取操作。
适合处理乐观并发控制机制,如版本号或时间戳等。
悲观锁:
悲观锁的核心思想是假设并发访问的操作会发生冲突,因此在访问资源之前会进行加锁操作,确保在整个操作期间资源不被其他线程修改。
使用场景:
并发写入操作较多的情况下,冲突发生的概率较高。
数据库表中的数据经常被修改,在持续时间较长的事务中进行读取操作。
适合使用数据库的行级锁、表级锁或者分布式锁等来实现。
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //添加:分页插件
        //参数:new PaginationInnerInterceptor(DbType.MYSQL),是专门为mysql定制实现的内部的分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        //添加:乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}
实体类字段:
    @TableField("version")
    @Version
    private Integer version;
    测试:
        int version=2;
        User user = new User();
        user.setId(1683667832465985538L);
        user.setEmail("lwx@qq.com");
        user.setName("lwx");
        user.setVersion(version);
        int update = userMapper.updateById(user);
        System.out.println(update);

4. 性能分析插件

4.1 PerformanceInterceptor 3.2.0版本被废除

 @Bean
    @Profile({"dev","test"}) // 指定环境
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor interceptor = new PerformanceInterceptor();
        // sql美化打印
        interceptor.setFormat(true);
        // 设置SQL超时时间
        interceptor.setMaxTime(500);
        //格式化语句
        performanceInterceptor.setFormat(true);
        return interceptor;
    }

4.2 p6spy 使用

<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.8.7</version>
</dependency>

#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
server:
  port: 8088
spring:
  # 配置数据源信息
  datasource:
    # 配置连接数据库信息
    #本地地址:“127.0.0.1”
    #数据库名称:“db2”
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:mysql://localhost:3306/db2?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    #数据库账户
    username: root
    #数据库密码
    password: root
mybatis-plus:
  global-config:
    db-config:
      #逻辑删除字段
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

【MyBatis-Plus 进阶学习笔记】,mybatis,学习,笔记文章来源地址https://www.toymoban.com/news/detail-617114.html

5. 多租户SQL解析器

6. 动态表名SQL解析器

7. SQL注入器

到了这里,关于【MyBatis-Plus 进阶学习笔记】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis-Plus 超详细笔记|配置使用|多种查询|常用注解

    Mybatis-Plus可以节省大量时间,所有的CRUD代码都可以自动化完成。 MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。其在 MyBatis 的基础上提供了很多方便的 CRUD 操作、分页查询、逻辑删除、自动填充等功能。 在Maven项目中,

    2024年02月05日
    浏览(46)
  • Mybatis-Plus学习2 IService+ServiceImpl

    service层写法,继承ISerice,泛型为实体类对象 impl层写法,继承ServiceImpl,实现service,泛型为Mapper对象+实体类对象 Mybatis-Plus默认使用的主键算法是雪花算法,通过TableId的type属性可以更改算法策略 如果主动设置了主键,则使用自己设置的主键 @TableLogic表示逻辑删除字段,删除

    2024年02月12日
    浏览(36)
  • 【Mybatis-Plus】Mybatis-Plus快速入门

    Mybatis-Plus是基于Mybatis的数据库操作组件,其实现的功能完全是Mybatis的功能拓展,不改变Mybatis的使用方式,可以兼容Mybatis的操作方式。 创建一个数据库、一个表进行基础操作: 创建一个Spring项目,项目通过Spring Initlizer创建,不导入任何依赖包,在POM.xml文件中进行依赖导入

    2024年02月07日
    浏览(46)
  • Mybatis-Plus通用枚举功能 [MyBatis-Plus系列] - 第493篇

    历史文章( 文章 累计490+) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《

    2024年02月08日
    浏览(39)
  • Mybatis-Plus(三)--Mybatis-Plus配置和条件构造器

    在MP中有大量的配置,其中有一部分是Mybatis原生的配置,另一部分是MP的配置,详情:https://mybatis.plus/config 【1】configLocation--自己单独的MyBatis配置的路径 SpringMVC的xml中写法: 【2】mapperLocations--MyBatis Mapper所对应的XML文件位置 如果你在Mapper中有自定义方法(XML中有自定义实现

    2024年02月15日
    浏览(62)
  • Mybatis 框架 ( 三 ) Mybatis-Plus

    官网 : https://www.baomidou.com/ MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上封装了大量常规操作,减少了SQL的编写量。 使用时通常通过Springboot框架整合使用 并且使用Lombok框架简化实体类 重点注意 : 与 SpringBoot整合时, 在启动类增加注解 @MapperScan(\\\"mapper接口路径 \\\") 或者

    2024年02月01日
    浏览(38)
  • mybatis升级到mybatis-plus

    mybatis升级到mybatis-plus,两个共存 之前依赖只有mybatis,没有plus 做法: 修改之后的依赖 更换 完整配置代码 1.添加plus的插件 注入 3.完整代码 就是上面升级plus 的代码. 参考文章:https://www.likecs.com/show-308411339.html

    2024年02月11日
    浏览(44)
  • 若依mybatis升级为mybatis-plus

    一、添加mybatis-plus依赖、删除mybatis依赖,我用的是ruoyi 3.8.5,主pom里面已经没有了mybatis的依赖,如果有的话注释一下 这里添加mybatisplus依赖 注意:一定要做mybatis依赖的移除,否则pagehelper还是依赖mybatis会与plus冲突,报错。 ruoyi-common下的pom.xml添加依赖 解释一下为什么要在这里

    2024年02月12日
    浏览(44)
  • mybatis-plus-join mybatis-plus必备神器

    mybatis-plus-join是mybatis plus的一个多表插件,上手简单,十分钟不到就能学会全部使用方式,只要会用mp就会用这个插件,仅仅依赖了lombok,而且是扩展mp的构造器并非更改原本的构造器,不会对原有项目产生一点点影响,相信大多数项目都有这俩插件,四舍五入就是没依赖。

    2023年04月08日
    浏览(38)
  • mybatis-plus分页total为0,分页失效,mybatis-plus多租户插件使用

    背景:项目使用mybatis分页插件不生效,以及多租户使用时读取配置异常 多租户插件使用遇到的问题: 最开始在MyTenantLineHandler中使用 @Value(\\\"${tables}\\\"),服务启动时能从配置中心拉取到配置,但在运行时获取到的值为空,试了很多方法都不生效,后面将配置中心的配置在调用My

    2024年02月06日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包