Mybatis的類型轉換接口TypeHandler
前言:
mybatis可以實現jdbc類型和java類型之間的轉換,具體來說有一個類型轉換器的接口
類型處理器接口TypeHandler
public interface TypeHandler<T> { void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException; /** * @param columnName Colunm name, when configuration <code>useColumnLabel</code> is <code>false</code> */ T getResult(ResultSet rs, String columnName) throws SQLException; T getResult(ResultSet rs, int columnIndex) throws SQLException; T getResult(CallableStatement cs, int columnIndex) throws SQLException; }
類型處理器BaseTypeHandler
jdbc類型轉為java類型
BaseTypeHandler實現瞭TypeHandler接口,實現瞭setParameter()方法:
@Override public void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException { if (parameter == null) { if (jdbcType == null) { throw new TypeException("JDBC requires that the JdbcType must be specified for all nullable parameters."); } try { ps.setNull(i, jdbcType.TYPE_CODE); } catch (SQLException e) { throw new TypeException("Error setting null for parameter #" + i + " with JdbcType " + jdbcType + " . " + "Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. " + "Cause: " + e, e); } } else { try { setNonNullParameter(ps, i, parameter, jdbcType); } catch (Exception e) { throw new TypeException("Error setting non null for parameter #" + i + " with JdbcType " + jdbcType + " . " + "Try setting a different JdbcType for this parameter or a different configuration property. " + "Cause: " + e, e); } } }
這個方法中就是設置PreparedStatement的參數,也是參數綁定,將jdbcType轉為Java類型,setNonNullParameter是抽象方法,根據不同的參數類型有不同的類實現瞭這個方法,比如
LongTypeHandler實現的setNonNullParameter()方法:
@Override public void setNonNullParameter(PreparedStatement ps, int i, Long parameter, JdbcType jdbcType) throws SQLException { ps.setLong(i, parameter); }
java類型轉為jdbc類型
BaseTypeHandler的getResult()方法:
@Override public T getResult(CallableStatement cs, int columnIndex) throws SQLException { try { return getNullableResult(cs, columnIndex); } catch (Exception e) { throw new ResultMapException("Error attempting to get column #" + columnIndex + " from callable statement. Cause: " + e, e); } }
方法也比較簡單,直接調用瞭getNullableResult抽象類,功能就是從ResultSet中獲取數據,把Java類型轉換為JdbcType類型,比如LongTypeHandler實現的getNullableResult():
@Override public Long getNullableResult(ResultSet rs, String columnName) throws SQLException { long result = rs.getLong(columnName); return result == 0 && rs.wasNull() ? null : result; }
通過源碼分析我們知道瞭TypeHandler接口的作用就是用來實現類型轉換的,mybatis在初始化的時候就獲取TypeHandler,然後創建TypeHandler實例註冊到TypeHandlerRegistry中,由TypeHandlerRegistry來進行管理這些實例,下篇文章中我們介紹一下TypeHandlerRegistry這個類
總結
文章講瞭Mybatis的類型轉換接口TypeHandler和它的實現類BaseTypeHandler,類型轉換接口顯然就是實現jdbc類型和java類型之間的轉換,同時分析瞭BaseTypeHandler的setParameter()方法和getResult()方法,getNullableResult是抽象類,具體方法由其他實現類進行實現。
到此這篇關於Mybatis的類型轉換接口TypeHandler的文章就介紹到這瞭,更多相關Mybatis類型轉換內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- MyBatisPlus TypeHandler自定義字段類型轉換Handler
- 解決mybatis plus字段為null或空字符串無法保存到數據庫的問題
- Mybatis的TypeHandler加解密數據實現
- Java中的BaseTypeHandler自定義類型轉換器的使用
- java mybatis如何操作postgresql array數組類型