分析问题:
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” 。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)