Springboot兼容达梦数据库、sqlserver


目录

摘要

开发springboot项目过程中,有时需要同时兼容不同的数据库。如果使用jpa、hibernate框架,几乎不需要大的改动,切换驱动、方言等即可实现。
如果使用mybatis,由于各家数据库语言上存在差异,可能就需要针对不同数据库,编写不同的脚本。本文主要介绍同时兼容sqlserver和国产数据库达梦的技术实现,
如果能掌握这两种,触类旁通,mysql等其他数据库的兼容亦可以实现。

安装达梦数据库

1).下载安装达梦数据库,下载地址https://eco.dameng.com/download/
达梦数据库设计思想及与方法都与oracle极度相似,故很多sql都可以参考oracle。其详细的安装、操作可参考官方文档
2).安装完成后,新建模式test,用户选择SYSDBA

POM修改

在数据库安装目录下,找到驱动及方言对应的jar包(我的是在D:\dmdbms\drivers\jdbc),在项目src目录下下新建lib文件夹,将jar包复制到该文件夹,添加pom依赖。

 <dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <scope>runtime</scope>
</dependency>
  
<dependency>
    <groupId>com.dameng</groupId>
    <artifactId>Dm8JdbcDriver18</artifactId>
    <version>8.1.1.49</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/lib/DmJdbcDriver18.jar</systemPath>
</dependency>

<dependency>
           <groupId>com.dameng</groupId>
           <artifactId>dm-DmDialect</artifactId>
           <version>5.3</version>
           <scope>system</scope>
           <systemPath>${project.basedir}/src/lib/DmDialect-for-hibernate5.3.jar</systemPath>
       </dependency>


添加profiles,方便打包时选择不同的数据库环境

<profiles>
       <profile>
           <id>sqlserver</id>
           <activation>
               <activeByDefault>true</activeByDefault>
           </activation>
           <properties>
               <project.active>sqlserver</project.active>
           </properties>
       </profile>
      
       <profile>
           <id>dameng</id>
           <properties>
               <project.active>dameng</project.active>
           </properties>
       </profile>
   </profiles>

springboot配置

application.yml配置

spring:
  profiles:
    active: @project.active@
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
mybatis:
  configuration:
    database-id: @project.active@
    mapper-locations: classpath:mapperxml/*.xml

application-dameng.yml配置

spring:
  profiles:
    active: dameng
  datasource:
    driver-class-name: dm.jdbc.driver.DmDriver
    url: jdbc:dm://192.168.1.152:5237?schema=test
    username: SYSDBA
    password: 123456789

  jpa:
    hibernate:
      ddl-auto: update
    database-platform: org.hibernate.dialect.DmDialect

applicatin-sqlserver.yml配置

spring:
  jpa:
    database-platform: org.hibernate.dialect.SQLServer2008Dialect
  datasource:
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
      url: jdbc:sqlserver://192.168.1.82;databasename=test
      username: sa
      password: 123456

至此即可正常使用jpa来操作不同的数据库。

mybatis的mapper文件配置

如果在不同的数据库环境下,某些sql语句需要分别处理。我们只需要在mapper里面定义两个相同的方法,为方法添加不同的databaseId即可。
例子如下:


 <update id="initTable" databaseId="sqlserver">
if not exists (select * from sysobjects where id = object_id('testTable')
and OBJECTPROPERTY(id, 'IsUserTable') = 1)
CREATE TABLE testTable (
	[id] [int] IDENTITY(1,1) NOT NULL,
	data_id varchar(255)  NULL,
	permission int NULL,
	user_id int NULL,
	CONSTRAINT PK_testTable PRIMARY KEY (id)

)
IF NOT EXISTS (SELECT name from sys.indexes
           WHERE name = N'UK_testTable')
CREATE UNIQUE NONCLUSTERED INDEX UK_testTable ON testTable (user_id, data_id, permission)

	</update>
    <update id="initTable" databaseId="dameng">

	declare
  V_c INT;
begin
  select  count(*) into V_C  from sysobjects where name = 'testTable';
if V_c == 0 then
 execute immediate

 '
 CREATE TABLE  "testTable"
(
"id" INT IDENTITY(1, 1) NOT NULL,
"data_id" VARCHAR(255),
permission int NULL,
user_id int NULL,
CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR)

' ;
 execute immediate
'CREATE UNIQUE  INDEX "UK_testTable" ON "testTable"(user_id ASC, data_id ASC, permission ASC) STORAGE(ON "MAIN", CLUSTERBTR)' ;

end if;
end;

	</update>

文章作者: 一剑潇
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 一剑潇 !
  目录
{% if theme.mermaid.enable %} {% endif %}