解决Mybatis-plus高版本不向后兼容的问题

mybatis-plus插件后面的版本没有兼容低版本。即:不存在低版本中EntityWrapper这个类了。而该类采用数据库表真实字段名作查询条件,这样硬编码形式确实不友好,比如如果后面数据库表中字段更名那么所有涉及到的业务都需要去修改,且硬编码形式没有遵循orm映射框架的设计理念。所以mybatis-plus后面的版本已经不支持该类操作了。

但是这样造成一个问题。我们的一个项目开发设计时架构设计者采用了低版本的插件,但是项目进行一半时想要引入新版插件不兼容。要去一个个修改实在太麻烦,网上又没有这方面的文章。所以只能自己摸索出一个解决方案。

解决的第一步大家可以参考这篇文章:https://www.cnblogs.com/java-jun-world2099/articles/11114501.html

本以为就可以大功告成了,但是低高版本的插件内部设计重合度比较高(我并么有一步步去看原理),新的问题一个接一个。最后只能自己重写了BaseMapper和EntityWrapper这两个类。直接看代码好了:

application.yml

server:
  port: 8088

spring:
  datasource:
    url: jdbc:mysql://xx.xx.xx.xxx:3306/ces?useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath*:/mapper/*.xml

pom文件

解决Mybatis-plus高版本不向后兼容的问题解决Mybatis-plus高版本不向后兼容的问题
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.1.6.RELEASEversion>
        <relativePath/>
    parent>
    <groupId>com.bootjargroupId>
    <artifactId>shadebootartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>shadebootname>
    <description>Demo project for Spring Bootdescription>
<span>&lt;</span><span>properties</span><span>&gt;</span>
    <span>&lt;</span><span>java.version</span><span>&gt;</span>1.8<span><span>java.version</span><span>&gt;</span>
<span><span>properties</span><span>&gt;</span>

<span>&lt;</span><span>dependencies</span><span>&gt;</span>

    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>shadejar<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>plusjar<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>1.0<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>com.baomidou<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>mybatis-plus-core<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>3.1.1<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>com.baomidou<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>mybatisplus-spring-boot-starter<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>1.0.5<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>com.baomidou<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>mybatis-plus<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>2.2.0<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.boot<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-boot-starter<span><span>artifactId</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.boot<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-boot-starter-test<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>scope</span><span>&gt;</span>test<span><span>scope</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.boot<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-boot-starter-web<span><span>artifactId</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.mybatis.spring.boot<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>mybatis-spring-boot-starter<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>2.0.1<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>com.alibaba<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>druid<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>1.1.6<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.projectlombok<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>lombok<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>optional</span><span>&gt;</span>true<span><span>optional</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>mysql<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>mysql-connector-java<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>scope</span><span>&gt;</span>runtime<span><span>scope</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>com.fasterxml.jackson.core<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>jackson-annotations<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>2.9.7<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

<span><span>dependencies</span><span>&gt;</span>

<span>&lt;</span><span>build</span><span>&gt;</span>
    <span>&lt;</span><span>plugins</span><span>&gt;</span>
        <span>&lt;</span><span>plugin</span><span>&gt;</span>
            <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.boot<span><span>groupId</span><span>&gt;</span>
            <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-boot-maven-plugin<span><span>artifactId</span><span>&gt;</span>
        <span><span>plugin</span><span>&gt;</span>
    <span><span>plugins</span><span>&gt;</span>
<span><span>build</span><span>&gt;</span>

project>

View Code

实体类User

@TableName("user")
@Data
public class User {
    @TableId
    private Long id;
    private String userName;
    private Integer age;
    private String email;
    private Date birth;

}

UserMapper接口

package com.bootjar.shadeboot.mapper;

import com.bootjar.shadeboot.entity.BaseMapper;
import com.bootjar.shadeboot.entity.User;
import org.apache.ibatis.annotations.Mapper;

/**
 * @author:shf date:2019/7/1 10:40
 */
@Mapper
public interface UserMapper extends BaseMapper {
}

EntityWrapper

解决Mybatis-plus高版本不向后兼容的问题解决Mybatis-plus高版本不向后兼容的问题
package com.bootjar.shadeboot.entity;

import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
import com.baomidou.mybatisplus.core.conditions.segments.NormalSegmentList;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;

import java.util.Objects;

/**
 * @author:shf date:2019/7/1 14:13
 */
public class EntityWrapper extends com.baomidou.mybatisplus.mapper.EntityWrapper {
    public T entity;

    public MergeSegments expression;

    public String lastSql = "";

    @Override
    public T getEntity() {
        return this.entity;
    }

    @Override
    public String getSqlSelect() {
        return null;
    }

    public String getSqlSet() {
        return null;
    }

    public MergeSegments getExpression() {
        return this.expression;
    }

    public String getCustomSqlSegment() {
        MergeSegments expression = this.getExpression();
        if (Objects.nonNull(expression)) {
            NormalSegmentList normal = expression.getNormal();
            String sqlSegment = this.getSqlSegment();
            if (StringUtils.isNotEmpty(sqlSegment)) {
                if (normal.isEmpty()) {
                    return sqlSegment;
                }

                return this.concatWhere(sqlSegment);
            }
        }

        return "";
    }

    @Override
    public String getSqlSegment() {
        String sqlSegment = "";
        String sqlWhere = "";
        if (this.expression != null) {
            sqlSegment = this.expression.getSqlSegment();
        } else if (this.sql != null) {
            sqlWhere = this.sql.toString();
        }

        if (StringUtils.isNotEmpty(sqlSegment)) {
            return sqlSegment + this.lastSql;
        } else if (com.baomidou.mybatisplus.toolkit.StringUtils.isNotEmpty(sqlWhere)) {
           // return this.isWhere != null ? (this.isWhere ? sqlWhere : sqlWhere.replaceFirst("WHERE", this.AND_OR)) : sqlWhere.replaceFirst("WHERE", this.AND_OR);
            return sqlWhere;
        } else {
            return StringUtils.isNotEmpty(this.lastSql) ? this.lastSql : null;
        }
    }

    private String concatWhere(String sql) {
        return "WHERE " + sql;
    }

    @Override
    public boolean isEmptyOfWhere() {
        return this.isEmptyOfNormal() && this.isEmptyOfEntity();
    }

    public boolean nonEmptyOfWhere() {
        return !this.isEmptyOfWhere();
    }

    public boolean isEmptyOfNormal() {
        if(this.getExpression() != null){
            return CollectionUtils.isEmpty(this.getExpression().getNormal());
        }
       return true;
    }

    public boolean nonEmptyOfNormal() {
        return !this.isEmptyOfNormal();
    }

    public boolean nonEmptyOfEntity() {
        T entity = this.getEntity();
        if (entity == null) {
            return false;
        } else {
            TableInfo tableInfo = TableInfoHelper.getTableInfo(entity.getClass());
            if (tableInfo == null) {
                return false;
            } else if (tableInfo.getFieldList().stream().anyMatch((e) -> {
                return this.fieldStrategyMatch(entity, e);
            })) {
                return true;
            } else {
                return StringUtils.isNotEmpty(tableInfo.getKeyProperty()) ? Objects.nonNull(ReflectionKit.getMethodValue(entity, tableInfo.getKeyProperty())) : false;
            }
        }
    }

    private boolean fieldStrategyMatch(T entity, TableFieldInfo e) {
        switch (e.getFieldStrategy()) {
            case NOT_NULL:
                return Objects.nonNull(ReflectionKit.getMethodValue(entity, e.getProperty()));
            case IGNORED:
                return true;
            case NOT_EMPTY:
                return StringUtils.checkValNotNull(ReflectionKit.getMethodValue(entity, e.getProperty()));
            default:
                return Objects.nonNull(ReflectionKit.getMethodValue(entity, e.getProperty()));
        }
    }

    public boolean isEmptyOfEntity() {
        return !this.nonEmptyOfEntity();
    }

}

View Code

BaseMapper

解决Mybatis-plus高版本不向后兼容的问题解决Mybatis-plus高版本不向后兼容的问题
package com.bootjar.shadeboot.entity;

import com.baomidou.mybatisplus.mapper.Wrapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author:shf date:2019/7/1 13:17
 */
public interface BaseMapper extends com.baomidou.mybatisplus.core.mapper.BaseMapper {
    int insert(T var1);

    Integer insertAllColumn(T var1);

    int deleteById(Serializable var1);

    int deleteByMap(@Param("cm") Map var1);

    Integer delete(@Param("ew") Wrapper var1);

    int deleteBatchIds(@Param("coll") Collectionextends Serializable> var1);

    int updateById(@Param("et") T var1);

    Integer updateAllColumnById(@Param("et") T var1);

    Integer update(@Param("et") T var1, @Param("ew") Wrapper var2);

    T selectById(Serializable var1);

    List selectBatchIds(@Param("coll") Collectionextends Serializable> var1);

    List selectByMap(@Param("cm") Map var1);

    T selectOne(@Param("ew") T var1);

    Integer selectCount(@Param("ew") Wrapper var1);

    List selectList(@Param("ew") Wrapper var1);

    List> selectMaps(@Param("ew") Wrapper var1);

    List selectObjs(@Param("ew") Wrapper var1);

    List selectPage(RowBounds var1, @Param("ew") Wrapper var2);

    List> selectMapsPage(RowBounds var1, @Param("ew") Wrapper var2);

}

View Code

测试类ShadebootApplicationTests

解决Mybatis-plus高版本不向后兼容的问题解决Mybatis-plus高版本不向后兼容的问题
package com.bootjar.shadeboot;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bootjar.shadeboot.entity.EntityWrapper;
import com.bootjar.shadeboot.entity.User;
import com.bootjar.shadeboot.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ShadebootApplicationTests {

    @Autowired
    private UserMapper userMapper;

    //@Autowired
    //private UserCopyMapper userCopyMapper;

    @Test
    public void contextLoads() {
        User user = userMapper.selectById("1");
        System.out.println("--------------------user:" + user);
        EntityWrapper itemWrapper = new EntityWrapper<>();

        itemWrapper.where("user_name = {0}", "Jack").eq("age", "20");
        List itemsEntities = userMapper.selectList(itemWrapper);
        System.out.println("----------------itemsEntities :" + itemsEntities);

        LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper()
                .eq(User::getUserName, "Jack").last("ORDER BY id DESC");
        List userList = userMapper.selectList(queryWrapper);
        System.out.println("----------------userList:" + userList);
    }

    @Test
    public void insertTest() {
        User user = new User();
        user.setUserName("dada");
        userMapper.insert(user);
    }

    @Test
    public void MapTest() {
        Map map = new HashMap();
        map.put("user_name", "1q");
        map.put("age", 18);
        List MapList = userMapper.selectByMap(map);
        System.out.println("--------------------------MapList:" + MapList);
    }

}

View Code

以上测试方法均通过,这是contextLoads方法的测试结果:

解决Mybatis-plus高版本不向后兼容的问题解决Mybatis-plus高版本不向后兼容的问题

`
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7718a40f] will not be managed by Spring
==> Preparing: SELECT id,user_name,age,email,birth FROM user WHERE id=?

==> Parameters: 1(String)
Columns: id, user_name, age, email, birth

Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@397ef2]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4d95a72e] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7718a40f] will not be managed by Spring
==> Preparing: SELECT id,user_name,age,email,birth FROM user WHERE user_name = ? AND ( age LIKE ? ) ORDER BY id DESC
==> Parameters: Jack(String), %24%(String)
Columns: id, user_name, age, email, birth

Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4d95a72e]

Original: https://www.cnblogs.com/better-farther-world2099/p/11114729.html
Author: 奕锋博客
Title: 解决Mybatis-plus高版本不向后兼容的问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571750/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • PgSQL-||-连字符

    (PgSQL)连字符 || — 22.22& select 22.22||’%’ as 值; Original: https://www.cnblogs.com/a999…

    Java 2023年6月9日
    086
  • Java 顺序查找 二分查找

    查找 在 Java 中我们常用的查找有两种: 顺序查找 即:有一个数组/数列 {“a”, “b”, “c”, “d”} 我们从键盘中输入任意一个 与数组类型相同的值,然后循环遍历这…

    Java 2023年6月5日
    0197
  • java死锁(Java-level deadlock)

    java-level deadlock 如下代码可以模拟java死锁。注意:当出现死锁时,应用程序是无响应的。错误信息: Found one Java-level deadlock…

    Java 2023年6月15日
    061
  • JDK9-JDK14 相关新特性说明及使用

    一、Java9 发布于 2017 年 9 月 21 日 。作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化其中最重要的改动是 Java 平台模块…

    Java 2023年5月30日
    068
  • [学习笔记] 日期和时间

    日期(Date)和时间(Time)是计算机可以处理的重要数据; 日期代表日历中的某一天,由年/月/日组成,被看作是离散的数据; 时间代表某个时间点,由时/分/秒组成; 本地时间 我…

    Java 2023年6月5日
    073
  • 手把手带你使用Paint in 3D和Photon撸一个在线涂鸦画板

    Paint in 3D Paint in 3D用于在游戏内和编辑器里绘制所有物体。所有功能已经过深度优化,在WebGL、移动端、VR 以及更多平台用起来都非常好用! 它支持标准管线…

    Java 2023年6月7日
    080
  • 分布式锁

    分布式锁 本文整理自黑马程序员相关资料 问题的引入 在平时单服务的情况下,我们使用互斥锁可以保证同一时刻只有一个线程执行自己的业务。原理是,在JVM内部维护了一个锁监视器,锁监视器…

    Java 2023年6月8日
    063
  • mybatis各阶段的详解

    1 本阶段的需要注意的几个点 配置的顺序,不配则不用管,配则必须按顺序来!!!!properties?,settings?,typeAliases?,typeHandlers?,o…

    Java 2023年6月8日
    0114
  • 面试记录

    JVM线程属于用户态还是内核态 当进程运行在ring3级别时为用户态,ring0级别时为内核态 有些操作需要有内核权限才能进行,那么有三种由用户态切换到内核态的情况: 系统调用:操…

    Java 2023年6月8日
    077
  • Spring之@Value注解

    @Value 注解可以用来将外部的值动态注入到 Bean 中,在 @Value 注解中,可以使用 ${} 或 #{}。${} 与 #{} 的区别如下: (1)@Value(&#82…

    Java 2023年5月30日
    058
  • spring boot 自定义线程池与使用

    一、进行线程池创建 二、创建bean操作对象 提供根据beanName获取,手动注入bean等方法,适用于不被spring管理的类中(thread、callback) 三、创建异步…

    Java 2023年6月16日
    062
  • 【微服务】Nacos初体验

    SpringCloud – Nacos初体验 😄生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德德🌝…

    Java 2023年6月16日
    088
  • 230_RabbitMQ-高级-分布式事务

    简述 分布式事务的方式 两阶段提交(2PC)需要数据库厂商的支持,java组件有atomikos等。 + 存在的问题 补偿事务(TCC) 严选,阿里,蚂蚁金服。 本地消息表(异步确…

    Java 2023年6月7日
    065
  • 我的JAVA面试题备忘录

    以下是我收集的一些问题,有的是网上摘录的,有的是自己参加面试被问到的,有的是工作或学习时遇到的,等等。 为什么要记录这些呢? 一方面,我相信,这样做对我自己的技术提升是有帮助的。在…

    Java 2023年6月14日
    079
  • JWT详解与基本使用(保姆教程)

    前言: 最近准备写一篇关于security前后端分离场景下的认证与授权文章,里面使用到了jwt,所以就写了一篇jwt的文章,作为开头小菜😋 概述 讲jwt之前,先讲一下什么是tok…

    Java 2023年6月15日
    078
  • 软件工程-就几个方面谈谈做项目和做产品的区别

    从严谨的角度触发,应该基本按照同样的标准实现项目和产品。 很可惜,在实际工作中,这基本上是不太可能的,除非项目比较大,客户要求比较严格。 本文主要谈以下几点: 1、需求差异 2、实…

    Java 2023年6月9日
    098
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球