目录
一、达梦数据库的安装和使用
1、达梦数据库下载
2、Windows环境安装达梦数据库
二、MYSQL数据库 迁移至 达梦数据库
1、DM控制台工具:Console
2、DM数据迁移工具:DTS
三、Spring项目整合达梦数据库
1、配置java项目连接达梦,切换数据连接驱动
2、Maven导入达梦数据库驱动包
3、表的实体类映射。【访问形式:模式名.表名】
4、XML文件:查询表【模式名.表名】
5、MYSQL字段类型与DM数据类型的转换。【DM:达梦数据库】
6、达梦数据库分页插件
7、SQL适配关键字列名
产品下载 | 达梦数据库
参考文章: Windows环境安装达梦数据库_达梦数据库安装-CSDN博客
参考文章:MySQL数据迁移至达梦数据库_mysql迁移达梦-CSDN博客
在安装的tool目录下,查找相关的工具:
服务器配置又该有两种方式:①DM控制台工具修改;②配置文件修改。
方法一:服务器配置:设置系统兼容性(DM控制台工具),兼容MySQL
方法二:(1)查找dm.ini文件
(2)dm.ini修改【#compatibility】的【COMPATIBLE_MODE】=4
(3)重启Dameng服务
在这里操作:MYSQL数据库迁移至DM数据库
注意:当迁移过程中出现下面问题时,如有触发器或者外键,需要先关掉触发器和外键,然后进行迁移,不然会导致迁移失败。
MYSQL的数据表转换成DM的数据表时,点击转换按钮。如下:
3、添加用户:如果导入的DM数据库需要和MYSQL的用户一样,添加ROOT用户。
package com.company.common.core.annotation; /** * 数据库类型 * * @author kally * @date 2023/12/13 */ public enum DbType { /** * 数据库类型(类型,描述) */ MYSQL("mysql", "MySql数据库"), MARIADB("mariadb", "MariaDB数据库"), ORACLE("oracle", "Oracle11g及以下数据库(高版本推荐使用ORACLE_NEW)"), ORACLE_12C("oracle12c", "Oracle12c+数据库"), DB2("db2", "DB2数据库"), H2("h2", "H2数据库"), HSQL("hsql", "HSQL数据库"), SQLITE("sqlite", "SQLite数据库"), POSTGRE_SQL("postgresql", "Postgre数据库"), SQL_SERVER2005("sqlserver2005", "SQLServer2005数据库"), SQL_SERVER("sqlserver", "SQLServer数据库"), DM("dm", "达梦数据库"), XU_GU("xugu", "虚谷数据库"), KINGBASE_ES("kingbasees", "人大金仓数据库"), PHOENIX("phoenix", "Phoenix HBase数据库"), GAUSS("zenith", "Gauss 数据库"), CLICK_HOUSE("clickhouse", "clickhouse 数据库"), GBASE("gbase", "南大通用(华库)数据库"), GBASE_8S("gbase-8s", "南大通用数据库 GBase 8s"), @Deprecated GBASEDBT("gbasedbt", "南大通用数据库"), @Deprecated GBASE_INFORMIX("gbase 8s", "南大通用数据库 GBase 8s"), SINODB("sinodb", "星瑞格数据库"), OSCAR("oscar", "神通数据库"), SYBASE("sybase", "Sybase ASE 数据库"), OCEAN_BASE("oceanbase", "OceanBase 数据库"), FIREBIRD("Firebird", "Firebird 数据库"), HIGH_GO("highgo", "瀚高数据库"), CUBRID("cubrid", "CUBRID数据库"), GOLDILOCKS("goldilocks", "GOLDILOCKS数据库"), CSIIDB("csiidb", "CSIIDB数据库"), SAP_HANA("hana", "SAP_HANA数据库"), IMPALA("impala", "impala数据库"), VERTICA("vertica", "vertica数据库"), XCloud("xcloud", "行云数据库"), REDSHIFT("redshift", "亚马逊redshift数据库"), OPENGAUSS("openGauss", "华为 opengauss 数据库"), TDENGINE("TDengine", "TDengine数据库"), INFORMIX("informix", "Informix数据库"), UXDB("uxdb", "优炫数据库"), LEALONE("lealone", "Lealone数据库"), OTHER("other", "其他数据库"); private final String db; private final String desc; public static DbType getDbType(String dbType) { DbType[] var1 = values(); int var2 = var1.length; for (int var3 = 0; var3 < var2; ++var3) { DbType type = var1[var3]; if (type.db.equalsIgnoreCase(dbType)) { return type; } } return OTHER; } public String getDb() { return this.db; } public String getDesc() { return this.desc; } /** * 数据库类型 * * @param db 数据库 * @param desc 描述 */ private DbType(final String db, final String desc) { this.db = db; this.desc = desc; } }
mysql使用反引号来区分列名和关键字;达梦数据库使用双引号来区分;实体类映射字段之前的修改。
MybatisPlusConfig.java文件再加入下列代码,复制即可。
@Bean public DmFieldCustomizer getDmFieldCustomizer() { return new DmFieldCustomizer(); } /** * 在mybatisPlus加载进spring容器之前自定义某些配置 * * @author HetFrame */ public static class DmFieldCustomizer implements MybatisPlusPropertiesCustomizer { public DmFieldCustomizer() { log.info("加载DmFieldCustomizer..."); } @SneakyThrows @Override public void customize(MybatisPlusProperties properties) { // 使用达梦数据库 if (Arrays.toString(properties.getMapperLocations()).contains("dm")) { log.info("使用达梦数据库"); //实体类的class List> classList = new ArrayList<>(); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //找到所有实体类的class Resource[] resources = resolver.getResources("classpath*:com/**/entity/**/*.class"); for (Resource res : resources) { // 先获取resource的元信息,然后获取class元信息,最后得到 class 全路径 String clsName = new SimpleMetadataReaderFactory().getMetadataReader(res).getClassMetadata().getClassName(); // 通过名称加载 Class> clazz = Class.forName(clsName); classList.add(clazz); } classList.forEach(e -> { List list = TableInfoHelper.getAllFields(e); list.forEach(field -> { TableField tableField = field.getAnnotation(TableField.class); String metaColName; if (tableField != null && StringUtils.isNotBlank(metaColName = tableField.value()) && metaColName.contains("`")) { String newColName = metaColName.replace("`", "\""); InvocationHandler invocationHandler = Proxy.getInvocationHandler(tableField); try { Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues"); memberValues.setAccessible(true); Map memberValuesMap = (Map) memberValues.get(invocationHandler); memberValuesMap.put("value", newColName); log.info("将实体类映射字段{}修改为{}", metaColName, newColName); } catch (NoSuchFieldException | IllegalAccessException exception) { throw new RuntimeException(exception); } } }); }); } else { log.info("使用mysql数据库"); } } }
package com.company.common.framework.mybatis; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties; /** * MybatisPlusPropertiesCustomizer 用于在读取 properties 之后进行一些自定义操作 * * @author kally * @date 2023/12/13 */ public interface MybatisPlusPropertiesCustomizer { /** * mysql中我们使用反引号来区分列名和关键字;但在达梦数据库中,使用双引号来区分。 * 而如果创建实体类在注解 @TableField 中使用了反引号例如 @TableField(`range`), * 这种我们改了的话,mysql 就用不了,不改达梦就用不了。所以从代码入手,在启动时用反射修改值。 * 达梦数据库某些关键字例如 audit,在 mysql 中不是关键字的,需要手动设置 @TableField(`audit`)。 */ /** * MybatisPlusPropertiesCustomizer 用于在读取 properties 之后进行一些自定义操作 * * @param properties {@link MybatisPlusProperties} */ void customize(MybatisPlusProperties properties); }