公司的产品目前只支持mysql数据库,在客户现场做本地化部署时,客户要求只能使用oracle,所以产品做oracle适配,以下将适配过程中需要注意的点记录下来
1、首先需要下载oracle jdbc驱动包,因为客户使用的是oracle 12.1.0.2.0、jdk 1.8,所以选用了ojdbc7的驱动包,如果是通过maven管理的jar包引用的话,你会发现在maven中找不到oracle jdbc驱动包,这是因为oracle的授权问题,所在maven仓库中没有oracle驱动包,需要到oracle的官方自行下载后install到本地maven仓库,或者公司的maven仓库中
2、mybatis-config.xml,其中的方言dialect要改成oracle
3、*Mapper.xml原本放在了resources/mapper/目录下,需分别创建resources/mapper/mysql和resources/mapper/oracle目录(再有新的数据库需要适配,再创建对应的目录即可),并将*Mapper.xml分别copy到两个目录下
4、org.mybatis.spring.SqlSessionFactoryBean的实例化时,不管是通过xml还是@Bean的方式,configLocation和mapperLocations属性赋值时要区分mysql和oracle
5、resources/mapper/mysql下的*Mapper.xml不用改,只需修改resources/mapper/oracle下的*Mapper.xml,修改点如下:
5.1、sql参数增加类型,#{uid} 改成 #{uid,jdbcType=VARCHAR},Mybatis JdbcType与Oracle、MySql数据类型对应列表,见:https://blog.csdn.net/loongshawn/article/details/50496460
5.2、将`全部删除掉
5.3、insert语句改造,自增主键要显式的赋值,时间类型的字段,如果默认值设置了:CURRENT_TIMESTAMP,改成oralce的也需要显式的赋值,如下:
mysql:insert into test_info (name, desc) values (#{name}, #{desc})
oracle:insert into test_info (id, name, desc, create_time, update_time) values (seq_test_info.nextval, #{name,jdbcType=VARCHAR}, #{desc,jdbcType=VARCHAR}, sysdate, sysdate)
5.4、insert into table ...
mysql:支持 insert into table value 和 insert into table values两种都支持
oracle:只支持 insert into table values
5.5、update语句,时间类型的字段,如果默认值设置了CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,则此字段在update时需要显式的赋值
5.7、group_concat(xxxx) 改成 to_char(wm_concat(xxxx))
5.8、where a like concat(‘%‘, #{name}, ‘%‘) 改造方式如下:
1) where a like ‘%‘ || #{name,jdbcType=VARCHAR} || ‘%‘
2) where a like concat(concat(‘%‘, #{name,jdbcType=VARCHAR}), ‘%‘)
5.9、时间转换
mysql:DATE_FORMAT(new(),‘%Y-%m-%d‘)
oracle:to_char(sysdate, ‘yyyy-mm-dd‘)
5.10、当前时间之前
mysql:DATE_ADD(NOW(),INTERVAL -#{timeout} SECOND)
oracle:to_date(to_char(sysdate - #{timeout,jdbcType=INTEGER}/(24*60*60),‘yyyy-mm-dd hh24:mi:ss‘),‘yyyy-mm-dd hh24:mi:ss‘)
5.11、oralce表的别名不能使用as修饰
5.12、order、level、raw、desc、user等作为表名或字段名的话需要双引号括起来,因为这些是oracle中关键字或者预留关键字,例如:select id, "order" from info where "order" = 1
5.13、注意,对oracle来说空字符‘‘和null是等价的,空字符存到oracle数据库中会被当做null处理
5.14、mybatis查询结果是Map类型时,因为oracle的字段全部都是大写,所以返回的Map中的数据key也全部变成了大写,这时可以构建一个<resultMap type="java.util.Map"></resultMap> 返回结果使用此resultMap,用于使返回结果Map中的key是区分大小写的
使用mybatis做ORM的应用,由单纯支持mysql,改为兼容oracle