【YashanDB数据库】Mybatis-plus分页框架识别不到Yashandb

简介: Mybatis-plus分页框架识别不到Yashandb

问题描述
Mybatis-plus 无法识别Yashandb数据库,应用有如下报错。

问题分析
从Mybatis-plus源码里面看到,getDBtype函数是没有Yashandb的方言。

当Yashandb使用mybatis-plus分页时候,会抛出异常即other database not supported。

package com.baomidou.mybatisplus.extension.toolkit;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;

public class JdbcUtils {
private static final Log logger = LogFactory.getLog(JdbcUtils.class);
private static final Map JDBC_DB_TYPE_CACHE = new ConcurrentHashMap();

public JdbcUtils() {
}

public static DbType getDbType(Executor executor) {
    try {
        Connection conn = executor.getTransaction().getConnection();
        return (DbType)JDBC_DB_TYPE_CACHE.computeIfAbsent(conn.getMetaData().getURL(), JdbcUtils::getDbType);
    } catch (SQLException var2) {
        throw ExceptionUtils.mpe(var2);
    }
}

public static DbType getDbType(String jdbcUrl) {
    Assert.isFalse(StringUtils.isBlank(jdbcUrl), "Error: The jdbcUrl is Null, Cannot read database type", new Object[0]);
    String url = jdbcUrl.toLowerCase();
    if (!url.contains(":mysql:") && !url.contains(":cobar:")) {
        if (url.contains(":mariadb:")) {
            return DbType.MARIADB;
        } else if (url.contains(":oracle:")) {
            return DbType.ORACLE;
        } else if (!url.contains(":sqlserver:") && !url.contains(":microsoft:")) {
            if (url.contains(":sqlserver2012:")) {
                return DbType.SQL_SERVER;
            } else if (url.contains(":postgresql:")) {
                return DbType.POSTGRE_SQL;
            } else if (url.contains(":hsqldb:")) {
                return DbType.HSQL;
            } else if (url.contains(":db2:")) {
                return DbType.DB2;
            } else if (url.contains(":sqlite:")) {
                return DbType.SQLITE;
            } else if (url.contains(":h2:")) {
                return DbType.H2;
            } else if (regexFind(":dm\\d*:", url)) {
                return DbType.DM;
            } else if (url.contains(":xugu:")) {
                return DbType.XU_GU;
            } else if (regexFind(":kingbase\\d*:", url)) {
                return DbType.KINGBASE_ES;
            } else if (url.contains(":phoenix:")) {
                return DbType.PHOENIX;
            } else if (url.contains(":zenith:")) {
                return DbType.GAUSS;
            } else if (url.contains(":gbase:")) {
                return DbType.GBASE;
            } else if (!url.contains(":gbasedbt-sqli:") && !url.contains(":informix-sqli:")) {
                if (url.contains(":clickhouse:")) {
                    return DbType.CLICK_HOUSE;
                } else if (url.contains(":oscar:")) {
                    return DbType.OSCAR;
                } else if (url.contains(":sybase:")) {
                    return DbType.SYBASE;
                } else if (url.contains(":oceanbase:")) {
                    return DbType.OCEAN_BASE;
                } else if (url.contains(":highgo:")) {
                    return DbType.HIGH_GO;
                } else if (url.contains(":cubrid:")) {
                    return DbType.CUBRID;
                } else if (url.contains(":goldilocks:")) {
                    return DbType.GOLDILOCKS;
                } else if (url.contains(":csiidb:")) {
                    return DbType.CSIIDB;
                } else if (url.contains(":sap:")) {
                    return DbType.SAP_HANA;
                } else if (url.contains(":impala:")) {
                    return DbType.IMPALA;
                } else if (url.contains(":vertica:")) {
                    return DbType.VERTICA;
                } else if (url.contains(":xcloud:")) {
                    return DbType.XCloud;
                } else if (url.contains(":firebirdsql:")) {
                    return DbType.FIREBIRD;
                } else {
                    logger.warn("The jdbcUrl is " + jdbcUrl + ", Mybatis Plus Cannot Read Database type or The Database's Not Supported!");
                    return DbType.OTHER;
                }
            } else {
                return DbType.GBASE_8S;
            }
        } else {
            return DbType.SQL_SERVER2005;
        }
    } else {
        return DbType.MYSQL;
    }
}

public static boolean regexFind(String regex, CharSequence input) {
    return null == input ? false : Pattern.compile(regex).matcher(input).find();
}

}
解决办法
办法1:

添加java配置类,业务系统指定ORM框架需要使用Oracle(MySQL)方言

package com.sics.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.ORACLE));
return interceptor;
}

相关文章
|
2月前
|
SQL Java 数据库连接
MyBatis分页
MyBatis作为Java持久层框架,需结合数据库特性或插件实现分页。分页分为物理分页(如MySQL的LIMIT)和逻辑分页(内存截取),推荐使用PageHelper插件自动注入分页语句,提升开发效率与性能。需注意索引优化、深分页问题及多表关联时的兼容性,结合业务场景选择合适方案。
113 4
SQL XML Java
58 0
|
2月前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
140 12
|
3月前
|
SQL XML Java
MyBatis框架如何处理字符串相等的判断条件。
总的来说,MyBatis框架提供了灵活而强大的机制来处理SQL语句中的字符串相等判断条件。无论是简单的等值判断,还是复杂的条件逻辑,MyBatis都能通过其标签和属性来实现,使得动态SQL的编写既安全又高效。
229 0
|
4月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
388 0
|
6月前
|
人工智能 数据挖掘 API
基于neo4j数据库和dify大模型框架的rag模型搭建——后续补充
基于neo4j数据库和dify大模型框架的rag模型搭建——后续补充
666 21
基于neo4j数据库和dify大模型框架的rag模型搭建——后续补充
|
6月前
|
Java 数据库 Docker
基于neo4j数据库和dify大模型框架的rag模型搭建
基于neo4j数据库和dify大模型框架的rag模型搭建
1555 35
|
6月前
|
SQL Java 数据安全/隐私保护
发现问题:Mybatis-plus的分页总数为0,分页功能失效,以及多租户插件的使用。
总的来说,使用 Mybatis-plus 确实可以极大地方便我们的开发,但也需要我们理解其工作原理,掌握如何合适地使用各种插件。分页插件和多租户插件是其中典型,它们的运用可以让我们的代码更为简洁、高效,理解和掌握好它们的用法对我们的开发过程有着极其重要的意义。
615 15
|
7月前
|
存储 SQL 安全
风险防不胜防?看 YashanDB 如何守护你的数据库安全(下篇)
本文深入探讨数据库安全机制中的威胁监测与数据保护。在威胁监测方面,YashanDB 提供权限、行为和角色审计功能,支持异步审计降低性能影响,并通过安全漏洞扫描和硬件防护减少漏洞危害。数据保护部分涵盖通信加密(支持国密标准)、存储加密(表空间透明加密TDE)、备份加密及密钥管理等关键技术。此外,YashanDB 支持热备、增量备份和按时间点恢复,并实现安全销毁防止信息泄露,全面保障数据的机密性、完整性和可用性。
|
7月前
|
存储 安全 数据库
风险防不胜防?看 YashanDB 如何守护你的数据库安全(上篇)
数据库作为信息系统核心,其安全性至关重要。本文聚焦数据库安全机制中的访问管理,涵盖身份认证、访问控制与反入侵措施。YashanDB通过口令认证、操作系统认证及双因素认证确保用户身份安全;实施基于角色(RBAC)和标签(LBAC)的访问控制,实现权限精细化管理;同时利用黑白名单与连接监听机制防范未授权访问和恶意攻击。这些措施共同保障数据的机密性、完整性和可用性,助力企业满足国家合规要求。下期将探讨威胁检测与数据保护内容,敬请期待!