一、前言
mybatis是我们在开发中很常用的数据持久化框架,当我们的项目需要部署到不同场景下时,有时候需要支持多种数据库,比如支持mysql、oracle、sqlserver、达梦等数据库,由于各个数据库sql语法有差异,所以我们在编写sql语句的时候就需要考虑到兼容问题,下面我们来看一下有哪些需要注意的地方。
二、详解
对NULL和""空字符串的支持
mysql是支持数据库字段存储null和""空字符串的,oracle数据库字段只支持null,会把""空字符串默认转换为null存储,这时候如果我们编写的sql语句要判断null与"",有可能这样写select * from a where name is not null and name !="",这样的话在使用mysql数据库时是没有问题的,但是在使用oracle数据库的时候就不会查出数据来,是因为oracle并不支持!=""、=""这样的写法,所以我们需要加一个判断,当是mysql时,我们加上 and name !=""。
<if test='databaseId == "mysql"'>AND name !=''</if>
对like语句的支持
mysql中拼接like语句的写法:
S.SSV_VALUE like CONCAT('%',CONCAT(#{filters.param},'%'))
oracle由于concat函数只支持两个参数,所以写法如下:
S.SSV_VALUE like CONCAT(CONCAT('%',CONCAT(#{filters.param}),'%'))
小伙伴肯定想有没有统一兼容的写法呢,答案肯定是有的,大家接着往下看
<if test="name != null and name!=''">
<bind name="_name" value="'%'+name+'%'"/>
name like #{_name}
</if>
我们使用mybatis的<bind>标签就可以提前把我们的参数与通配符'%'拼接好,赋值给新的变量_name,在like语句中直接引用该变量就可以了,是不是很简单呢