兼容多种数据库类型的

爱吃蛋挞的kk 发布于 2018/11/05 09:06
阅读 429
收藏 0

经理想让我们的项目可以支持多种数据库切换以mysql oracle sql service为主 持久层mybatis plus

然后我发现了兼容的一些问题 因为支持多种数据库所以视图也不敢写了

写xml的时候例如:

SELECT a.id AS "id", a.tenant_id AS "tenantId", a.name AS "name", a.code AS "code", a.role_type AS "roleType", a.share_status AS "shareStatus", a.views AS "views", a.files AS "files", count(c.doc_info_id) AS "collections", a.downloads AS "downloads", a.doc_classify_ids AS "docClassifyIds", a.object_link AS "objectLink", a.keyword AS "keyword", a.device AS "device", a.create_time AS "createTime", a.create_by AS "createBy", a.update_time AS "updateTime", a.update_by AS "updateBy", a.remark AS "remark", a.del_flag AS "delFlag"
 FROM (SELECT fs.*, COUNT(f.doc_info_id) AS files
 FROM doc_info fs
 LEFT JOIN doc_file_info f
 ON f.tenant_id = '1' AND fs.id = f.doc_info_id AND f.del_flag = '0'
 WHERE fs.tenant_id = '1' GROUP BY f.doc_info_id) a
 LEFT JOIN doc_info_collection c
 ON c.tenant_id = '1' AND a.id = c.doc_info_id AND c.del_flag = '0'
 WHERE a.del_flag = '0' GROUP BY a.id ORDER BY a.update_time DESC
 LIMIT 0,20;

mysql没问题但是sql service 使用group by 这样是绝对的不行的 oracle我还没试

看到很多开源项目支持的时候大多数都是使用like的时候 xml if 判断一下数据库类型 拼不同的语法

if test="et!=null and et.code!=null and et.code != ''">
    and a.code like
    <if test="@xx.xx.xx.base.entity.IdEntity@dbType=='mysql'">concat('%',#{et.code},'%')</if>
    <if test="@xx.xx.xx.base.entity.IdEntity@dbType=='oracle'">'%'||#{et.code}||'%'</if>
    <if test="@xx.xx.xx.base.entity.IdEntity@dbType=='mssql'">'%'+#{et.code}+'%'</if>
</if>

但是稍微复杂一点应该怎么去保证没有问题?

很头疼 求大佬指点一下思路

加载中
0
红薯官方
红薯官方
<if test="et!=null and et.code!=null and et.code != ''">
    <bind name="codeLike" value="'%' + et.code + '%'"/>
    and a.code like #{codeLike}
</if>

正确应该这样写!

红薯官方
红薯官方
回复 @爱吃蛋挞的kk : 不清楚你的为什么不可以,看不出问题来。搜搜 mybatis bind like
爱吃蛋挞的kk
爱吃蛋挞的kk
<if test="et!=null and et.name!=null and et.name != ''"> <bind name="nameLike" value="'%'+et.name+'%'"/> and a.name like #{nameLike} </if> 请问这是什么原因
爱吃蛋挞的kk
爱吃蛋挞的kk
"Parameter 'nameLike' not found. Available parameters are [page, param1, et, param2]"
爱吃蛋挞的kk
爱吃蛋挞的kk
...我去了解一下该语法 谢谢
0
魔力猫
魔力猫

想要自动跨数据库去看JPA,别碰原生SQL。

爱吃蛋挞的kk
爱吃蛋挞的kk
回复 @魔力猫 : 这个避免不了了 一个查询的方法在xml最少写三遍 在这里不考虑save因为可以使用mybatsi plus crud接口很方便,想要做看只能这样了 本来我的想法是看可以不可以在一个查询方法里实现多种数据库支持
爱吃蛋挞的kk
爱吃蛋挞的kk
回复 @魔力猫 : <select id="selectPageList" resultType="DocInfo" databaseId="mysql"> <select id="selectPageList" resultType="DocInfo" databaseId="mssql"> 在一个xml用写多也是可以的用databaseId区分开 实现多个数据库都能查询一样的数据
魔力猫
魔力猫
回复 @爱吃蛋挞的kk : 如果单数据库成本是1,那么写成3个独立xml然后按需打包,成本大概是3;但是你们这样写,成本恐怕要增加6-10倍都不止。天知道哪个IF没写对,就全错。如果没有特殊需求和公用需求,按需开发的项目不用考虑多数据库问题。
爱吃蛋挞的kk
爱吃蛋挞的kk
回复 @魔力猫 : 我个人也是觉得没这个必要比较这几种主流数据库多少语法还是有差异的,我们经理之前用的就是jpg 然后新项目换成了这个mybatis plus,他要求是这样支持多数据库类型。。原因是客户不一定用什么数据库 那么我觉得有些环境其实是开发商可以硬性决定的,哎 头疼 这样开发其实就相当于写了三套
下一页
返回顶部
顶部