【面试】系统兼容多个数据库改造

2024-05-31 12:38

本文主要是介绍【面试】系统兼容多个数据库改造,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系统改成同时兼容Oracle和Mysql和TDSQL,

SpringBoot+Mybatis 通过databaseIdProvider支持多数据库 - 青衫不改の小白 - 博客园

配置案例

jdbc:defaultDataSourceId: default # 默认数据源 defaultdataSources:- id: default # 数据源defaultpool:#driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver#url: jdbc:oracle:thin:@ip:port:orcldriverClassName: com.mysql.jdbc.Driver#        driverClassName: com.mysql.cj.jdbc.Driver#        url: jdbc:mysql://ip:port/alibaba_manage?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=falseurl: jdbc:mysql://ip:port/alibaba_manage?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=falseusername: rootpassword: 123456initialSize: 1minIdle: 1maxActive: 20maxWait: 60000configLocation: classpath:conf/mybatis.xmlmybatisPath: classpath*:mybatis/*.xml,classpath*:mapper/*.xml,classpath*:mybatis/mapping/**/*.xml,classpath*:mybatis/**/*.xml,classpath*:mapper/**/*.xml- id: tdsql # 数据源defaultpool:#driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver#url: jdbc:oracle:thin:@ip:port:orcldriverClassName: com.mysql.jdbc.Driver#        driverClassName: com.mysql.cj.jdbc.Driver#        url: jdbc:mysql://ip:port/alibaba_manage?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=falseurl: jdbc:mysql://ip:port/alibaba_acct?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=falseusername: rootpassword: 123456initialSize: 1minIdle: 1maxActive: 20maxWait: 60000configLocation: classpath:conf/mybatis.xmlmybatisPath: classpath*:mybatis/*.xml,classpath*:mapper/*.xml,classpath*:mybatis/mapping/**/*.xml,classpath*:mybatis/**/*.xml,classpath*:mapper/**/*.xml
@ConfigurationProperties(prefix = "jdbc")
public class SqlConfig {private String databaseIdProvider;public String getDatabaseIdProvider() {return databaseIdProvider;}public void setDatabaseIdProvider(String databaseIdProvider) {this.databaseIdProvider = databaseIdProvider;}
}

 在resources/META-INF下,spring.factories文件里,加上这个类的全类名(首行必须得是接口)。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.szkingdom.kuas.support.config.TdSqlConfig

该配置是利用了tomcat的SPI机制,实例化这个类,加入spring的bean管理中。效果等同于@Component

<environments default="developmentOracle"><environment id="development">...<environment id="developmentOracle">...

Mybatis 文档篇 2.8:Configuration 之 DatabaseIdProvider - 简书

    <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="false" databaseId="oracle">INSERT INTO user_info(USER_CODE,FIELD_CODE,FIELD_VALUE,UPDATE_TIME)<foreach item="userInfo" index="index" collection="userInfos" separator="UNION ALL">(SELECT#{userInfo.userCode},#{userInfo.fieldCode},#{userInfo.fieldValue},#{userInfo.updateTime}FROM DUAL)</foreach></insert><insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="false" databaseId="mysql">INSERT INTO user_info(USER_CODE,FIELD_CODE,FIELD_VALUE,UPDATE_TIME) VALUES<foreach item="userInfo" index="index" collection="userInfos" separator=",">(#{userInfo.userCode},#{userInfo.fieldCode},#{userInfo.fieldValue},#{userInfo.updateTime})</foreach></insert>
    <select id="getLastLogin" resultMap="LoginMap">selectLOGIN_SN, LOGIN_NAME, LOGIN_CLS, LOGIN_DESC, USER_TYPE, EXP_DAYS, INTERVAL_DAYS, LOGIN_SYN, VERSION, REMARKfrom LOGIN<where><if test="loginDo.loginSn != null">and LOGIN_SN = #{loginDo.loginSn}</if><if test="loginDo.version != null and loginDo.version != ''">and VERSION = #{loginDo.version}</if></where><if test="_databaseId == 'oracle'">AND rownum=1 ORDER BY VERSION DESC</if><if test="_databaseId == 'mysql'">ORDER BY VERSION DESC LIMIT 1</if><if test="_databaseId == 'pgsql'">ORDER BY VERSION DESC LIMIT 1</if></select>
    <select id="getNextVal" resultType="Long" databaseId="oracle">SELECT ${sequenceName}.NEXTVAL AS NEXTVALFROM DUAL</select><select id="getNextVal" resultType="Long" databaseId="mysql">select nextval('${sequenceName}')</select><select id="getNextVal" resultType="Long" databaseId="pgsql">select pgsql_nextval(${sequenceName})</select>

这篇关于【面试】系统兼容多个数据库改造的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1017953

相关文章

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

给数据库的表添加字段

周五有一个需求是这样的: 原来数据库有一个表B,现在需要添加一个字段C,我把代码中增删改查部分进行了修改, 比如insert中也添入了字段C。 但没有考虑到一个问题,数据库的兼容性。因为之前的版本已经投入使用了,再升级的话,需要进行兼容处理,当时脑子都蒙了,转不过来,后来同事解决了这个问题。 现在想想,思路就是,把数据库的表结构存入文件中,如xxx.sql 实时更新该文件: CREAT

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

SQL Server中,添加数据库到AlwaysOn高可用性组条件

1、将数据添加到AlwaysOn高可用性组,需要满足以下条件: 2、更多具体AlwaysOn设置,参考:https://msdn.microsoft.com/zh-cn/library/windows/apps/ff878487(v=sql.120).aspx 注:上述资源来自MSDN。

SQL Server中,用Restore DataBase把数据库还原到指定的路径

restore database 数据库名 from disk='备份文件路径' with move '数据库文件名' to '数据库文件放置路径', move '日志文件名' to '日志文件存放置路径' Go 如: restore database EaseWe from disk='H:\EaseWe.bak' with move 'Ease

C++面试八股文:std::deque用过吗?

100编程书屋_孔夫子旧书网 某日二师兄参加XXX科技公司的C++工程师开发岗位第26面: 面试官:deque用过吗? 二师兄:说实话,很少用,基本没用过。 面试官:为什么? 二师兄:因为使用它的场景很少,大部分需要性能、且需要自动扩容的时候使用vector,需要随机插入和删除的时候可以使用list。 面试官:那你知道STL中的stack是如何实现的吗? 二师兄:默认情况下,stack使