文档章节

MyBatis自定义数据映射TypeHandler

三毛々
 三毛々
发布于 2013/05/29 11:00
字数 385
阅读 23511
收藏 5

在Mybatis的官方文档中说明了,框架内置的TypeHandler类型。请参见http://mybatis.github.io/mybatis-3/zh/configuration.html#typeHandlers

同时Mybatis支持自定义typeHandler。

例如:自定义了一个将Date存为毫秒时间的VARCHAR类型的TypeHandler


package demo;

public class CustomTimeStampHandler extends BaseTypeHandler<Date> {

	@Override
	public void setNonNullParameter(PreparedStatement ps, int i,
			Date parameter, JdbcType jdbcType) throws SQLException {
		ps.setString(i, String.valueOf(parameter.getTime()));
		
	}

	@Override
	public Date getNullableResult(ResultSet rs, String columnName)
			throws SQLException {
		String sqlTimestamp = rs.getString(columnName);
	    if (sqlTimestamp != null) {
	      return new Date(Long.parseLong(sqlTimestamp));
	    }
	    return null;
	}

	@Override
	public Date getNullableResult(ResultSet rs, int columnIndex)
			throws SQLException {
		String sqlTimestamp = rs.getString(columnIndex);
	    if (sqlTimestamp != null) {
	      return new Date(Long.parseLong(sqlTimestamp));
	    }
	    return null;
	}

	@Override
	public Date getNullableResult(CallableStatement cs, int columnIndex)
			throws SQLException {
		String sqlTimestamp = cs.getString(columnIndex);
	    if (sqlTimestamp != null) {
	      return new Date(Long.parseLong(sqlTimestamp));
	    }
	    return null;
	}

}
在Mybatis配置中注册该TypeHandler



<typeHandlers>
    <typeHandler handler="com.jd.jos.application.note.dao.CustomTimeStampHandler" 
        javaType="java.util.Date" jdbcType="VARCHAR"/>
</typeHandlers>


然后就在映射配置文件中使用该TypeHander了。

在resultMap的定义中对对应列定义typeHandler:


<resultMap type="Note" id="note-base">
    <result property="id" column="id" />
    <result property="updateTime" column="update_time" jdbcType="VARCHAR" javaType="Date" 
        typeHandler="demo.CustomTimeStampHandler"/>
</resultMap>


这里只能是在select的时候才会使用自定义的TypeHandler处理对应的映射关系,如果要在insert或者update时使用则需要在sql定义中添加相应的内容。如下:


<update id="updateRow" parameterType="Note">
    update note
    set update_time=#{updateTime, javaType=Date, jdbcType=VARCHAR}
    where id=#{id}
</update>


这样在update时,会将Date转换成毫秒时间。

在insert时,按照同样的处理方式即可。


在官方文档中看到其在update和insert的处理方式为

<update id="updateRow" parameterType="NoteBook">
    update note
    set update_time=#{updateTime,typeHandler=demo.CustomTimeStampHandler}
    where id=#{id}
</update>
但是我在测试时没有成功。







© 著作权归作者所有

共有 人打赏支持
三毛々
粉丝 16
博文 56
码字总数 33881
作品 0
成都
私信 提问
加载中

评论(7)

xuezhongyu01
xuezhongyu01

引用来自“数据之巅”的评论

别误人子弟了 局部全局你都没分清楚
什么意思,给说明一下吧,谢谢~
数据之巅
别误人子弟了 局部全局你都没分清楚
Skqing
Skqing

引用来自“阿桂爱清净”的评论

引用来自“3kqing”的评论

讲讲怎么直接返回List<User> 这样的集合, 而不是List<Map<String, Object>>
public abstract class AbsListTypeHandler extends BaseTypeHandler> {
}
@MappedJdbcTypes(value = {JdbcType.VARCHAR}, includeNullJdbcType = true)
public class ListBookTypeHandler extends AbsListTypeHandler {

@Override
public void setNonNullParameter(PreparedStatement ps, int i, List books, JdbcType jdbcType) throws SQLException {
ps.setString(i, JSON.toJSONString(books));
}

@Override public List getNullableResult(ResultSet rs, String columnName) throws SQLException {
String source = rs.getString(columnName);
if (StringUtils.isBlank(source)) {
return Lists.newArrayListWithExpectedSize(0);
}

return JSON.parseArray(source, BookDO.class);
}

@Override public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String source = rs.getString(columnIndex);
if (StringUtils.isBlank(source)) {
return Lists.newArrayListWithExpecte

回复@阿桂爱清净 : ?
阿桂爱清净
阿桂爱清净
@MappedJdbcTypes(value = {JdbcType.VARCHAR}, includeNullJdbcType = true)
public class ListBookTypeHandler extends AbsListTypeHandler<BookDO> {

@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<BookDO> books, JdbcType jdbcType) throws SQLException {
ps.setString(i, JSON.toJSONString(books));
}

@Override public List<BookDO> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String source = rs.getString(columnName);
if (StringUtils.isBlank(source)) {
return Lists.newArrayListWithExpectedSize(0);
}

return JSON.parseArray(source, BookDO.class);
}

@Override public List<BookDO> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String source = rs.getString(columnIndex);
if (StringUtils.isBlank(source)) {
return Lists.newArrayListWithExpectedSize(0);
}

return JSON.parseArray(source, BookDO.class);
}
阿桂爱清净
阿桂爱清净

引用来自“3kqing”的评论

讲讲怎么直接返回List<User> 这样的集合, 而不是List<Map<String, Object>>
public abstract class AbsListTypeHandler extends BaseTypeHandler> {
}
@MappedJdbcTypes(value = {JdbcType.VARCHAR}, includeNullJdbcType = true)
public class ListBookTypeHandler extends AbsListTypeHandler {

@Override
public void setNonNullParameter(PreparedStatement ps, int i, List books, JdbcType jdbcType) throws SQLException {
ps.setString(i, JSON.toJSONString(books));
}

@Override public List getNullableResult(ResultSet rs, String columnName) throws SQLException {
String source = rs.getString(columnName);
if (StringUtils.isBlank(source)) {
return Lists.newArrayListWithExpectedSize(0);
}

return JSON.parseArray(source, BookDO.class);
}

@Override public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String source = rs.getString(columnIndex);
if (StringUtils.isBlank(source)) {
return Lists.newArrayListWithExpecte
JacarriChan
JacarriChan
  <typeHandlers>
    <typeHandler handler="com.mybatis3.util.HexByteTypeHandler" javaType="byte[]" jdbcType="VARCHAR" />
  </typeHandlers>


  <resultMap type="Student" id="StudentResult">
    <result property="name" column="name"/>
    <result property="content" column="content" javaType="byte[]" jdbcType="VARCHAR"/>
  </resultMap>

  <insert id="insertStudent" parameterType="Student">
    INSERT INTO STUDENTS(content) VALUES(#{content,javaType=byte[],jdbcType=VARCHAR})
  </insert>

这样配置后,查询和新增皆可调用自定义TypeHandler
Skqing
Skqing
讲讲怎么直接返回List<User> 这样的集合, 而不是List<Map<String, Object>>
12.平凡之路-自定义数据类型转换

胖先森 MyBatis数据类型转换,默认情况下MyBatis已经帮我们完成了很多的数据类型的转换,一般情况下我们直接使用即可,下面大概介绍一下 一 Java日期类型和Jdbc字符串类型转换 在做开发时,我们...

胖先森
2017/09/05
0
0
三、Spring Boot项目中MyBatis配置文件加载深度解析

一、MyBatis 配置文件解析入口 Spring Boot启动时,会去实例化jar包mybatis-spring-boot-autoconfigure-starter中MybatisAutoConfiguration中的配置bean,包括SqlSessionFactory、SqlSessio...

yangjianzhou
前天
0
0
mybatis(六)objectFactory、plugins、mappers简介与配置

上篇文章简单看了一下TypeHandler, 本次将结束对于mybatis的配置文件的学习, 本次涉及到剩下没提及到的几个节点的配置:objectFactory、databaseIdProvider、plugins、mappers。 那么,接下...

LCZ777
2014/12/19
0
0
mybatis(五)TypeHandler简介及配置(mybatis源码篇)

上篇文章为大家介绍了mybatis中别名的使用,以及其源码。本篇将为大家介绍TypeHandler, 并简单分析其源码。 Mybatis中的TypeHandler是什么?   无论是 MyBatis 在预处理语句(PreparedSta...

LCZ777
2014/12/19
0
0
Mybatis3.3.x技术内幕(十二):Mybatis之TypeHandler

Mybatis中的TypeHandler有两个功能,一个是完成javaType至jdbcType的转换,另外一个是完成jdbcType至javaType的转换。 public interface TypeHandler<T> { void setParameter(PreparedStatem......

祖大俊
2016/05/06
991
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 集成 Swagger,生成接口文档就这么简单!

之前的文章介绍了《推荐一款接口 API 设计神器!》,今天栈长给大家介绍下如何与优秀的 Spring Boot 框架进行集成,简直不能太简单。 你所需具备的基础 告诉你,Spring Boot 真是个牛逼货! ...

Java技术栈
24分钟前
3
0
一个简单的js作用域题目(原创)

var name = 'nnmm' var obj = { name: 'name1', func: () => { console.log(this.name) }, func1: function (){ console.log(this.name) }, son: { ......

boogoogle
27分钟前
2
0
SSM整合activeMQ/activeMQ配置

一、引入依赖 <!-- xbean 如<amq:connectionFactory /> -->    <dependency>        <groupId>org.apache.xbean</groupId>        <artifactId>xbean-spring</artifac......

嘴角轻扬30
31分钟前
2
0
小公司出身的程序员,面试咋这么难?!

小公司出身,被大厂竞争者 KO 以下是一个非常真实的案例,是一个大厂工程师和一个小公司工程师同时求职一个独角兽公司的职位的经历。 一个是985本科学历,出身互联网大厂,四五年经验的样子。...

编程SHA
37分钟前
2
0
揭秘:蚂蚁金服bPaaS究竟是什么?

摘要: 分布式金融核心套件,蚂蚁金服bPaaS究竟是什么东东? 文/图 孙浩峰 去年9月,蚂蚁金服在杭州云栖ATEC发布了分布式金融核心套件bPaaS( Business Platform As a Service ),对外开放自...

阿里云官方博客
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部