1.情景展示
在实际开发中,不同的地方可能所需使用的数据库是不同的。
这就要求,我们开发的程序需要兼容不同的数据库,放到程序里面就是:
需要有不同类型的sqlMap文件。
以既要兼容MySQL,也要兼容Oracle进行举例说明。
2.准备工作
第一步
根据已经写好的一套sql进行复制,然后,在原有sql的基础上修改成对应数据库所支持的SQL。
第二步
修改mapper.xml的扫描路径
以及分页插件的数据库类型
第三步
修改数据库连接配置
MYSQL
spring:
datasource:
url: jdbc:mysql://192.168.0.1:3306/test?useUnicode=true&characterEncoding=utf8
username: 123
password: 123
driverClassName: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 200
ORACLE
spring:
datasource:
url: jdbc:oracle:thin:@192.168.1.1:1521:orcl
username: TEST
password: TEST
driverClassName: oracle.jdbc.driver.OracleDriver
hikari:
maximum-pool-size: 200
3.具体转换
字符串拼接
MYSQL使用concat()
<if test="code != null and code != ''">
and code like CONCAT('%',#{code},'%')
</if>
ORACLE使用管道符||
<if test="code != null and code != ''">
and code like '%' || #{code} || '%'
</if>
虽然ORACLE也可以使用CONCAT()连接字符串,但是,它只能将两个字符串拼接到一起。
如果需要拼接2个以上的字符串,只能嵌套N次,形如:
CONCAT(CONCAT('%',#{code}),'%')
字符串转日期
日期转字符串
mysql使用DATE_FORMAT()
<if test="endTime != null">
,DATE_FORMAT(#{endTime},'%Y-%m-%d 23:59:59') as endTime
</if>
DATE_FORMAT(base_eva_detail.create_time,'%Y-%m-%d %H:%i:%s') as create_time,
在mysql中,%c表示月份,个位数月份前面不会自动补零;
而%m表示月份,个位数月份前面将会自动补零。
ORACLE使用TO_CHAR()
<if test="endTime != null">
,TO_CHAR(#{endTime},'YYYY-MM-DD 23:59:59') as endTime
</if>
TO_CHAR(base_eva_detail.create_time, 'YYYY-MM-DD HH24:MI:SS') as create_time,
系统时间
mysql使用now()
date_format(now(),'%Y-%c-%d')
oracle使用SYSDATE
TO_CHAR(SYSDATE, 'YYYY-MM-DD')
IF()函数
MYSQL
<if test="orgId != null and orgId != ''">
and if(boi.ORGSEQ is not null, boi.ORGSEQ like CONCAT('%',#{orgId},'.%'), boi.ORGID = #{orgId})
</if>
ORALCE
ORALCE没有IF函数
<if test="orgId != null and orgId != ''">
AND (
(boi.ORGSEQ IS NOT NULL AND boi.ORGSEQ LIKE '%' || #{orgId} || '%'
OR
boi.ORGID = #{orgId})
)
</if>
ifnull()/NVL()
mysql使用ifnull()
ifnull(sum(base_eva_question_detail.eva_value),0) as allScore,
ifnull(trim(at.city_name), '') as city_name,
ORALCE使用NVL()
NVL(sum(base_eva_question_detail.eva_value),0) as allScore,
NVL(trim(at.city_name),'') as city_name,
将多行数据合并成一行
mysql使用group_concat()
<foreach collection="headers" item="item" index="index">
<if test="item.evaQuestionType == 1">
,GROUP_CONCAT( CASE eva_question_num WHEN '${item.evaQuestionNum}' THEN base_eva_question_detail.eva_answer END ) '${item.dataKey}'
</if>
<if test="item.evaQuestionType == 6 || item.evaQuestionType == 5">
,GROUP_CONCAT( CASE eva_question_num WHEN '${item.evaQuestionNum}' THEN base_eva_question_detail.eva_answer END )'${item.dataKey}'
</if>
</foreach>
ORACLE使用LISTAGG()
<foreach collection="headers" item="item" index="index">
<if test="item.evaQuestionType == 1">
,LISTAGG(CASE eva_question_num WHEN '${item.evaQuestionNum}' THEN base_eva_question_detail.eva_answer END) '${item.dataKey}'
</if>
<if test="item.evaQuestionType == 6 || item.evaQuestionType == 5">
,LISTAGG(CASE eva_question_num WHEN '${item.evaQuestionNum}' THEN base_eva_question_detail.eva_answer END)'${item.dataKey}'
</if>
</foreach>
分页查询
mysql使用limit
SELECT
*
FROM
sso_access_token
WHERE
`status` = 1
AND user_id = #{userId}
AND user_name = #{userName}
ORDER BY
create_time DESC
LIMIT 0,1
oracle使用ROWNUM
<![CDATA[
SELECT *
FROM (
SELECT *
FROM sso_access_token
WHERE status = 1
AND user_id = #{userId}
AND user_name = #{userName}
ORDER BY create_time DESC
)
WHERE ROWNUM <= 1
]]>
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!