最近在学习MyBatis的相关内容,接触到了TypeHandle,在此之前,对于MyBatis的认识仅仅只停留在了会用的阶段,写代码只是知道写个mapper,写个xml,至于查询出数据怎么映射到resultMap,resultType中去,并没有太深入了解。
什么是typeHandle
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理。
TypeHandle作用
实现一个简单的自定义TypeHandler
1、创建一个自定义的typeHandler类
@MappedJdbcTypes(JdbcType.VARCHAR) 指定转换之后的数据类型
@MappedTypes({Date.class}) 指定要被转换的类型
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes({Date.class})
public class MyTypeHandler extends BaseTypeHandler<Date> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Date date, JdbcType jdbcType) throws SQLException {
ps.setString(i, String.valueOf(date.getTime()));
}
@Override
public Date getNullableResult(ResultSet rs, String s) throws SQLException {
return new Date(rs.getLong(s));
}
@Override
public Date getNullableResult(ResultSet rs, int i) throws SQLException {
return new Date(rs.getLong(i));
}
@Override
public Date getNullableResult(CallableStatement cs, int i) throws SQLException {
return cs.getDate(i);
}
}
2、mapper
public interface TestMapper {
User getById();
void insertUser(User user);
}
3、mapper.xml
<resultMap id="TestMap" type="com.demo.entity.User" >
<id column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="age" jdbcType="INTEGER" property="age" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" typeHandler="com.demo.mydate.MyTypeHandler" />
</resultMap>
<insert id="insertUser" parameterType="com.demo.entity.User">
INSERT INTO user(id,name,age, create_time) VALUES (#{id}, #{name}, #{age},#{createTime,javaType=Date,jdbcType=VARCHAR,typeHandler=com.demo.mydate.MyTypeHandler})
</insert>
4、在这里需要指定自定义TypeHandler类的包路径,我这里是用的springboot框架,所以在配置文件中进行配置。
mybatis:
type-aliases-package: com.demo.entity
#自定义typeHandler类包路径
type-handlers-package: com.demo.mydate
mapper-locations: classpath:mapping/*.xml
configuration:
map-underscore-to-camel-case: true