SpringMVC+Mybatis一套代码支持多个版本数据库

SpringMVC+Mybatis一套代码支持多个版本数据库

项目原本是在Oracle上开发,后来要支持mysql,为减少工作量,在原代码基础上进行改造,添加mysql分支代码,达到既不影响原Oracle的功能,同时又支持mysql的目的。
主要改造在sql上,由于使用了mybatis框架,大部分sql是在mybatis的mapper.xml中,少量代码在Java类中。所以改造考虑三个方面:

  • Mybatis的mapper.xml改造
  • Java代码sql部分改造
  • 功能复杂的接口,针对mysql单独实现一个接口

一 、Mybatis的mapper.xml改造
Oracle与mysql的区别在于语法和函数的不同,所以在功能简单的地方,尽量用通用的sql来实现。在不通的地方可以按照下面的方法实现:
1、在properties文件中定义全局变量system_dbType,然后在mybatis-config.xml中引入改properties配置文件。

<properties resource="application.properties">
    <property name="system_dbType" value="${system_dbType}"/>
</properties>

2、在*Mapper.xml中先绑定全局变量system_dbType,然后根据不同的取值写不同的分支。假设Oracle:system_dbType=0,mysql:system_dbType=1。以查询字符串转日期为例:

<select id="getDate" >
    <bind name="temp_dbType" value="${system_dbType}"/>
    <if test="temp_dbType == 0">
        select to_date('2017-03-28,13:25:59','yyyy-mm-dd,hh24:mi:ss') from dual
    </if>
    <if test="temp_dbType == 1">
        select date_format(now(), '%Y-%m-%d') from dual
    </if>
</select>

注:部分Oracle中的函数,可以在mysql中通过自定义相同名称的函数实现相同的功能,这样就可以减少代码的修改量。

二 、Java代码中sql改造
可能有少量sql在Java代码中拼写的情况,此时可以定义全局静态变量,例如在类JDBCUtil中定义DB_TYPE,从properties中读取system_dbType的值:

/**
 * 数据库类型:Oracle=0   MySQL=1
 */
public static final String DB_TYPE =  PropertiesUtil.getProperties("system_dbType");

在有sql的类中就可以引用该变量写不同的分支。

if("0".equals(JDBCUtil.DB_TYPE)){
    //oracle逻辑

}else if("1".equals(JDBCUtil.DB_TYPE)){
    //mysql逻辑

}

二 、接口改造
对于部分特别复杂的功能,实现类中有大量的sql语句拼接,改造起来比较麻烦是,可以针对这部分功能单独实现一个mysql的接口,此处不再详细说明。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值