MyBatis自定义类型转换器

本文介绍如何在MyBatis中实现自定义类型转换器,以解决数据库中的'Y'/'N'与Java布尔类型之间的转换问题,并提供具体的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求场景:当数据库中保存'Y'/'N',而对应bean字段的值的类型为boolean,这是就需要我们自定义类型转换器,在Mybatis执行SQL得到结果时,通过自定义类型转换器将CHAR或者VARCHAR2类型转换为boolean类型,Java代码如下:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.   
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.mangocity.btms.dynamicfield.util;  
  2.   
  3. import org.apache.ibatis.type.JdbcType;  
  4. import org.apache.ibatis.type.TypeHandler;  
  5. import org.apache.log4j.Logger;  
  6.   
  7. import java.sql.CallableStatement;  
  8. import java.sql.PreparedStatement;  
  9. import java.sql.ResultSet;  
  10. import java.sql.SQLException;  
  11.   
  12. /** 
  13.  * @author afei 
  14.  * java中的boolean和jdbc中的char之间转换;true-Y;false-N 
  15.  */  
  16. public class mangoBooleanTypeHandler implements TypeHandler<Boolean> {  
  17.     private static final Logger logger = Logger.getLogger(mangoBooleanTypeHandler.class) ;  
  18.   
  19.     /** 
  20.      * 用于定义在Mybatis设置参数时该如何把Java类型的参数转换为对应的数据库类型 
  21.      * @param preparedStatement 当前的PreparedStatement对象 
  22.      * @param i 当前参数的位置 
  23.      * @param b 当前参数的Java对象 
  24.      * @param jdbcType 当前参数的数据库类型 
  25.      * @throws SQLException 
  26.      */  
  27.     public void setParameter(PreparedStatement preparedStatement, int i, Boolean b, JdbcType jdbcType) throws SQLException {  
  28.         if(b.equals(Boolean.TRUE)){  
  29.             preparedStatement.setString(i,"Y");  
  30.         }else{  
  31.             preparedStatement.setString(i,"N");  
  32.         }  
  33.     }  
  34.   
  35.     /** 
  36.      * 用于在Mybatis获取数据结果集时如何把数据库类型转换为对应的Java类型 
  37.      * @param resultSet 当前的结果集 
  38.      * @param columnName 当前的字段名称 
  39.      * @return 转换后的Java对象 
  40.      * @throws SQLException 
  41.      */  
  42.     public Boolean getResult(ResultSet resultSet, String columnName) throws SQLException {  
  43.         return tranferType(resultSet.getString(columnName)) ;  
  44.     }  
  45.   
  46.     /** 
  47.      * 用于在Mybatis通过字段位置获取字段数据时把数据库类型转换为对应的Java类型 
  48.      * @param resultSet 当前的结果集 
  49.      * @param i 当前字段的位置 
  50.      * @return 转换后的Java对象 
  51.      * @throws SQLException 
  52.      */  
  53.     public Boolean getResult(ResultSet resultSet, int i) throws SQLException {  
  54.         return tranferType(  resultSet.getString(i) );  
  55.     }  
  56.   
  57.     /** 
  58.      * 用于Mybatis在调用存储过程后把数据库类型的数据转换为对应的Java类型 
  59.      * @param callableStatement 当前的CallableStatement执行后的CallableStatement 
  60.      * @param columnIndex 当前输出参数的位置 
  61.      * @return 
  62.      * @throws SQLException 
  63.      */  
  64.     public Boolean getResult(CallableStatement callableStatement, int columnIndex) throws SQLException {  
  65.         return tranferType(callableStatement.getString(columnIndex));  
  66.     }  
  67.   
  68.     private Boolean tranferType(String s){  
  69.         if("Y".equalsIgnoreCase(s))  
  70.         {  
  71.             return Boolean.TRUE ;  
  72.         }else{  
  73.             return Boolean.FALSE;  
  74.         }  
  75.     }  
  76. }  

然后,在Mapper文件中,给需要转换的字段指定该类型转换器mangoBooleanTypeHandler(mangoBooleanTypeHandler为typeAlias,在Mybatis配置文件中定义):

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <resultMap id="customDynamicFieldValueType" type="dynamicFieldValueType">  
  2.         <result column="DYNAMIC_FIELD_ID"    property="dynamicFieldId" />  
  3.         <result column="DYNAMIC_FIELD_VALUE" property="dynamicFieldValue" />  
  4.         <result column="DYNAMIC_FIELD_LABEL" property="dynamicFieldLabel" />  
  5.         <result column="REQUIRED" property="required" typeHandler="mangoBooleanTypeHandler" />  
  6. </resultMap>  

 然后我们在Mybatis的配置文件中这样注册它:

Xml代码   收藏代码
  1. <typeHandlers>  
  2.    <typeHandler handler="com.tiantian.mybatis.handler.mangoBooleanTypeHandler"/>  
  3. </typeHandlers>  

 


参考:

https://my.oschina.net/kolbe/blog/508131

http://elim.iteye.com/blog/1847854

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值