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的接口,此处不再详细说明。