BaseTypeHandler.java

  1. /*
  2.  *    Copyright 2009-2021 the original author or authors.
  3.  *
  4.  *    Licensed under the Apache License, Version 2.0 (the "License");
  5.  *    you may not use this file except in compliance with the License.
  6.  *    You may obtain a copy of the License at
  7.  *
  8.  *       http://www.apache.org/licenses/LICENSE-2.0
  9.  *
  10.  *    Unless required by applicable law or agreed to in writing, software
  11.  *    distributed under the License is distributed on an "AS IS" BASIS,
  12.  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  *    See the License for the specific language governing permissions and
  14.  *    limitations under the License.
  15.  */
  16. package org.apache.ibatis.type;

  17. import java.sql.CallableStatement;
  18. import java.sql.PreparedStatement;
  19. import java.sql.ResultSet;
  20. import java.sql.SQLException;

  21. import org.apache.ibatis.executor.result.ResultMapException;
  22. import org.apache.ibatis.session.Configuration;

  23. /**
  24.  * The base {@link TypeHandler} for references a generic type.
  25.  * <p>
  26.  * Important: Since 3.5.0, This class never call the {@link ResultSet#wasNull()} and
  27.  * {@link CallableStatement#wasNull()} method for handling the SQL {@code NULL} value.
  28.  * In other words, {@code null} value handling should be performed on subclass.
  29.  * </p>
  30.  *
  31.  * @author Clinton Begin
  32.  * @author Simone Tripodi
  33.  * @author Kzuki Shimizu
  34.  */
  35. public abstract class BaseTypeHandler<T> extends TypeReference<T> implements TypeHandler<T> {

  36.   /**
  37.    * @deprecated Since 3.5.0 - See https://github.com/mybatis/mybatis-3/issues/1203. This field will remove future.
  38.    */
  39.   @Deprecated
  40.   protected Configuration configuration;

  41.   /**
  42.    * Sets the configuration.
  43.    *
  44.    * @param c
  45.    *          the new configuration
  46.    * @deprecated Since 3.5.0 - See https://github.com/mybatis/mybatis-3/issues/1203. This property will remove future.
  47.    */
  48.   @Deprecated
  49.   public void setConfiguration(Configuration c) {
  50.     this.configuration = c;
  51.   }

  52.   @Override
  53.   public void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
  54.     if (parameter == null) {
  55.       if (jdbcType == null) {
  56.         throw new TypeException("JDBC requires that the JdbcType must be specified for all nullable parameters.");
  57.       }
  58.       try {
  59.         ps.setNull(i, jdbcType.TYPE_CODE);
  60.       } catch (SQLException e) {
  61.         throw new TypeException("Error setting null for parameter #" + i + " with JdbcType " + jdbcType + " . "
  62.               + "Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. "
  63.               + "Cause: " + e, e);
  64.       }
  65.     } else {
  66.       try {
  67.         setNonNullParameter(ps, i, parameter, jdbcType);
  68.       } catch (Exception e) {
  69.         throw new TypeException("Error setting non null for parameter #" + i + " with JdbcType " + jdbcType + " . "
  70.               + "Try setting a different JdbcType for this parameter or a different configuration property. "
  71.               + "Cause: " + e, e);
  72.       }
  73.     }
  74.   }

  75.   @Override
  76.   public T getResult(ResultSet rs, String columnName) throws SQLException {
  77.     try {
  78.       return getNullableResult(rs, columnName);
  79.     } catch (Exception e) {
  80.       throw new ResultMapException("Error attempting to get column '" + columnName + "' from result set.  Cause: " + e, e);
  81.     }
  82.   }

  83.   @Override
  84.   public T getResult(ResultSet rs, int columnIndex) throws SQLException {
  85.     try {
  86.       return getNullableResult(rs, columnIndex);
  87.     } catch (Exception e) {
  88.       throw new ResultMapException("Error attempting to get column #" + columnIndex + " from result set.  Cause: " + e, e);
  89.     }
  90.   }

  91.   @Override
  92.   public T getResult(CallableStatement cs, int columnIndex) throws SQLException {
  93.     try {
  94.       return getNullableResult(cs, columnIndex);
  95.     } catch (Exception e) {
  96.       throw new ResultMapException("Error attempting to get column #" + columnIndex + " from callable statement.  Cause: " + e, e);
  97.     }
  98.   }

  99.   public abstract void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;

  100.   /**
  101.    * Gets the nullable result.
  102.    *
  103.    * @param rs
  104.    *          the rs
  105.    * @param columnName
  106.    *          Column name, when configuration <code>useColumnLabel</code> is <code>false</code>
  107.    * @return the nullable result
  108.    * @throws SQLException
  109.    *           the SQL exception
  110.    */
  111.   public abstract T getNullableResult(ResultSet rs, String columnName) throws SQLException;

  112.   public abstract T getNullableResult(ResultSet rs, int columnIndex) throws SQLException;

  113.   public abstract T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException;

  114. }