springboot+mybatis+mybatisplus 框架中增加自定义分页插件和sql 占位符修改插件-编程思维

一、Springboot简介

springboot 是当下最流行的web 框架,Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置,让这些框架集成在一起变得更加简单,简化了我们在集成过程中繁琐的模板化配置,springboot的核心特点如下:

1. 独立运行:SpringBoot开发的应用可以以JRA包的形式独立运行,运行一个SpringBoot应用只需通过 java –jar xxxx.jar 来运行;

2. 内嵌容器:SpringBoot内嵌了多个WEB容器,如:Tomcat、Jetty、Undertow,所以可以使用非WAR包形式进行项目部署;

3. 自动starter依赖:SpringBoot提供了一系列的starter来简化Maven的依赖加载。starter是一组方便的依赖关系描述符,它将常用的依赖分组并将其合并到一个依赖中,这样就可以一次性将相关依赖添加到Maven或Gradle中;

4. 自动配置:SpringBoot会根据在类路径中的JAR包和类,自动将类注入到SpringBoot的上下文中,极大地减少配置的使用;

5. 应用监控:SpringBoot提供基于http、ssh、telnet的监控方式,对运行时的项目提供生产级别的服务监控和健康检测;

6. 无代码生成/无需编写XML配置:SpringBoot不是借助于代码生成来实现的,而是通过条件注解来实现的,这是 Spring 4.x 提供的新特性。Spring4.x提倡使用Java配置和注解组合,无需编写任何xml配置即可实现Spring的所有配置功能;

二、Mybatis和Mybatisplus 简介

MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

MyBatis中文网站:https://mybatis.net.cn/

MyBatis blog:https://blog.mybatis.org/

MyBatis 官方网站:https://mybatis.org/mybatis-3/

MyBatis github:https://github.com/mybatis/mybatis-3

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而出现的框架,它对 Mybatis 的基础功能进行了增强,但未做任何改变。

MyBatis-Plus官网:https://baomidou.com/

MyBatis-Plus github:https://github.com/baomidou/mybatis-plus

三、Springboot+Mybatis+Mybatisplus 框架中增加自定义分页插件和sql 占位符修改插件

1、如何自定义分页插件

1)、在MyBatis-Plus 提供了com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect的接口抽象,如果需要自定义一个分页插件,需要先实现该接口,

public class MyDialect implements IDialect {

    @Override
    public MyDialect buildPaginationSql(String originalSql, long offset, long limit) {
        //示例
        limit = (offset >= 1) ? (offset + limit) : limit;
        String sql = "SELECT * FROM ( SELECT TMP.*, ROW_NUMBER() OVER (ORDER BY 0) ROW_ID FROM ( " +
                originalSql + " ) TMP LIMIT " + FIRST_MARK + ") WHERE ROW_ID > " + SECOND_MARK;
        return new MyDialect(sql, limit, offset).setConsumerChain();
    }
}

2)、实现由MyBatis-Plus 提供的com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor 接口

public class CustomerPaginationInnerInterceptor extends PaginationInnerInterceptor {


    @Override
    protected IDialect findIDialect(Executor executor) {
        return new MyDialect(); //这里也可以自己增加判断,根据不同的数据库类型,使用不同的IDialect 实现
    }
}

2、如何自定义sql 占位符修改插件

需要实现MyBatis-Plus 提供的com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor提供的接口,在mybatis-plus中,提供了innerinterceptor拦截器,可以方便地实现拼接查询条件。 innerinterceptor拦截器可以拦截所有的select语句,然后可以对拦截到的sql语句做修改。

public class MyReplacePlaceholderInnerInterceptor implements InnerInterceptor {

    public MyReplacePlaceholderInnerInterceptor() {

    }

    @Override
    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
        String sql = boundSql.getSql();
         //TODO 对SQL 语句做占位符的替换
            PluginUtils.mpBoundSql(boundSql).sql(sql);
    }
}

 3、定义自定义的mybatis的Configuration配置

@Configuration
public class MybatisPlusConfiguration implements InitializingBean {

    @Autowired
    private MybatisPlusInterceptor mybatisPlusInterceptor;

    @Override
    public void afterPropertiesSet() throws Exception {
        
        List<InnerInterceptor> targetInterceptors = new ArrayList<>();
        MyReplacePlaceholderInnerInterceptor  myPlaceholderInnerInterceptor = new MyReplacePlaceholderInnerInterceptor ();
        targetInterceptors.add(myPlaceholderInnerInterceptor);
        // 先执行MybatisCustomerInterceptor
        List<InnerInterceptor> interceptors = mybatisPlusInterceptor.getInterceptors();
        interceptors.forEach(innerInterceptor -> {
            if (innerInterceptor instanceof PaginationInnerInterceptor) {
                // 自定义分页插件
                CustomerPaginationInnerInterceptor customerPaginationInnerInterceptor = new CustomerPaginationInnerInterceptor();
                customerPaginationInnerInterceptor.setMaxLimit(1000L);
                targetInterceptors.add(customerPaginationInnerInterceptor);
            }
            else {
                targetInterceptors.add(innerInterceptor);
            }
        });
        mybatisPlusInterceptor.setInterceptors(targetInterceptors);
    }
}

 

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/laoqing/p/17792771.html

mybatis 批量插入-编程思维

1.情景展示 在实际开发过程中,我们有时候会遇到前端批量提交的数据。 诚然,如果我们使用for循环一次一次插入,也是可以的。 但这会涉及到对数据库频繁操作的问题,有没有更好的办法呢? 2.具体分析 我们可以通过mybatis的批量插入功能来解决这个问题。 只需要操作一次数据库,就能完成多条数据的插入操作。 3.解决方案

pagehelper用法示例(mybatis分页查询插件)-编程思维

1.情景展示 在实际开发过程中,分页查询是最常见,也是使用频率最高的数据查询。 分页查询,如果我们进行手动在xml当中写SQL的话,起码要写两个SQL。一个是分页,一个是查询数据总数。 问题在于:这样做,会提高我们的工作量,而且这些也是很繁琐的过程。 能不能让我们只关注查询业务(查询SQL),而不用管理分页,让这部分代

多数据源管理:掌握@ds注解的威力-编程思维

大家在日常后端开发过程,不可避免的会接触到需要用到配置多个数据源的场景,在这里,小编介绍一种简单方便的,只需要简单的配置和一个@DS注解就能实现动态数据源的方式,这种动态数据源底层原理是基于Mybatis-plus来实现的。 1、配置方式 首先是pom.xml <dependency> &l

mybatis-plus学习笔记-编程思维

官方介绍 mybatis-plus可以理解为加强版的mybatis,可以帮我们减少编写mapper中简单的sql语句,你可以理解为IPhone13 和 IPhone13 Plus 官网是这么说的:MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为

手把手教你如何扩展(破解)mybatisplus的sql生成-编程思维

mybatisplus 的常用CRUD方法 众所周知,mybatisplus提供了强大的代码生成能力,他默认生成的常用的CRUD方法(例如插入、更新、删除、查询等)的定义,能够帮助我们节省很多体力劳动。 他的BaseMapper中定义了这些常用的CRUD方法,我们在使用时,继承这个BaseMapper类就默认拥有了这些

mybatis plus-编程思维

错误案例 使用 query 函数查询,链式的结尾处使用 one 函数执行查询操作。 super.query().one(); 查看源码,最后一个 one 函数里面会执行一个 exectue 函数。使用 update 链式的结尾处没有类似 one 函数,但是提供了一个 exectue 函数,目前我不知道该传递什么正确的

手把手教你如何扩展(破解)mybatisplus的sql生成-编程思维

mybatisplus 的常用CRUD方法 众所周知,mybatisplus提供了强大的代码生成能力,他默认生成的常用的CRUD方法(例如插入、更新、删除、查询等)的定义,能够帮助我们节省很多体力劳动。 他的BaseMapper中定义了这些常用的CRUD方法,我们在使用时,继承这个BaseMapper类就默认拥有了这些