SpringBoot整合达梦数据库

安装配置

软件安装

下载地址:https://www.dameng.com/view_61.html

本文以x86 win64 DM8为例

SpringBoot整合达梦数据库

安装完毕后打开DM数据库配置助手创建数据库,设置字符集utf8,去除字符大小写敏感

SpringBoot整合达梦数据库

创建表空间及用户,最好是一个库对应一个用户一个表空间,创建用户时需要指定对应表空间

SpringBoot整合达梦数据库

SpringBoot整合达梦数据库

需要对用户分配DBA操作权限

SpringBoot整合达梦数据库

数据表迁移

针对现有项目或框架库需要同步迁移到达梦数据库,本文以mysql5.7为例,打开DM数据迁移工具,注意保持对象名大小写,选择表时全部取出再全选,迁移的表名和字段名就与原数据库保持一致

SpringBoot整合达梦数据库

SpringBoot整合达梦数据库

maven引用


            com.dameng
            DmJdbcDriver18
            8.1.1.193

            com.alibaba
            druid
            1.2.0

数据库配置

使用druid管理连接池,去除wall的配置否则会报错

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
      driverClassName: dm.jdbc.driver.DmDriver
      url: jdbc:dm://localhost:5236/ROOT?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
      username: ROOT
      password: abcd@1234
    filters: stat,slf4j

兼容代码

数据会在达梦的数据库驱动中强制大写,这对某些接口的数据返回给前端数据大小写出现问题,影响范围较大

SpringBoot整合达梦数据库

JdbcTemplate处理

我们可以通过混合使用jdbcTemplate进行查询的通用操作,调用query方法,传入自定义的ResultSetExtractor,得到jdbc原生的ResultSet对象,取出ResultSetMetaData转换成DmdbResultSetMetaData,其中的columns对象为私有对象且无方法访问,通过反射取出即可,通过columns获取到数据库实际的列名

    public List> findListByParam(String sqlText, Map map) {
        List> result = new ArrayList<>();
        List paramList = new ArrayList<>();
        //解析sqlText中的占位符#{xxxx}
        String regex = "\\#\\{(?[\\w.]*)\\}";
        String sqlTextCopy = sqlText;
        Pattern pattern = Pattern.compile(regex);

        Matcher matcher = pattern.matcher(sqlTextCopy);
        while (matcher.find()) {
            String paramNameSymbol = matcher.group(0);
            sqlText = sqlText.replace(paramNameSymbol, " ? ");
        }
        logger.debug("【sqlText】:" + sqlText);

        //参数赋值
        matcher = pattern.matcher(sqlTextCopy);
        while (matcher.find()) {
            String paramNameSymbol = matcher.group(0);
            String paramName = paramNameSymbol.replace("#", "").replace("{", "").replace("}", "");
            Object paramValue = map.get(paramName);
            logger.debug("【paramName】:" + paramName);
            logger.debug("【paramValue】:" + paramValue);
            paramList.add(paramValue);
        }

        jdbcTemplate.query(sqlText, paramList.toArray(), new ResultSetExtractor() {
            @Override
            public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
                try {
                    ResultSetMetaData rsMetaData = rs.getMetaData();
                    Column[] dm_columns = null;
                    if (dataBaseInfoUtil.getUsingDataBaseType() == GlobalEnum.DataBaseType.DM) {
                        ResultSetMetaDataProxyImpl resultSetMetaDataProxy = (ResultSetMetaDataProxyImpl) rsMetaData;
                        DmdbResultSetMetaData dmdbResultSetMetaData = (DmdbResultSetMetaData) resultSetMetaDataProxy.getRawObject();
                        Class dataClass = DmdbResultSetMetaData.class;
                        Field field = dataClass.getDeclaredField("columns");
                        field.setAccessible(true);
                        dm_columns = (Column[]) field.get(dmdbResultSetMetaData);
                    }
                    while (rs.next()) {
                        LinkedHashMap resultitem = new LinkedHashMap<>();
                        for (int i = 1; i

与mybaits统一数据源

在使用事务时,因为查询操作通过jdbcTemplate,更新操作通过myabtis,在某些隔离级别下会查询不到未提交的数据,所以需要统一数据源都为druid管理的datasource,这里的dynamicDataSource为我自定义的数据源处理对象,继承自spring的AbstractRoutingDataSource,为了处理多数据源情况

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        //SpringBootExecutableJarVFS.addImplClass(SpringBootVFS.class);
        final PackagesSqlSessionFactoryBean sessionFactory = new PackagesSqlSessionFactoryBean();
        sessionFactory.setDataSource(dynamicDataSource());
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mybatis/**/*Mapper.xml"));
        //关闭驼峰转换,防止带下划线的字段无法映射
        sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(false);
        return sessionFactory.getObject();
    }

    @Bean
    public JdbcTemplate jdbcTemplate(){
        JdbcTemplate jdbcTemplate = null;
        try{
            jdbcTemplate = new JdbcTemplate(dynamicDataSource());
        }catch (Exception e){
            e.printStackTrace();
        }
        return jdbcTemplate;
    }

映射成实体类

统一将查询操作结果转换成LinkHashMap键值对,再通过BeanMap映射成对应的实体类

clob长文本处理

                    Object value = map.get(resultkey);
                    if(value instanceof ClobProxyImpl){
                        try {
                            value =  ((ClobProxyImpl) value).getSubString(1,(int)((ClobProxyImpl) value).length());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

blob二进制处理

                    Object value = map.get(resultkey);
                    if(value instanceof DmdbBlob){
                        try {
                            DmdbBlob dmdbBlob = (DmdbBlob)value;
                            value = FileUtil.convertStreamToByte(dmdbBlob.getBinaryStream());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

Original: https://www.cnblogs.com/yanpeng19940119/p/15778475.html
Author: code2roc
Title: SpringBoot整合达梦数据库

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616484/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL十四:单表最大2000W行数据

    转载~ 在互联网技术圈中有一个说法: 「MySQL 单表数据量大于 2000 W行,性能会明显下降」。网传这个说法最早由百度传出,真假不得而知。但是却成为了行业内一个默认的标准。 …

    Java 2023年6月8日
    0107
  • 查找Java maven项目,和reactJS项目的license

    ReactJS: npm install -g license-checker npm install -g yui-lint license-checker –pro…

    Java 2023年5月29日
    067
  • idea编译eclipse项目时修改java代码后运行不生效

    将 webinfo下面的class文件设置为execute就编译成功了 Original: https://www.cnblogs.com/qianzf/p/14770599.ht…

    Java 2023年5月29日
    084
  • 非易失性规划的原理与实现方法

    常言道,计划不如变化快。计划的制定本身就建基于对未来一定时间范围内的环境条件假设,当计划制定后到执行完成的时间段内,若环境条件发生变化,那么计划也需要进行适当的调整才能满足实际要求…

    Java 2023年6月16日
    088
  • Java应用系统监控方法简介

    tsar 阿里巴巴开源的实时系统监控工具。其内部的sunfire有部分指标就是基于该工具每分钟采集一次来获取的。github 监控项及数据来源一览 摘自tsar/info.md 监…

    Java 2023年5月29日
    075
  • freemarker

    1.freemarker 介绍 FreeMarker &#x662F;&#x4E00;&#x6B3E; &#x6A21;&#x677F;&a…

    Java 2023年6月9日
    0128
  • Dubbo学习

    Dubbo 前言 1.1 大型互联网项目架构目标 1.2 集群和分布式 概念 集群:很多”人”一起,干一样的事。 一个业务模块,部署在多台服务器上。 分布式…

    Java 2023年6月8日
    093
  • TypeScript(4)接口

    介绍 TypeScript 的核心原则之一是对值所具有的结构进行 &#x7C7B;&#x578B;&#x68C0;&#x67E5;。我们使用接口(I…

    Java 2023年6月9日
    085
  • MyBatis 插入和查询动态表名中的数据

    背景说明 有些业务场景,需要对表进行了分表操作(如:按天分表,test_20220123,test_20220124)。 分表后,如何对分表进行动态传入表名,进行插入和查询数据呢?…

    Java 2023年5月30日
    082
  • MyBatis复杂映射开发之一对一查询

    一对一查询需求 用户表和订单表的关系为:一个用户可以有多个订单,一个订单只能从属于一个用户 一对一查询需求:查询一个订单,同时查询出该订单所对应的用户 对应的sql语句: sele…

    Java 2023年6月5日
    0120
  • 十大排序

    十大排序 import java.util.ArrayList; import java.util.Collections; import java.util.List; impo…

    Java 2023年6月8日
    089
  • Java–异常

    引言Java设置了异常,旨在鼓励将方法中可能出现的异常告知给使用此方法的程序员(你和我!)。当然了,这种方法是比较优雅的,让我们确切的知道是在哪里出了错,并提供了异常捕获。本篇文章…

    Java 2023年6月13日
    077
  • 线程池技术

    由于时间有限,我简单说一下,然后附上一个例子。例子是别人写的,找不到远处,但我看了下代码写的很好。有些应用,需要大量开辟线程来处理事务,但处理完后,线程退出。比如web服务器,比如…

    Java 2023年5月30日
    071
  • 自己实现 aop 和 spring aop

    代理类肯定要为用户做一些事情,不可能像学设计模式的时候创建个代理类,然后简单的在前面打印一句话,后面打印一句话,这叫啥事啊,难怪当时听不懂。最好是这个方法的前后过程可以自户自己定义…

    Java 2023年6月5日
    087
  • Spring系列16:ApplicationContext扩展国际化

    简单点对比下两者的功能定位: BeanFactory 提供了管理和操作 bean 的基本功能,为 Spring的IoC 功能提供了底层基础,用于与 Spring 的其他部分以及相关…

    Java 2023年6月5日
    098
  • 文字隐写术-盲水印研究笔记【原创】

    gitee 开源代码(java) https://gitee.com/chejiangyi/shuiyin/tree/master 需求概述 研究盲水印对于版权保护的效果和能力 研…

    Java 2023年6月8日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球