MyBatis在设置参数或者从结果集中获取参数的时候,都会用到注册了的typeHandler进行处理。typeHandler的作用为将参数从javaType转为jdbcType,或者从数据库取出结果时把jdbcType转为javaType。
带的typeHandler
类型处理器 | Java类型 | JDBC类型 |
BooleanTypeHandler | java.lang.Boolean,boolean | 数据库兼容的BOOLEAN |
ByteTypeHandler | java.lang.Byte,byte | 数据库兼容的NUMERIC或BYTE |
ShortTypeHandler | java.lang.Short,short | 数据库兼容的NUMERIC或SHORT INTEGER |
IntegerTypeHandler | java.lang.Integer,int | 数据库兼容的NUMERIC或INTEGER |
LongTypeHandler | java.lang.Long,long | 数据库兼容的NUMERIC或LONG INTEGER |
FloatTypeHandler | java.lang.Float,float | 数据库兼容的NUMERIC或FLOAT |
DoubleTypeHandler | java.lang.Double,double | 数据库兼容的NUMERIC或DOUBLE |
BigDecimalTypeHandler | java.math.BigDecimal | 数据库兼容的NUMERIC或DECIMAL |
StringTypeHandler | java.lang.Stirng | CHAR,VARCHAR |
ClobypeHandler | java.lang.String | CLOB,LONGVARCHAR |
NStringTypeHanler | java.lang.String | NVARCHAR,NCHAR |
NClobTypeHandler | java.lang.String | NNCLOB |
ByteArrayTypeHandler | byte[] | 数据库兼容的字节流类型 |
BlobTypeHandler | byte[] | BLOB,LONGVARBINARY |
DateTypeHandler | java.util.Date | TIMESTAMP |
DateOnlyTypeHandler | java.util.Date | DATE |
TimeOnlyTypeHandler | java.util.Date | TIME |
SqlTimestampTypeHandler | java.sql.Timestamp | TIMESTAMP |
SqlDateTypeHandler | java.sql.Date | DATE |
SqlTimeTypeHandler | java.sql.Time | TIME |
ObjectTypeHandler | Any | OTHER或未指定类型 |
EnumTypeHandler | Enumeration Type | VARCHAR或任意兼容的字符串类型,存 储枚举的名称 |
EnumOrdinalTypeHandler | Enumeration Type | 任何兼容的NUMERIC或DOUBLE类型, 存储枚举的索引 |
为了演示自带的typeHandler,新建一张表:
1 | CREATE TABLE `t_role` ( |
库表对应的实体类Role略。
接口RoleMapper中定义一个createRole()抽象方法:
1 | public int createRole(Role role); |
映射文件:
1 | <insert id="createRole" parameterType="role"> |
测试插入方法:
1 | ...... |
查询数据库:
1 | mysql> select * from t_role; |
从结果中可以看出,默认的BooleantypeHandler将true转换为了1。
如果想把true转换为Y,false转换为N,我们可以自定义BooleantypeHandler。
自定义typeHandler
自定义typeHandler可以通过继承BasetypeHandler或者实现typeHandler接口来实现,现自定义一个BooleanTypeHandler:
1 | package mrbird.leanote.typehandler; |
在mybatis-config.xml文件中配置该typeHandler:
1 | <typeHandlers> |
然后在映射文件中对需要转换的字段标注javaType和jdbcType,或者无需在mybatis-config.xml中注册直接在映射文件中指明typeHandler的路径即可。
指明javaType和jdbcType,与注册中的一致即可找到相对应的typeHandler:
1 | <insert id="createRole" parameterType="role"> |
或指明typeHandler路径:
1 | <insert id="createRole" parameterType="role"> |
测试:
1 | ...... |
查询数据库:
1 | mysql> select * from t_role; |
可发现,false已经转换为N了。
枚举类型typeHandler
MyBatis自带两种枚举类型处理器:
1.org.apache.ibatis.type.EnumOrdinalTypeHandler
2.org.apache.ibatis.type.EnumTypeHandler
EnumOrdinalTypeHandler使用整数下标传递,EnumTypeHandler使用枚举字符串传递。
创建一个枚举类型Sex:
1 | package mrbird.leanote.enums; |
EnumOrdinalTypeHandler
创建一张表来演示EnumOrdinalTypeHandler:
1 | CREATE TABLE `t_student` ( |
这里sex字段类型为tinyint类型。
Student实体类略。
定义一个interface:
1 | package mrbird.leanote.mapper; |
对应的映射文件StudentMapper.xml:
1 |
|
测试createStudent方法:
1 | ... |
查询数据库:
1 | mysql> select * from t_student; |
可见EnumOrdinalTypeHandler已经将MALE转换为了MALE的下标了。
测试getAllStudent方法:
1 | ... |
控制台输出:
1 | 鸣人性别:MALE |
EnumTypeHandler
为了演示EnumTypeHandler,我们需要把sex字段类型改为VARCHAR:
1 | alter table t_student modify column sex VARCHAR(20); |
修改映射文件中的typeHandler:
1 |
|
测试createStudent方法:
1 | ... |
查询数据库:
1 | mysql> select * from t_student where selfcard_no = '2'; |
可见EnumTypeHandler保存的是枚举字符串。