mybatis怎么实现两种数据库的兼容

mybatis怎么实现两种数据库的兼容,第1张

方法:在系统运行过程中,针对不同数据库类型区分加载不同文件路径下的sqlmap配置。留给开发人员做的事依旧是快乐地编写原始数据库语句,而不再为多数据库兼容问题挠头。

分析问题:

1、解决ibatis多数据库兼容的问题,实际上就是让ibatis可以自动选择不同数据库sqlmap配置文件。

2、打开ibatis源码工程并进行代码跟踪,最终定位到com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.java处,系统中运行的sqlmap节点均从这里统一转化加载的。

3、很明显SqlMapConfigParser源码中的addSqlMapNodelets负责解析“/sqlMapConfig/sqlMap”路径,即也就是sqlmap文件路径。

4、要实现“多数据库兼容”,这里改造下这个方法即可。

解决方法:

1、首选我们在节点新增一个“DBProductName”用于判断数据库种类。当然通过java.sql.DatabaseMetaData也可以获得,但这太依赖于jdbc驱动,还是手动配置保险。

2、重构SqlMapConfigParser的addSqlMapNodelets方法。

" 1)首选获得单个sqlmap文件的位置,如 sqlmap主目录\XXX.xml;

2)依据上面设置的DBProductName属性值获得数据库类型;

3)将sqlmap的文件路径重定位到运行数据库类型文件下。如 sqlmap主目录\mysql\XXX.xml,代表程序当前运行于msql数据库上,并加载系统mysql数据库对应的 sqlmap文件"

4、ok,现在ibatis支持“多数据库兼容”了(完整源码见附件)。

使用方法:

1、编译SqlMapConfigParser.java生成可运行文件SqlMapConfigParser.class(见附件),并将其覆盖添加到ibatis.jar中。

2、在系统sqlmap配置文件存放主目录如src\conf\mapping添加多数据库兼容支持的子目录,如src\conf\mapping\mysql,src\conf\mapping\oracle等

3、以实际项目需要编写多数据库sqlmap配置文件。注意:不同数据库类型需要确保具有相同的sqlmap配置文件名和sql节点名

4、在ibatis主配置文件(如sql-map-config.xml)中,指定当前程序运行数据库类型

如果使用Java开发这个项目,建议是使用Hibernate框架,可以解决这个问题,Hibernate会帮助你实现数据库的封装,保持兼容性。

比较普通的做法就是多写一些代码,分别面向Oracle和MySQL数据库。可能这样会比较麻烦啊。。需要自己动手处理兼容问题

gaussdb数据库参数说明【版本和平台兼容性】【14】

1. 历史版本兼容性

数据库系统的向后兼容性能够为对旧版本的数据库应⽤提供⽀持。

array_nulls

参数说明:控制数组输⼊解析器是否将未⽤引⽤的 NULL 识别为数组的⼀个 NULL 元素。

取值范围:布尔型

on 表⽰允许向数组中输⼊空元素。但 PostgreSQL 8.2 之前的版本不⽀持这么做,因此将把 NULL 当作字符串 “NULL” 。

off 表⽰向下兼容旧式模式。仍然能够创建包含 NULL 值的数组。

默认值:on

backslash_quote

参数说明:控制字符串⽂本中的单引号是否能够⽤ \’ 表⽰。

符合 SQL 标准的写法是将其双写(’’),之前版本的 PostgreSQL 允许使⽤\’ 表⽰。但是使⽤ ’ 容易导致安全漏洞,因为存在某些多字节字符集中的最后⼀个字节与 \ 的 ASCII 值相等。服务器拒绝带有反斜杠转义的查询可以预防这种风险。

注意:

在字符串⽂本符合 SQL 标准的情况下,\ 没有任何其他含义。这个参数影响的是如何处理不符合标准的字符串⽂本,包括明确的字符串转义语法是(E’…’)。

取值范围:枚举类型

on 表⽰⼀直允许使⽤ \’ 表⽰。

off 表⽰拒绝使⽤ \’ 表⽰。

safe_encoding 表⽰仅在客户端字符集编码不会在多字节字符末尾包含 \ 的 ASCII 值时允许。

默认值:safe_encoding

default_with_oids

参数说明:在没有声明 WITH OIDS 和 WITHOUT OIDS 的情况下,这个选项控制在新创建的表中 CREATE TABLE 和 CREATE TABLE AS 是否包含⼀个 OID 字段。它还决定 SELECT INTO 创建的表⾥⾯是否包含 OID 。

不推荐在⽤户表中使⽤ OID ,故默认设置为 off。需要带有 OID 字段的表应该在创建时声明 WITH OIDS 。

取值范围:枚举类型

说明:

在 PostgreSQL 8.1 之后 default_with_oids 缺省为由 on 改为 off 。

默认值:off

escape_string_warning

参数说明:警告在普通字符串中直接使⽤反斜杠转义。

如果需要使⽤反斜杠作为转义,可以调整为使⽤转义字符串语法(E’…’)来做转义,因为在每个 SQL 标准中,普通字符串的默认⾏为现在将反斜杠作为⼀个普通字符。

这个变量可以帮助定位需要改变的代码。

取值范围:布尔型

默认值:on

lo_compat_privileges

参数说明:控制是否启动对⼤对象权限检查的向后兼容模式。

取值范围:布尔型

on 表⽰当读取或修改⼤对象时禁⽤权限检查,与PostgreSQL 9.0 以前的版本兼容。

默认值:off

quote_all_identifiers

参数说明:当数据库⽣成 SQL 时,此选项强制引⽤所有的标识符(包括⾮关键字)。这将影响到 EXPLAN 的输出及函数的结果,例如pg_get_viewdef。 详细说明请参见 gs_dump 的 --quote-all-identifiers 选项。

取值范围:布尔型

默认值:off

sql_inheritance

参数说明:控制继承语义。

取值范围:布尔型

off 表⽰各种命令不能访问⼦表,即默认使⽤ ONLY 关键字。这是为了兼容 7.1 之前版本⽽设置的。

默认值:on

standard_conforming_strings

参数说明:控制普通字符串⽂本(’…’)中是否按照 SQL 标准把反斜扛当普通⽂本。

应⽤程序通过检查这个参数可以判断字符串⽂本的处理⽅式。

建议明确使⽤转义字符串语法(E’…’)来转义字符。

取值范围:布尔型

说明:

从 PostgreSQL 9.1 版本开始,默认值改为由 off 改为 on。

默认值:on

synchronize_seqscans

参数说明:控制启动同步的顺序扫描。在⼤约相同的时间内并⾏扫描读取相同的数据块,共享 I/O 负载。

取值范围:布尔型

on 表⽰扫描可能从表的中间开始,然后选择"环绕"⽅式来覆盖所有的⾏,为了与已经在进⾏中的扫描活动同步。这可能会造成没有⽤ORDER BY ⼦句的查询得到⾏排序造成不可预测的后果。

off 表⽰确保 PostgreSQL 8.3 之前的版本的顺序扫描是从表头开始的。

默认值 :on

2. 平台和客户端兼容性

transform_null_equals

参数说明:控制表达式expr = NULL(或 NULL = expr)当做expr IS NULL处理。如果expr得出NULL值则返回真,否则返回假。

正确的SQL标准兼容的expr = NULL总是返回NULL(未知)。

Microsoft Access⾥的过滤表单⽣成的查询使⽤expr = NULL来测试空值。打开这个选项,可以使⽤该接⼝来访问数据库。

注意:

这个选项只影响 = NULL精确形式,不包括其他⽐较 *** 作符或者其他与⼀些涉及等号 *** 作符的表达式计算(⽐如 IN)。

取值范围:布尔型

默认值:off,新⽤户经常在涉及NULL的表达式上语义混淆,故默认值设为off。

is_equal_nullstring_and_nullvalues

参数说明:控制空字符串’'与空值NULL是否等价。

on表⽰SQL语句中的空字符串’'在语法分析阶段会被当做空值NULL来处理。

off表⽰空字符串’'不会被当做NULL来处理。

说明:

当sql_format=mysql时,空字符串’'也不会被当做NULL来处理。⼆者是"或"的关系,即只要满⾜前⾯任何⼀个条件,空字符串都与NULL不等价。

取值范围:布尔型

默认值:on,即空字符串与NULL是等价的。

sql_format

参数说明:控制数据库的SQL语法和语句⾏为同哪⼀个主流数据库兼容。

oracle表⽰同oracle兼容。

mysql表⽰同mysql兼容。

取值范围:枚举型

默认值:oracle

5.9

百度文库VIP限时优惠现在开通,立享6亿+VIP内容

立即获取

gaussdb数据库参数说明【版本和平台兼容性】【14】

gaussdb数据库参数说明【版本和平台兼容性】【14】

1. 历史版本兼容性

数据库系统的向后兼容性能够为对旧版本的数据库应⽤提供⽀持。

array_nulls

参数说明:控制数组输⼊解析器是否将未⽤引⽤的 NULL 识别为数组的⼀个 NULL 元素。

取值范围:布尔型

on 表⽰允许向数组中输⼊空元素。但 PostgreSQL 8.2 之前的版本不⽀持这么做,因此将把 NULL 当作字符串 “NULL” 。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6737365.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存