waysun一路陽光

          不輕易服輸,不輕言放棄.--心是夢的舞臺,心有多大,舞臺有多大。踏踏實實做事,認認真真做人。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            167 隨筆 :: 1 文章 :: 64 評論 :: 0 Trackbacks
          <2014年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          公告

          開啟一扇窗,給自己一個舞臺!

          QQ:251218333,82424805
          MSN:CF1504@Hotmail.com
          E-mail:yyk1504@163.com

          �ڷQ���a�K�O�p�ƾ��ڷQ���a�K�O�p�ƾ��ڷQ���a�K�O�p�ƾ��ڷQ���a�K�O�p�ƾ��ڷQ���a�K�O�p�ƾ��ڷQ���a�K�O�p�ƾ�位來訪者

          常用鏈接

          隨筆分類(189)

          隨筆檔案(160)

          文章分類(1)

          AJAX

          搜索

          積分與排名

          最新隨筆

          最新評論

          轉自:http://blog.csdn.net/zhy0511/article/details/8262634

          最近在寫一個項目,持久層想用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。經過搜索發現可以通過

          1. SqlSessionFactory.getConfiguration().getEnvironment()  
          2.                     .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進行設置。設置方式如下:

          1. ((OracleConnection) realConn).setSessionTimeZone(TimeZone  
          2.                     .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的時候才會去跟數據庫建立連接吧。而且由于配置連接池的緣故,所以每次都的手動設置,具體代碼如下:

          1. session.getConnection().unwrap(OracleConnection.class).setSessionTimeZone(TimeZone.getDefault().getID());  我的解決方法是在查詢時將TimeStamp類型字段
            進行字符串轉換,to_char(t.BRH_TIMESTAMP,'yyyy-MM-dd HH24:MI:SS'),
          posted on 2014-04-30 10:11 weesun一米陽光 閱讀(991) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 梁山县| 滦南县| 克什克腾旗| 施秉县| 酉阳| 阳新县| 河北区| 亳州市| 修武县| 中西区| 马尔康县| 伊宁市| 莱西市| 东兴市| 黎川县| 南丹县| 万宁市| 信阳市| 吉安市| 建宁县| 海兴县| 成都市| 淮北市| 武川县| 灵寿县| 上思县| 稷山县| 长顺县| 依兰县| 壤塘县| 怀安县| 仪陇县| 苏尼特右旗| 维西| 六安市| 新野县| 平果县| 惠水县| 兴仁县| 汉中市| 台中县|