1 16 17 package org.springframework.orm.ibatis.support; 18 19 import java.io.IOException ; 20 import java.sql.CallableStatement ; 21 import java.sql.PreparedStatement ; 22 import java.sql.ResultSet ; 23 import java.sql.SQLException ; 24 25 import com.ibatis.sqlmap.engine.type.BaseTypeHandler; 26 27 import org.springframework.jdbc.datasource.DataSourceUtils; 28 import org.springframework.jdbc.support.lob.LobCreator; 29 import org.springframework.jdbc.support.lob.LobHandler; 30 import org.springframework.orm.ibatis.SqlMapClientFactoryBean; 31 import org.springframework.transaction.support.TransactionSynchronizationAdapter; 32 import org.springframework.transaction.support.TransactionSynchronizationManager; 33 34 50 public abstract class AbstractLobTypeHandler extends BaseTypeHandler { 51 52 58 public static final int LOB_CREATOR_SYNCHRONIZATION_ORDER = 59 DataSourceUtils.CONNECTION_SYNCHRONIZATION_ORDER - 200; 60 61 private LobHandler lobHandler; 62 63 64 69 public AbstractLobTypeHandler() { 70 this(SqlMapClientFactoryBean.getConfigTimeLobHandler()); 71 } 72 73 76 protected AbstractLobTypeHandler(LobHandler lobHandler) { 77 if (lobHandler == null) { 78 throw new IllegalStateException ("No LobHandler found for configuration - " + 79 "lobHandler property must be set on SqlMapClientFactoryBean"); 80 } 81 this.lobHandler = lobHandler; 82 } 83 84 85 91 public final void setParameter(PreparedStatement ps, int i, Object parameter, String jdbcType) 92 throws SQLException { 93 94 if (!TransactionSynchronizationManager.isSynchronizationActive()) { 95 throw new IllegalStateException ("Spring transaction synchronization needs to be active for " + 96 "setting values in iBATIS TypeHandlers that delegate to a Spring LobHandler"); 97 } 98 final LobCreator lobCreator = this.lobHandler.getLobCreator(); 99 try { 100 setParameterInternal(ps, i, parameter, jdbcType, lobCreator); 101 } 102 catch (IOException ex) { 103 throw new SQLException ("I/O errors during LOB access: " + ex.getMessage()); 104 } 105 106 TransactionSynchronizationManager.registerSynchronization( 107 new LobCreatorSynchronization(lobCreator)); 108 } 109 110 116 public final Object getResult(ResultSet rs, String columnName) throws SQLException { 117 return getResult(rs, rs.findColumn(columnName)); 118 } 119 120 125 public final Object getResult(ResultSet rs, int columnIndex) throws SQLException { 126 try { 127 return getResultInternal(rs, columnIndex, this.lobHandler); 128 } 129 catch (IOException ex) { 130 throw new SQLException ( 131 "I/O errors during LOB access: " + ex.getClass().getName() + ": " + ex.getMessage()); 132 } 133 } 134 135 139 public Object getResult(CallableStatement cs, int columnIndex) throws SQLException { 140 throw new SQLException ("Retrieving LOBs from a CallableStatement is not supported"); 141 } 142 143 144 154 protected abstract void setParameterInternal( 155 PreparedStatement ps, int index, Object value, String jdbcType, LobCreator lobCreator) 156 throws SQLException , IOException ; 157 158 167 protected abstract Object getResultInternal(ResultSet rs, int index, LobHandler lobHandler) 168 throws SQLException , IOException ; 169 170 171 176 private static class LobCreatorSynchronization extends TransactionSynchronizationAdapter { 177 178 private final LobCreator lobCreator; 179 180 public LobCreatorSynchronization(LobCreator lobCreator) { 181 this.lobCreator = lobCreator; 182 } 183 184 public int getOrder() { 185 return LOB_CREATOR_SYNCHRONIZATION_ORDER; 186 } 187 188 public void beforeCompletion() { 189 this.lobCreator.close(); 190 } 191 } 192 193 } 194 | Popular Tags |