公司项目中使用mybatis 操作oracle数据库,使用过程中遇到几个问题,记录下,以便后面遇到相同问题知道怎么解决:
1、乱码问题
线上是oracle版本:Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64,编码:NLS_NCHAR_CHARACTERSET:AL16UTF16,NLS_CHARACTERSET:US7ASCII,ojdbc版本:ojdbc6,查询中文乱码,线上环境oralce编码不能改,所以只能另外想办法。了解到项目使用的是druid,可以通过编码转换,修改配置如下:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:wrap-jdbc:filters=encoding:jdbc:oracle:thin:@127.0.0.1:1521:ORCL
username: xxxx
password: xxxx
druid:
connection-properties: serverEncoding=ISO-8859-1;clientEncoding=GBK;serverTimezone=Asia/Shanghai
上线运行,乱码问题解决。
2、mybatis 中不能使用中文
mybatis的xlm中中文不能写中文,如:select * from user where name='张三',user表有张三但是就是查询不出来,换成select * from user where name=#{name} ,传“张三”可以查到,怀疑是驱动版本过低,升级驱动到ojdbc8,结果乱码并且xml 中的中文仍然不能用,那是不是驱动太高了,降低驱动到ojdbc14,mybatis的xml中的中文能用了
3、日期类型查询时分秒都为0
换了ojdbc14后,乱码、xml中文查询不了的问题都解决了,又出现查询Date类型的时分秒都变成零,了解到不同的Oracle驱动在解析时可能有不同的处理方式,ojdbc14可能用的java.sql.Date接收日期参数,而java.sql.Date只保留日期部分,时间部分会被忽略,有一种解决方案就是在代码中添加:System.setProperty("oracle.jdbc.V8Compatible","true"),上线后日期能正常显示了。
最后总结:oracle使用各个版本对应驱动都不一样,要选择对应的驱动才行,否则会出现一系列的问题,还有就是oracle在创建时就要设定好编码,否则就可能会出现乱码问题。