mybatis之TypeHandler学习记录
TypeHandler介绍
TypeHandler,中文名字类型转换器,可以实现Java类型与jdbc类型的转换。mybatis使用prepareStatement来进行参数设置的时候,需要通过typeHandler将传入的java参数设置成合适的jdbc类型参数,这个过程实际上是通过调用PrepareStatement不同的set方法实现的。
同时,mybatis也内置了一些类型转换器。
Java类型 | jdbc类型 | Mybatis |
---|---|---|
boolean | bit、boolean | BooleanTypeHandler |
byte | TINYINT | ByteTypeHandler |
short | SMALLINT | ShortTypeHandler |
String | CHAR、VARCHAR | StringTypeHandler |
Integer | IntegerTypeHandler | |
long | LongTypeHandler | |
Float | FloatTypeHandler | |
double | DoubleTypeHandler |
自定义类型转换器
除了上述的TypeHandler,Mybatis也可以自定义类型转换器。
自定义类型转换器需要执行以下操作:
- 新建一个实现类,继承BaseTypeHandler类,BaseTypeHandler<T> 泛型是需要转换的Java类。
- 实现继承类的方法
- 在sql映射文件中编写类型转换器的实现类的位置。
下面写一个demo,实现Date类转换为jdbc的int。
Java实现类:
package com.mybatis.handler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
public class DateTypeHandler extends BaseTypeHandler<Date> {
//将java类型转换为数据库类型
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
//获取毫秒数
long time = date.getTime();
//设置为毫秒数
preparedStatement.setLong(i,time);
}
//将数据库类型转换为java类型
@Override
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
long birthday = resultSet.getLong(s);
Date date = new Date(birthday);
return date;
}
//将数据库类型转换为java类型
@Override
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
long birthday = resultSet.getLong(i);
Date date = new Date(birthday);
return date;
}
//将数据库类型转换为java类型
@Override
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
long birthday = callableStatement.getLong(i);
Date date = new Date(birthday);
return date;
}
}
xml文件:
<!--自定义类型处理器-->
<typeHandlers>
<typeHandler handler="com.mybatis.handler.DateTypeHandler"/>
</typeHandlers>