目录
摘要
开发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>