mybatis set session time zone

本文详细介绍了在使用MyBatis进行持久层开发时遇到的SessionTimeZone未设置导致的异常问题,通过获取OracleConnection对象并设置SessionTimeZone属性解决了该问题。同时讨论了在不同驱动包版本下获取真实连接的方法,并强调了在MyBatis修复前的临时解决方案。
最近在写一个项目,持久层想用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());



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值