jpa适配mysql切换达梦可能的坑

目录

1、liquibase脚本

2、mysql的char(32)和达梦char(32)有区别

3、group by区别

4、order by区别

5、索引唯一校验不同

6、distinct和order by 一起使用

7、liquibase的text字段

8、double(6,2)精度问题



1、liquibase脚本

(1)达梦数据库不支持,修改字段varchar改成blob

<changeSet author="ly" id="v3.0_4_202307111505_101">
   <renameColumn tableName="PC_SS_ZRQD" oldColumnName="BHNR" newColumnName="BHNR" columnDataType="TEXT"
                 remarks="包含内容(信息项)"/>
</changeSet>

可以增加数据库判断,mysql就是text,达梦就修改成varchar(5000)

<changeSet author="ly" id="v3.0_4_202307111505_101">
   <preConditions onFail="MARK_RAN">
      <columnExists tableName="PC_SS_ZRQD" columnName="BHNR"/>
      <dbms type="mysql"/>
   </preConditions>
   <renameColumn tableName="PC_SS_ZRQD" oldColumnName="BHNR" newColumnName="BHNR" columnDataType="TEXT"
                 remarks="包含内容(信息项)"/>
</changeSet>

2、mysql的char(32)和达梦char(32)有区别

mysql如果字段定义是char(32),如果内容是1,数据表存的就是1

达梦如果字段定义是char(32),如果内容是1,数据表存的就是1加31个空格

所以对于变长的字段,达梦建议改成varchar(32)

3、group by区别

(1)下面sql达梦会报错

SELECT t1.mbbh,count(1) from Sqd GROUP BY t1.mbId

mysql不会报错,达梦会报错

达梦的select返回值,必须在group by里面,需要改成

SELECT t1.mbbh,count(1) from Sqd GROUP BY t1.mbId,t1.mbbh

(2)select zd ,count(1) from test

mysql不会报错,达梦会报错

达梦不支持select 字段1,字段2,count(1),不带group by的写法

4、order by区别

SELECT t1.mbbh,count(1) from Sqd GROUP BY t1.mbId,t1.mbbh order by t1.cjsj

这个sql,mysql支持,达梦会报错。使用group by时,达梦的order by字段,必须在select中

SELECT t1.mbbh,max(t1.cjsj) as cjsj,count(1) from Sqd GROUP BY t1.mbId,t1.mbbh order by cjsj

原因:达梦执行过程

1、先执行group by,把结果生成一个临时表

2、order by是对临时表进行排序

所以,如果select 不包含排序字段会报错

5、索引唯一校验不同

达梦数据库索引名称,要全库唯一,不是表维度唯一

例如,在mysql存在数据表, zyxx,   mlxx2个表,对id都建了id_index索引,在mysql不会报错

在达梦数据库会报错

6、distinct和order by 一起使用

达梦  distinct和order by 一起使用, 如果查询结果不包含order by字段会报错

select distinct a from test order by b

mysql不报错,达梦报错。

达梦语法:select distinct a,b from test order by b

7、liquibase的text字段

text在myql库中,建表时字段类型是text, 在达梦数据库建表时是clob类型。

如果字段查询用到了in、like等,达梦的clob在jpa中不支持,会报类型错误。 mysql不会报错

8、double(6,2)精度问题

<column name="ddF" remarks="xx" type="DOUBLE(6,2)"/>

在mysql数据库会初始化成字段类型decimal(6,2),  在达梦中初始化成real, 会丢失精度

换成:decimal(6,2)

### Spring Boot 配置多数据源 (MySQL达梦数据库) 在现代应用开发中,Spring Boot 提供了一种简单而强大的方式来配置和管理多个数据源。以下是关于如何在一个 Spring Boot 项目中同时适配 MySQL达梦数据库的具体方法。 #### 1. 添加依赖项 为了支持 MySQL达梦数据库,在 `pom.xml` 文件中需要引入相应的 JDBC 驱动程序以及必要的组件: ```xml <dependencies> <!-- MySQL Driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- DM Database Driver --> <dependency> <groupId>dm</groupId> <artifactId>dmjdbc驱动</artifactId> <version>具体版本号</version> </dependency> <!-- Spring Data JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies> ``` 上述代码片段展示了所需的 Maven 依赖项[^1]。 #### 2. 配置文件 (`application.yml`) 设置 通过 `application.yml` 或者 `application.properties` 来定义两个不同的数据源及其相关属性: ```yaml spring: datasource: mysql: url: jdbc:mysql://localhost:3306/mysql_db?useSSL=false&serverTimezone=UTC username: root password: root_password driver-class-name: com.mysql.cj.jdbc.Driver dameng: url: jdbc:dameng://localhost:5236/dameng_db username: sysdba password: sysdba_password driver-class-name: dm.jdbc.driver.DmDriver jpa: hibernate: ddl-auto: update show-sql: true ``` 此部分描述了如何分别指定 MySQL达梦的数据源 URL、用户名、密码以及其他必要参数。 #### 3. 创建自定义配置类 创建用于加载并初始化这两个数据源的 Java 配置类。下面是一个示例实现: ```java import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = "com.example.mapper.mysql", sqlSessionFactoryRef = "mysqlSqlSessionFactory") public class MysqlDataSourceConfig { @Bean(name = "mysqlDataSource") public DataSource dataSource() { HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl("jdbc:mysql://..."); dataSource.setUsername("root"); dataSource.setPassword("password"); return dataSource; } @Bean(name = "mysqlSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception { ... } } // 类似地为 Dameng 数据库编写另一个配置类... ``` 以上代码展示了一个针对 MySQL 的数据源配置实例[^4]。对于达梦数据库,则需重复类似的逻辑调整对应字段名即可完成第二个数据源的支持。 #### 4. 解决常见问题 如果遇到诸如 `"AUTO_INCREMENT"` 错误或者方言不匹配等问题时,请确认已正确定义 Hibernate 方言选项,并确保 SQL 脚本兼容目标 DBMS 特性[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖兔兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值