System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种基于SpringBoot、mybatis框架实现数据库国产化改造的方法、系统、设备及存储介质技术方案_技高网

一种基于SpringBoot、mybatis框架实现数据库国产化改造的方法、系统、设备及存储介质技术方案

技术编号:42102329 阅读:7 留言:0更新日期:2024-07-25 00:27
本发明专利技术涉及数据库技术领域,尤其为一种基于SpringBoot、mybatis框架实现数据库国产化改造的方法,包括以下步骤:S1,采用拦截器org.apache.ibatis.plugin.Interceptor对项目进行拦截,获取org.apache.ibatis. plugin.Invocation,接着通过invocation. getArgs()[0]获取org.apache.ibatis. mapping.MappedStatement,通过这两个对象获得技术所需的其他参数,并将获取的参数组成参数集;S2,根据获取的参数集的结构不同将参数集划分为NULL值型、单值型、MAP型以及复合型四种,NULL值型指参数集为空,单值型指参数集为一个基础类型、字符串类型,没有其他的结构构成,下文中单值同释,MAP型指参数集为一层的key‑value形式,本发明专利技术可以有效解决目前数据库国产化改造的方法存在的侵入性比较大,流程难以系统化,无法统一推广,比较费时费力,增加了开发人员的学习成本,提高了开发难度的问题。

【技术实现步骤摘要】

本专利技术涉及数据库,具体为一种基于springboot、mybatis框架实现数据库国产化改造的方法、系统、设备及存储介质。


技术介绍

1、在信创改造、数据库国产化改造背景下,基于springboot、mybatis框架的web系统后端,通过插件无缝将连接的数据库由mysql连接改造为国产达梦数据库,目前已有技术主要针对达梦数据库数据同步方法、方式、数据缓存管理、自动化创建数据结构等方向的,在数据库切换方面目前仍然是个空白,目前没有相关技术支撑的专利。

2、在数据库国产化改造进程中,目前通用的做法是在原项目中进行代码级更改,侵入性比较大,而且每个项目都要进行单独改造、流程难以系统化,无法统一推广,比较费时费力,改造后,由于用了达梦数据库,所以以后项目的开发人员必须使用达梦数据库相关的语法,增加了开发人员的学习成本,提高了开发难度。

3、因此,需要一种基于springboot、mybatis框架实现数据库国产化改造的方法、系统、设备及存储介质来解决上述
技术介绍
中提出的问题。


技术实现思路

1、本专利技术的目的在于提供一种基于springboot、mybatis框架实现数据库国产化改造的方法、系统、设备及存储介质,以解决上述
技术介绍
中提出的问题。

2、为实现上述目的,本专利技术提供如下技术方案:

3、一种基于springboot、mybatis框架实现数据库国产化改造的方法,包括以下步骤:

4、s1,采用拦截器org.apache.ibatis.plugin.interceptor对项目进行拦截,获取org.apache.ibatis.plugin.invocation,接着通过invocation.getargs()[0]获取org.apache.ibatis.mapping.mappedstatement,通过这两个对象获得技术所需的其他参数,并将获取的参数组成参数集;

5、s2,根据获取的参数集的结构不同将参数集划分为null值型、单值型、map型以及复合型四种,null值型指参数集为空,单值型指参数集为一个基础类型、字符串类型,没有其他的结构构成,下文中单值同释,map型指参数集为一层的key-value形式,复合型指参数集由多层key-value形式组成,对四种参数进行sql赋值处理;

6、s3,创建一个字符串,用来承载转换后的sql,记为newsql,然后判断sql中是否包含“limit”字段,如果不包含,则无需此项处理,直接将newsql赋值为sql跳过流程,如果包含,则以第一个“limit”截取字符串,前半部分记为head,后半部分记为tail,取后半部分tail,用正则去匹配,取出这部分分页值,然后将分页值进行改造,获取起始查询序列数offset和查询数量pagesize,统称为分页值,然后用newsql拼接head+“limit”+分页值,将sql赋值为tail,确保sql中出现多个“limit”,接着做递归处理,处理完成后全部拼接到newsql中,直到最终的sql里不包含“limit”,然后用newsql拼接最后一次递归的tail值,获得完整sql,此处匹配正则表达式为:"^\\s*(?:'\\d+'\\s*,\\s*'\\d+'|\\d+\\s*,\\s*\\d+)?",可有效将在字符串开头处的第一组数字:一个数字或以“,”分隔的两个数字,提取出来,包含其中可能出现的空格,数字带单引号的情况,此处对取出的数字组进行处理,替换其中的单引号,去空格,数字化,获取起始查询序列数offset和查询数量pagesize,用于拼凑新的sql;

7、s4,将查询获取的数据转换为对应的实体类,在拦截器中返回,根据返回类型不同,对不同类型的实体构造进行处理;

8、s5,将项目中使用的mysql数据库数据迁移到达梦数据库,保证两种数据库中的库、表结构和数据一致,迁移完数据库后生成数据库配置,配置到数据库调度服务中,启动数据库调度服务,接收插件传入的sql和数据库名,创建相应的数据库连接,与数据库交互获取结果。

9、作为本专利技术优选的方案,所述s1中参数及获取方法为:org.apache.ibatis.session.configuration类型参数,简称configuration,其获取方法为mappedstatement.getconfiguration();

10、java.lang.string类型参数,为sql语句,简称sql,其获取方法为mappedstatement.getboundsql(invocation.getargs()[1]).getsql(),获取到sql后需要将字符转为大写;

11、java.lang.object类型参数,为mybatis封装后的参数集,简称paramobj,其获取方法为mappedstatement.getboundsql(invocation.getargs()[1]).getparameterobject();

12、java.lang.string类型参数,为当前所连接数据库名,简称currentdatabase,其获取方法为configuration.getenvironment().getdatasource().getconnection().getschema();

13、java.lang.string类型参数,为被拦截方法,简称methodname,获取方法为invocation.getmethod().getname();

14、org.apache.ibatis.mapping.resultmap类型参数,为mybatis中返回结果的map映射,简称resultmap,其获取方法为mappedstatement.getresultmaps().get(0);

15、java.lang.class类型参数,为返回结果实体类类型,简称resulttype,其获取方法为mappedstatement.getresultmaps().get(0).gettype()。

16、作为本专利技术优选的方案,所述s5中插件配置流程为:

17、s51,如果项目配置的是私有库即所有插件从私有库中引入,将插件jar包安装到私有库中,在pom.xml中只需引入如下配置:

18、<dependency>

19、<!--插件目录前缀-->

20、<groupid>com.chinaunicom</groupid>

21、<!--插件名称-->

22、<artifactid>xinchuang-database-plugin</artifactid>

23、<!--插件版本号-->

24、<本文档来自技高网...

【技术保护点】

1.一种基于SpringBoot、mybatis框架实现数据库国产化改造的方法,其特征在于,包括以下步骤:

2.根据权利要求1所述的一种基于SpringBoot、mybatis框架实现数据库国产化改造的方法,其特征在于:所述S1中参数及获取方法为:org.apache.ibatis.session.Configuration类型参数,简称configuration,其获取方法为mappedStatement.getConfiguration();

3.根据权利要求1所述的一种基于SpringBoot、mybatis框架实现数据库国产化改造的方法,其特征在于:所述S5中插件配置流程为:

4.根据权利要求1所述的一种基于SpringBoot、mybatis框架实现数据库国产化改造的方法,其特征在于:所述S2中SQL赋值处理方法为:对NULL值型参数不做处理,对单值型参数在参数前后加“’”,替换掉sql中的“?”,将MAP型参数与复合型参数混合在一起进行处理,对于MAP型和复合型中以param开头的参数为mybatis框架冗余的参数,在解析时直接排除,只解析实际参数名,对于MAP型和复合型中其他参数,首先要获取sql中参数对应的属性名,通过mappedStatement和invocation获取sql中每个“?”即参数对应的参数映射关系类列表:mappedStatement.getBoundSql(invocation.getArgs()[1])记为paramMappings,此列表值顺序和sql中每个参数的顺序具有一致性,这里用有序型HashMap,LinkedHashMap做存储,记为propertyMap,propertyMap中的每一个key值为顺序遍历paramMappings获取的对应属性名,接下来将MAP型和复合型中参数内属性名对应的属性值放到propertyMap中与属性名相同的key下,顺序遍历propertyMap,将sql中的“?”顺序替换为propertyMap的属性值,达梦数据库执行sql语句时,值需要用单引号引用,所以替换规则为:“?”替换为“’”+属性值+“’”。

5.根据权利要求4所述的一种基于SpringBoot、mybatis框架实现数据库国产化改造的方法,其特征在于:所述将MAP型和复合型中参数内属性名对应的属性值放到propertyMap中与属性名相同的key下的具体方法为:以拦截获取的参数集paramObj和propertyMap作为参数传入处理流程中,首先判断paramObj是否是JSONArray类型并且长度为0,如果同时满足这两个条件,直接跳出处理流程,从而将多次递归处理的空参数和没有处理价值的参数排除,如果不满足条件,说明数据有处理价值,继续判断paramObj的类型是否是JSONObject或者JSONArray,判断出是否是内部递归处理的数据,如果是递归处理的数据不需要二次进行格式转换,直接强转为JSON数据,记为jsonObj,如果不是则需要二次转换,转换后如发现有引用值,需进行引用赋值处理,最终也是转换为JSON数据,记为jsonObj,下一步对jsonObj的key值集合进行遍历处理,为方便图形化描述,在此用i标识key值集合下标,初始值为i=0,每次去判断jsonObj的第i个key是否有值,如果无值,说明遍历结束,所有数据处理完毕,直接跳出赋值流程;如果有值,则继续处理,mybatis拦截的参数产生的冗余值,值的属性名以param、param1、param2、......的形式出现,判断key值是否以“param”开头,如果是,则i值加1,继续循环处理下一个key值对应的jsonObj数据;如果不是,则获取key对应的value值,继续对value值做出判断,如果value值为空,则i值加1,继续处理下一个key值对应的jsonObj数据,如果value值不为空,则判断value值是否为单值,如果是单值,则去判断propertyMap中是否包含此value对应的key值,如果包含,将value值赋给propertyMap对应的key值,然后将i值加1,进行下次循环,如果不包含,说明此条数据无用,将i值加1,进行下次循环,如果value值不是单值,则说明value里有多层结构,属于上文中复合型型参数类型,则需要做递归处理,将value值赋值给paramObj,继续以paramObj和propertyMap作为入参进行递归处理。

6.根据权利要求5所述的一种基于SpringBoot、mybatis框架实现数据库国产化改造的方法,其特征在于:所述引用赋值处理的具体流程为:首先对paramJson的key集合进行...

【技术特征摘要】

1.一种基于springboot、mybatis框架实现数据库国产化改造的方法,其特征在于,包括以下步骤:

2.根据权利要求1所述的一种基于springboot、mybatis框架实现数据库国产化改造的方法,其特征在于:所述s1中参数及获取方法为:org.apache.ibatis.session.configuration类型参数,简称configuration,其获取方法为mappedstatement.getconfiguration();

3.根据权利要求1所述的一种基于springboot、mybatis框架实现数据库国产化改造的方法,其特征在于:所述s5中插件配置流程为:

4.根据权利要求1所述的一种基于springboot、mybatis框架实现数据库国产化改造的方法,其特征在于:所述s2中sql赋值处理方法为:对null值型参数不做处理,对单值型参数在参数前后加“’”,替换掉sql中的“?”,将map型参数与复合型参数混合在一起进行处理,对于map型和复合型中以param开头的参数为mybatis框架冗余的参数,在解析时直接排除,只解析实际参数名,对于map型和复合型中其他参数,首先要获取sql中参数对应的属性名,通过mappedstatement和invocation获取sql中每个“?”即参数对应的参数映射关系类列表:mappedstatement.getboundsql(invocation.getargs()[1])记为parammappings,此列表值顺序和sql中每个参数的顺序具有一致性,这里用有序型hashmap,linkedhashmap做存储,记为propertymap,propertymap中的每一个key值为顺序遍历parammappings获取的对应属性名,接下来将map型和复合型中参数内属性名对应的属性值放到propertymap中与属性名相同的key下,顺序遍历propertymap,将sql中的“?”顺序替换为propertymap的属性值,达梦数据库执行sql语句时,值需要用单引号引用,所以替换规则为:“?”替换为“’”+属性值+“’”。

5.根据权利要求4所述的一种基于springboot、mybatis框架实现数据库国产化改造的方法,其特征在于:所述将map型和复合型中参数内属性名对应的属性值放到propertymap中与属性名相同的key下的具体方法为:以拦截获取的参数集paramobj和propertymap作为参数传入处理流程中,首先判断paramobj是否是jsonarray类型并且长度为0,如果同时满足这两个条件,直接跳出处理流程,从而将多次递归处理的空参数和没有处理价值的参数排除,如果不满足条件,说明数据有处理价值,继续判断paramobj的类型是否是jsonobject或者jsonarray,判断出是否是内部递归处理的数据,如果是递归处理的数据不需要二次进行格式转换,直接强转为json数据,记为jsonobj,如果不是则需要二次转换,转换后如发现有引用值,需进行引用赋值处理,最终也是转换为json数据,记为jsonobj,下一步对jsonobj的key值集合进行遍历处理,为方便图形化描述,在此用i标识key值集合下标,初始值...

【专利技术属性】
技术研发人员:李冬臻堵炜炜刘彬赵启龙肖超鄂畅
申请(专利权)人:联通上海产业互联网有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1