IbatisSqlMapSessionFactory.java
上传用户:liangcc
上传日期:2019-05-24
资源大小:4412k
文件大小:4k
源码类别:

WEB邮件程序

开发平台:

Java

  1. package com.softeem.ibatis3;
  2. import java.io.IOException;
  3. import java.io.Reader;
  4. import java.sql.SQLException;
  5. import com.ibatis.common.resources.Resources;
  6. import com.ibatis.sqlmap.client.SqlMapClient;
  7. import com.ibatis.sqlmap.client.SqlMapClientBuilder;
  8. import com.ibatis.sqlmap.client.SqlMapException;
  9. import com.ibatis.sqlmap.client.SqlMapSession;
  10. /**
  11.  * 创建SqlMapClient对象的工厂
  12.  * 
  13.  * @author JianChen
  14.  * 
  15.  */
  16. public class IbatisSqlMapSessionFactory {
  17. // 配置文件路径
  18. private static String CONFIG_FILE_LOCATION = "SqlMapConfig.xml";
  19. // 在线程中保护本地变量
  20. private final static ThreadLocal<SqlMapClient> threadLocalClient = new ThreadLocal<SqlMapClient>();
  21. //在线程中保护本地变量
  22. private final static ThreadLocal<SqlMapSession> threadLocalSession = new ThreadLocal<SqlMapSession>();
  23. // 备份(由于CONFIG_FILE_LOCATION这个静态变量,有可能在外面供系统显示,
  24. // 如:系统配置信息
  25. // 而其他线程又需要这个变量的值作为参数进行工作,如果在某个特定的场合一不小心修改这个静态变量的值
  26. // 就会导致正个应用程序崩溃
  27. // )
  28. private static String configFile = CONFIG_FILE_LOCATION;
  29. private static Reader reader;
  30. public IbatisSqlMapSessionFactory() {
  31. }
  32. // static {
  33. // try {
  34. // reader = Resources.getResourceAsReader(configFile);
  35. // } catch (IOException e) {
  36. // System.err.println("%%%% Error Geting Reader ! %%%%");
  37. // }
  38. // }
  39. /**
  40.  * 获得SqlMapClient对象
  41.  * 
  42.  * @return
  43.  * @throws SQLException
  44.  */
  45. public static SqlMapClient getSqlMapClient() throws SqlMapException{
  46. try {
  47. reader = Resources.getResourceAsReader(configFile);
  48. } catch (IOException e) {
  49. e.printStackTrace();
  50. }
  51. // 用本地变量保护的形式去拿SqlMapClient
  52. SqlMapClient client = threadLocalClient.get();
  53. if (client == null && !isExistCurrentConnectionBySqlMapClient(client)) {
  54. // 生成SqlMapClient
  55. client = SqlMapClientBuilder.buildSqlMapClient(reader);
  56. // 保护起来
  57. threadLocalClient.set(client);
  58. }
  59. return client;
  60. }
  61. /**
  62.  * 判断当前Client是否存在连接
  63.  * 
  64.  * @param client
  65.  * @return
  66.  */
  67. public static boolean isExistCurrentConnectionBySqlMapClient(
  68. SqlMapClient client) {
  69. try {
  70. return client != null ? (client.getCurrentConnection() != null ? true
  71. : false)
  72. : false;
  73. } catch (SQLException e) {
  74. System.err.println("%%%% Error Geting Current Connection ! %%%%");
  75. }
  76. return false;
  77. }
  78. /**
  79.  * 关闭连接
  80.  */
  81. public static void coloseClient() {
  82. SqlMapClient client = (SqlMapClient) threadLocalClient.get();
  83. threadLocalClient.set(null);
  84. if (client != null) {
  85. try {
  86. if (client.getCurrentConnection() != null
  87. && !client.getCurrentConnection().isClosed()) {
  88. client.getCurrentConnection().close();
  89. }
  90. } catch (SQLException e) {
  91. e.printStackTrace();
  92. }
  93. }
  94. }
  95. /**
  96.  * 获得SqlMapSession对象
  97.  * @return
  98.  * @throws SqlMapException
  99.  */
  100. public static SqlMapSession getSqlMapSession() throws SqlMapException{
  101. SqlMapClient client = getSqlMapClient();
  102. SqlMapSession session = threadLocalSession.get();
  103. if(client!=null && session==null){
  104. session = client.openSession();
  105. threadLocalSession.set(session);
  106. }
  107. return session;
  108. }
  109. /**
  110.  * 关闭SqlMapSession
  111.  */
  112. public static void coloseSqlMapSession(){
  113. SqlMapSession session = threadLocalSession.get();
  114. threadLocalSession.set(null);
  115. if(session!=null){
  116. session.close();
  117. }
  118. }
  119. /**
  120.  * 提供一个静态方法供外面拿到此Reader对象 开发人员可以定制或修改拿到的SqlMapClient 便于程序的可扩展
  121.  * 
  122.  * @return
  123.  */
  124. public static Reader getReader() {
  125. return reader;
  126. }
  127. }