文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2018-04-16 03:57

关注

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

一.背景

很多时候我们的系统往往使用的是MySql数据库,却突然遇上要使用oracle数据库了,这时候就要考虑给系统做兼容多种数据库了。

二.步骤

1.在配置文件或者配置中心对应的服务配置文件里配置对应的数据源,配置哪个数据库,你的系统就使用哪个数据库

datasource:
    druid:
      url: jdbc:oracle:thin:@//你数据库的ip地址:端口号/orcl
      username: (拾万个为什么)你的账号
      password: (拾万个为什么)你的密码
      driver-class-name: oracle.jdbc.driver.OracleDriver
      max-active: 20
      initial-size: 1
      max-wait: 60000
      min-idle: 1
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: select "x" FROM DUAL
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-open-prepared-statements: 20
      filters: stat, wall

这里由于是做兼容oracle的,所以在这里配置oracle的数据源

2.继续在配置文件或者配置中心里配置mybatis-plus的database-id

我的项目使用的是mybatis-plus,使用mybatis也一样,需要在这里配置你的database-id。

# mybatis 配置
mybatis-plus:
  mapper-locations: classpath:mapper/*Mapper.xml
  typeAliasesPackage: com.shiWanGeWeiShenMe.provider.entity(你模块实体类的包)
  configuration:
    database-id: oracle
    map-underscore-to-camel-case: true
    jdbc-type-for-null: "null"
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

这里说下我在做这个的过程中遇到的问题,也就是为什么要在这里配置jdbc-type-for-null:
我在做swagger测试的时候,插入空值会提示如下错误

nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property="stationBo", mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId="null", jdbcTypeName="null", expression="null"}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 无效的列类型: 1111

直接上直观点(狗头)

找了很久原因,发现,使用mybatis在插入oracle数据库的数据为空的时候,在Configuration类中初始化jdbcTypeForNull默认值是Other,这样就会报错

public void setJdbcTypeForNull(JdbcType jdbcTypeForNull) {
        this.jdbcTypeForNull = jdbcTypeForNull;
    }

jdbc-type-for-null的作用是,当mybatis插入空值的时候,需要指定jdbcType,这个也很容易理解的吧,假如你不指定这个空值类型,那插入的空值到底是null还是0呢?
所以,jdbc-type-for-null的作用就是指定你插入的空值是什么类型的。
解决办法就是在配置文件、配置中心里配置这个值为null,在插入的数据为空的时候就让空值为null.

3.在你项目的pom.xml里引入oracle的依赖


            com.oracle
            ojdbc7
            12.1.0.2.0
        

值得注意的是,有些依赖包会和jdk的版本不对应,这个依赖包可以适应jdk8

4.修改你的SQL

修改你的mapper.xml的语句,很简单,就是在每个sql映射里加上databaseId="oracle",前面让配置这个东西就是这个原因。
比如:

    
        SELECT TYPE,NAME,DESC,STATE , MODIFY_DATE FROM INSPECT_TYPE
        WHERE 1=1
        
            AND TYPE LIKE "${params.type}%"
        
        
            AND NAME LIKE "${params.name}%"
        
        
            AND DESC LIKE "${params.desc}%"
        
        
            AND STATE = "${params.state}"