一个微服务系统如何实现兼容oracle数据库[亲测有效]

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

一个微服务系统如何实现兼容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

直接上直观点(狗头)
一个微服务系统如何实现兼容oracle数据库[亲测有效]

找了很久原因,发现,使用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的依赖

<dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc7</artifactId>
            <version>12.1.0.2.0</version>
        </dependency>

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

4.修改你的SQL

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

    <select id="get" resultType="java.util.Map" parameterType="java.util.Map" databaseId="oracle">
        SELECT TYPE,NAME,DESC,STATE , MODIFY_DATE FROM INSPECT_TYPE
        WHERE 1=1
        <if test="params.type != null and params.type != "" ">
            AND TYPE LIKE "${params.type}%"
        </if>
        <if test="params.name != null and params.name != """>
            AND NAME LIKE "${params.name}%"
        </if>
        <if test="params.desc != null and params.desc != """>
            AND DESC LIKE "${params.desc}%"
        </if>
        <if test="params.state != null and params.state != """>
            AND STATE = "${params.state}"
        </if>
    </select>

    <select id="get" resultType="java.util.Map" parameterType="java.util.Map" databaseId="ms-sql">
        SELECT TYPE,NAME,DESC,STATE , MODIFY_DATE FROM INSPECT_TYPE
        WHERE 1=1
        <if test="params.type != null and params.type != "" ">
            AND TYPE LIKE "${params.type}%"
        </if>
        <if test="params.name != null and params.name != """>
            AND NAME LIKE "${params.name}%"
        </if>
        <if test="params.desc != null and params.desc != """>
            AND DESC LIKE "${params.desc}%"
        </if>
        <if test="params.state != null and params.state != """>
            AND STATE = "${params.state}"
        </if>
    </select>

发现这两个映射有什么不同吗,那就是databaseId不同,当你的配置文件配置ms-sql的并且数据源是MySql的数据源的时候,它就使用MySql数据库;当databaseId=”oracle”并且数据源配置的是oracle的数据源的时候,就是使用oracle数据库。

这些过程忽略某一步了,那就是搬迁数据库,这里不做延伸了。

三.兼容带来的问题

1.表名、字段名长度的问题

由于每个人开发的规范都不一样,有些人建表建字段的时候长度太长,会导致做兼容数据库的一些问题,很麻烦。
MySql中字段名最大允许64个字节,oracle不能超过32个字符(一个英文字符等于一个字节)。所以可以通俗地讲,oracle不能超过30长度,MySql无限制。

2.索引的问题

oracle中的索引不能重复,而mysql可以。
如果重复,报错:

ORA-00955: name is already used by an existing object

比如:表STUDENT中有两个索引grade_index和name_index,它两的字段一模一样(两个索引的字段都是grade),oracle不通过。
解决办法:删除grade_index这个索引。
表CONTRY中,index_tid和tid,两个索引的字段一模一样,oracle不通过。
解决办法:删除tid这个索引。

3.SQL的问题

insert语句,对于mysql,values后面可以不写全所有字段,插入时mysql会自动插入默认值;但是oracle不行,会报:

ORA-00947: not enough values

4.oracle表的别名不能加as,列的别名可以加as

  select a.name from appinfo a;-- 正确
  select a.name from appinfo as a;-- 错误

5.其他问题

实际的开发过程遇到的问题很多,这里不一一总结了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6061.html

(0)
上一篇 2023-04-18
下一篇 2023-04-18

相关推荐

  • 回调函数的定义及使用方式

    回调函数的定义及使用方式回调函数是一种通过参数将函数传递给另一个函数的技术,该另一个函数则在适当的时候调用该函数。回调函数通常用于处理异步操作,如处理文件读取、网络请求等,以及处理事件驱动的程序。

    2024-04-16
    70
  • python制作模块与包(python 模块包)

    python制作模块与包(python 模块包)Python模块的安装方法:

    2023-11-20
    136
  • Oracle学习笔记二十二:存储过程「终于解决」

    Oracle学习笔记二十二:存储过程「终于解决」一、存储过程简介 • 存储过程(Stored Procedure)是一组为了完成特定功能的PL/SQL语句块,经编译后存储在数据库中。 • 存储过程经编译和SQL优化后存储在数据库服务器中,使用时只要

    2023-05-21
    156
  • Python中reshape函数的用法

    Python中reshape函数的用法在数据处理过程中,数据的形状往往会影响到其后续处理和结果分析的效率和准确性。这时我们就需要使用reshape函数来改变数据的形状,使其符合我们的需要。Python中的numpy库中提供了强大且灵活的reshape函数,可以对多种形式的数据进行变形。本文将介绍Python中numpy库中的reshape函数,帮助读者了解该函数的使用方法和原理。

    2024-09-13
    25
  • Oracle 11g与12c的审计详解「建议收藏」

    Oracle 11g与12c的审计详解「建议收藏」最近遇到一些脚本诱发的审计相关BUG,感觉有必要重新梳理一下11g与12c的审计模式,于是根据官网修正了一下以前的一篇笔记这里发出来。 一、审计功能的开启: audit_trail参数的值可以设置为以

    2022-12-19
    153
  • 徐童:视频人物社交关系图生成与应用「终于解决」

    徐童:视频人物社交关系图生成与应用「终于解决」导读: 在线社交媒体平台的发展,带来了细粒度检索、视频语义摘要等媒体智能服务的巨大需求。现有的视频理解技术缺乏深入的语义线索,结合视频中人物的社交关系才能更完整、准确地理解剧情,从而提升用户体验,支撑

    2023-05-18
    151
  • 如何在Linux上运行Python文件

    如何在Linux上运行Python文件Python是一种常用的编程语言,尤其在数据科学、人工智能等领域中应用广泛。对于Linux操作系统的用户而言,运行Python文件也是常见的操作之一。下面将从多个方面对如何在Linux上运行Python文件进行详细阐述。

    2024-05-16
    61
  • windows下用navicat远程链接虚拟机Linux下MySQL数据库[通俗易懂]

    windows下用navicat远程链接虚拟机Linux下MySQL数据库[通俗易懂]
    今天想用navicat远程连接虚拟机中的MySQL数据库,一直连不上,在网上搜索了一下,发现原因是MySQL对远程用户登陆的授权问题。这里说一下我的解决方法…

    2023-04-05
    169

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注