mybatis set session time zone

最近在写一个项目,持久层想用mybatis,但是查询的时候如果有TimeStamp的数据则会抛出

java.sql.SQLException: Session Time Zone not set!
的异常,经过网上的查找,发现是由于oracle数据库中在建表的时候TimeStamp类型的字段加上了 WITH LOCAL TIME ZONE的条件,所以在取日期类型的值时需要设置Time Zone. 但是找了很久都没有发现mybatis的配置中有关于Session Time Zone的配置。最终发现sessionTimeZone的设置在oracle.jdbc.OracleConnection中。于是考虑到可以将connection向下转型成oracle.jdbc.OracleConnection。经过搜索发现可以通过

SqlSessionFactory.getConfiguration().getEnvironment()
					.getDataSource().getConnection();

中可以拿到connection,但是最终却发现这个connection对象是个代理对象,强制转换成oracle.jdbc.OracleConnection时就会抛出类型转换的异常。如此将问题解决的对象转移到如何拿到oracle.jdbc.OracleConnection对象,最终在网上找到一篇相关文章,可以使用org.apache.ibatis.datasource.pooled.PooledDataSource的静态方法unwrapConnection(Connection conn)获得real connection 对象。如此即可强制转换成oracle.jdbc.OracleConnection之后再对sessionTimeZone进行设置。设置方式如下:

((OracleConnection) realConn).setSessionTimeZone(TimeZone
					.getDefault().getID())

但是很遗憾的是,这个静态方法在当前mybatis最新办3.1.1版本中还有问题存在,它返回的依然是个代理对象(详见:http://code.google.com/p/mybatis/issues/detail?id=591)。所以也只能等以后版本的更新了。如果大家有更好的办法set session time zone的话,希望能跟我分享一下,谢谢!!

注:在mybatis将这个bug修复前,应该可以通过connection.createStatement().getConnection()拿到real connection


今天又发现一种方式,可以使用java.sql.Connection.unwrap(Class)方法拿到real connection. 不过如果驱动包使用的是classes12.jar是不行的,估计是classes12.jar出现的时候java.sql.Connection接口中没有unwrap方法。不过ojdbc6.jar这个驱动包是可用的,并且需要注意的是,setSessionTimeZone方法的调用需要在拿到mybatis的sqlSession之后再设置,在创建SqlSessionFactory之后设置是不起作用的。具体原因应该是只有在拿SqlSession的时候才会去跟数据库建立连接吧。而且由于配置连接池的缘故,所以每次都的手动设置,具体代码如下:

session.getConnection().unwrap(OracleConnection.class).setSessionTimeZone(TimeZone.getDefault().getID());



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java.lang.ExceptionInInitializerError at com.example.demo.MyBatisExampleDemoTest.test1(MyBatisExampleDemoTest.java:23) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may exist in SQL Mapper Configuration ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.datasource.DataSourceException: Unknown DataSource property: serverTimezone at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:52) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:36) at com.bosssoft.hr.train.j2se.mybatis.utils.MyBatisUtils.<clinit>(MyBatisUtils.java:27) ... 28 more Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.datasource.DataSourceException: Unknown DataSource property: serverTimezone at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:122) at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:99) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:50) ... 30 more Caused by: org.apache.ibatis.datasource.DataSourceException: Unknown DataSource property: serverTimezone at org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory.setProperties(UnpooledDataSourceFactory.java:55) at org.apache.ibatis.builder.xml.XMLConfigBuilder.dataSourceElement(XMLConfigBuilder.java:329) at org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement(XMLConfigBuilder.java:283) at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:117) ... 32 more
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值