我的编程空间,编程开发者的网络收藏夹
学习永远不晚

系统mysql、sqlserver数据库兼容方案

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

系统mysql、sqlserver数据库兼容方案

一、技术选型

springboot2.4+、mybatisplus3.4+、mysql5.7+、redis3.0+

二、编写目的

如果产品开发默认数据库采用mysql,但是当客户提出数据库需要采用Sqlserver或者Oracle以及其他国产数据库时,程序中就不能出现方言性的sql语句,否则程序在个性化的sql上做不到数据库兼容,因此要想产品能兼容多种数据类型,则在编码时就要考虑将个性化的方言sql抽离出来。

三、数据库兼容方案

实现思路:
(1)应用启动时要根据数据源知道当前链接的数据库类型,并存到全局变量
(2)根据数据库类型自动设置mybatis-plus分页方言
(3)个性化方言实现不要在主业务中耦合(如:if mysql … else if sqlserver…)
(4)个性化方言实现可以多种数据库类型复用(如mysql、mariadb可以用一种实现)
(5)个性化方言实现类能根据数据库类型自动注入
代码实现:
根据url获取数据库类型

import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;public class Dialect {    private static DbType dbType = null;    private static final String DB_URL = "spring.datasource.url";        public synchronized static DbType getDbType(){        if(dbType == null){            String url = PropUtil.getValue(DB_URL);            dbType = JdbcUtils.getDbType(url);        }        return dbType;    }}

自定义注解(实现方言实现的选择注入)

import com.baomidou.mybatisplus.annotation.DbType;import org.springframework.context.annotation.Conditional;import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)@Target({ ElementType.TYPE, ElementType.METHOD })@Documented@Conditional(DbTypeCondition.class)public @interface ConditionalOnDbType {        DbType[] types() default DbType.OTHER;}

注解条件实现

import com.baomidou.mybatisplus.annotation.DbType;import org.springframework.context.annotation.Condition;import org.springframework.context.annotation.ConditionContext;import org.springframework.core.type.AnnotatedTypeMetadata;public class DbTypeCondition implements Condition {    @Override    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {        DbType[] dbTypes = (DbType[]) metadata.getAnnotationAttributes(ConditionalOnDbType.class.getName()).get("types");        for(DbType dbType : dbTypes){            if(Dialect.getDbType().equals(dbType)){                return true;            }        }        return false;    }}

1、mybatisplus配置

分页方言配置

@Configurationpublic class MybatisPlusConfig {    @Bean    public MybatisPlusInterceptor mybatisPlusInterceptor() {        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();        //添加分页插件        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(Dialect.getDbType()));        return interceptor;    }}

2、数据库YAML配置

数据源配置上注意驱动和URL的替换。

mysql配置

spring:  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://ip:3306/db?serverTimezone=Asia/Shanghai&useUnicode=true    username: username    password: password    hikari:      ## 最小空闲连接数      minimum-idle: 5      ## 最大连接数      maximum-pool-size: 20      ## 自动提交      auto-commit: true      ## 连接池名称      pool-name: TmcHikariCP      ## 超时时间(ms)      connection-timeout: 30000

sqlserver配置

spring:  datasource:    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver    url: jdbc:sqlserver://ip:1433;databasename=db_schema;trustServerCertificate=true;integratedSecurity=false;    username: username    password: password    hikari:      ## 最小空闲连接数      minimum-idle: 5      ## 最大连接数      maximum-pool-size: 20      ## 自动提交      auto-commit: true      ## 连接池名称      pool-name: TmcHikariCP      ## 超时时间(ms)      connection-timeout: 30000 

3、应用举例

方言抽离接口

public interface DialectService<T> {        void conditon(QueryWrapper<T> queryWrapper, Map<String, Clazz> attrMap,Object k,Object v);}

Mysql方言实现

import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;import java.util.Map;@Slf4j@Service@ConditionalOnDbType(types = {DbType.MYSQL,DbType.MARIADB})public class MysqlFormDataDialectServiceImpl implements FormDataDialectService<FormDataEntity> {    @Override    public void conditon(QueryWrapper<FormDataEntity> queryWrapper, Map<String, Clazz> attrMap, Object k, Object v) {        try {            //替换时间类型判断(时间查询为时间段)            Clazz.Format format = attrMap.get(k).getFormat();            if(Clazz.Format.DateTime.equals(format) || Clazz.Format.Date.equals(format)){                String[] dateArray = ObjectMapperHelper.mapper().readValue(v.toString(), String[].class);                queryWrapper.ge("attr_json->'$." + k + "'", dateArray[0]);                queryWrapper.lt("attr_json->'$." + k + "'", dateArray[1]);            }else {                queryWrapper.eq("attr_json->'$." + k + "'", v);            }        }catch (Exception e){            log.error("form data query k:{},v:{} error:{}",k,v,e.getMessage());        }    }}

Sqlserver方言实现

import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;import java.util.Map;@Slf4j@Service@ConditionalOnDbType(types = {DbType.SQL_SERVER2005,DbType.SQL_SERVER})public class SqlServerFormDataDialectServiceImpl implements FormDataDialectService<FormDataEntity> {    @Override    public void conditon(QueryWrapper<FormDataEntity> queryWrapper, Map<String, Clazz> attrMap, Object k, Object v) {        try {            //替换时间类型判断(时间查询为时间段)            Clazz.Format format = attrMap.get(k).getFormat();            if(Clazz.Format.DateTime.equals(format) || Clazz.Format.Date.equals(format)){                String[] dateArray = ObjectMapperHelper.mapper().readValue(v.toString(), String[].class);                queryWrapper.ge("JSON_VALUE(attr_json, '$." + k + "')", dateArray[0]);                queryWrapper.lt("JSON_VALUE(attr_json, '$." + k + "')", dateArray[1]);            }else {                queryWrapper.eq("JSON_VALUE(attr_json, '$." + k + "')", v);            }        }catch (Exception e){            log.error("form data query k:{},v:{} error:{}",k,v,e.getMessage());        }    }}

4、数据库脚本转换

最后注意数据库脚本从mysql到sqlserver的转换,可以用微软的工具Microsoft SQL Server Migration Assistant for MySQL
可参照官网实现。
下载链接:https://www.microsoft.com/en-us/download/details.aspx?id=54257&6B49FDFB-8E5B-4B07-BC31-15695C5A2143=1

来源地址:https://blog.csdn.net/little_pig_lxl/article/details/130485475

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

系统mysql、sqlserver数据库兼容方案

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

标准MySQL数据库外的5个开源兼容方案

MySQL是最受欢迎的免费开源应用之一,它是成千上万个网站的数据库骨干。然而,许多开发人员认为有必要将其拆分成其他项目,并且每个分支项目都要有自己的专长,这些需求以及Oracle对核心产品增长缓慢的担忧,导致出现了许多开发人员感兴趣的子项目
2022-05-21

MySQL INSERT锁与数据库版本兼容性

MySQL的INSERT操作并不会直接使用INSERT锁,而是使用一种称为Next-Key Lock的锁机制来保证数据的一致性。Next-Key Lock会同时锁定索引记录和实际数据,防止其他事务在同一时间段内对同一行数据进行修改。关于数
MySQL INSERT锁与数据库版本兼容性
2024-08-20

一个微服务系统如何实现兼容oracle数据库

一.背景很多时候我们的系统往往使用的是MySql数据库,却突然遇上要使用oracle数据库了,这时候就要考虑给系统做兼容多种数据库了。二.步骤1.在配置文件或者配置中心对应的服务配置文件里配置对应的数据源,配置哪个数据库,你的系统就使用哪个数据库datasou
一个微服务系统如何实现兼容oracle数据库
2018-04-16

SQLserver 数据库导入MySQL的方法

文章目录 1、准备好要使用的文件和工具1.1、目标数据库---Mysql。1.2、源数据库---SQLserver1.3、工具:SQLyog (需要旗舰版/企业版/终极版),这里给大家推荐我使用的下载链接:https://pan.b
SQLserver 数据库导入MySQL的方法
2023-12-23

Mybatis-Plus入门系列(20) -兼容多种数据库

有道无术,术尚可求,有术无道,止于术。 文章目录 前言方案分析1. 分页2. XML自定义SQL 案例演示1. 配置2. 简单分页查询3. 带方言的分页查询 参考 前言 在我们实际开发软件产品过程中,数据库
2023-08-23

阿里云Win系统PHP兼容性分析与解决方案

阿里云Win系统PHP兼容性分析与解决方案随着云计算的快速发展,越来越多的用户选择将自己的网站、应用程序等部署在云服务器上,而阿里云作为国内领先的云计算服务提供商之一,备受用户青睐。在阿里云上搭建网站或应用程序时,经常会遇到一些兼容性问题
阿里云Win系统PHP兼容性分析与解决方案
2024-03-06

MySQL INSERT锁与数据库版本升级的兼容性

在MySQL中,INSERT锁是一种特殊的锁,用于在插入数据时保证数据的唯一性和完整性。INSERT锁会在插入数据时对相关的表进行锁定,防止其他事务同时插入相同的数据,从而保证数据的一致性。关于数据库版本升级的兼容性,一般来说,MySQL
MySQL INSERT锁与数据库版本升级的兼容性
2024-08-14

MySQL ORM框架的数据库版本兼容性测试

MySQL ORM框架(如Hibernate,MyBatis等)通常提供了与不同版本的MySQL数据库进行交互的能力。然而,在进行数据库版本兼容性测试时,仍然需要注意一些关键方面,以确保应用程序在不同版本的MySQL数据库上都能正常运行。
MySQL ORM框架的数据库版本兼容性测试
2024-10-05

MySQL触发器与数据库复制环境的兼容性

MySQL触发器与数据库复制环境的兼容性是一个需要细致考虑的问题。在深入探讨之前,我们先对MySQL触发器及其在数据库复制环境中的潜在影响有一个基本的了解。MySQL触发器概述MySQL触发器是一种自动化机制,它允许在数据库中定义特定事
MySQL触发器与数据库复制环境的兼容性
2024-09-26

jdbc连接主流数据库方式(oracle、mysql、sqlserver)

jdbc连接主流数据库方式JDBC全称:java database connectivity ,是sun公司提供的Java连接数据库的标准规范。1、oracle Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一
jdbc连接主流数据库方式(oracle、mysql、sqlserver)
2017-10-22

【数据库】MySQL习题及答案(教务管理系统_MySQL_5.7)

✨声明不保证习题答案完全正确,仅供参考MySQL:5.7推荐软件:Navicat Premium学习SQL语句需要勤于练习!✨各表字段说明courseCId课程序号,主键PCId先修课DId开课系编号,外键CName课程名称CCredIT学分CHour学时CA
【数据库】MySQL习题及答案(教务管理系统_MySQL_5.7)
2020-01-04

Mac 系统配置 MySql 数据库

1. 安装 MySql 数据库 1.1 双击打开安装包 mysql-8.0.19-macos10.15-x86_64.dmg: 1.2 双击 mysql-8.0.19-macos10.15-x86_64.pkg 运行安装包,并点击 继续
2023-08-18

编程热搜

目录