java8以前的日期处理有多恶心,相信不少人都深有体会。与mabatis集成查询数据库中的日期字段映射为java日期类型或者字符型的时候,会多出一个".0"。当然可以自行处理。但是显得太不优雅。可以通过自定义一个数据类型转换器,来格式化。

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp; import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes; @MappedJdbcTypes(JdbcType.TIMESTAMP)
@MappedTypes(String.class)
public class TimeTypeHandler extends BaseTypeHandler<String>{ @Override
public String getNullableResult(ResultSet arg0, String arg1) throws SQLException {
Timestamp timestamp = arg0.getTimestamp(arg1);
return DateFormatUtils.format(timestamp, "yyyy-MM-dd HH:mm:ss");
} @Override
public String getNullableResult(ResultSet arg0, int arg1) throws SQLException {
return arg0.getString(arg1);
} @Override
public String getNullableResult(CallableStatement arg0, int arg1) throws SQLException {
return arg0.getString(arg1);
} @Override
public void setNonNullParameter(PreparedStatement arg0, int arg1, String arg2, JdbcType arg3) throws SQLException {
arg0.setString(arg1, arg2);
} }

如果是单独使用mybatis,在配置文件里加入

<typeHandlers>
<typeHandler handler="your.package.TimeTypeHandler"/>
</typeHandlers>

如果是和spring集成

先创建一个自定义转换器的bean

<bean id="typeHandler" class="yourpackage.TimeTypeHandler" />

然后在注入

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:mybatis/xxx/*Mapper.xml"/>
<property name="typeHandlers" ref="typeHandler"/>
</bean>

但是,由于java中的时间格式实在太恶心了。所以想把Date类型全部转换为LocatDate,LocalTime,LocalDateTime。对于LocalDateTime类型的数据,同样需要专门的转换器来处理。你当然可以自己实现一个。不过mybatis官方已经实现了。通过maven的方式引进项目中

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.0</version>
</dependency>

如果mybatis是3.4以上的版本,就可以直接使用了。如果是3.4以下的版本,那么还需要参照刚才上面的做法,将转换器注入mybatis中。

得到转换器的bean

<bean id="typeHandler" class="org.apache.ibatis.type.LocalDateTimeTypeHandler" />

然后注入

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:mybatis/xxx/*Mapper.xml"/>
<property name="typeHandlers" ref="typeHandler"/>
</bean>

mybatis实现自定义typeHandler的更多相关文章

  1. MyBatis使用自定义TypeHandler转换类型的实现方法

    From: http://www.manongjc.com/article/15577.html 这篇文章主要介绍了MyBatis使用自定义TypeHandler转换类型的实现方法,本文介绍使用Typ ...

  2. MyBatis使用自定义TypeHandler转换类型

    MyBatis虽然有很好的SQL执行性能,但毕竟不是完整的ORM框架,不同的数据库之间SQL执行还是有差异. 笔者最近在升级 Oracle 驱动至 ojdbc 7 ,就发现了处理DATE类型存在问题. ...

  3. mybatis 3的TypeHandler解析(null值的处理)

    最近,在测试迁移公司的交易客户端连接到自主研发的中间件时,调用DAO层时,发现有些参数并没有传递,而在mapper里面是通过parameterMap传递的,因为有些参数为null,这就导致了参数传递到 ...

  4. 两个案例轻松理解MyBatis中的TypeHandler!

    在做开发时,我们经常会遇到这样一些问题,比如我有一个Java中的Date数据类型,我想将之存到数据库的时候存成一个1970年至今的毫秒数,怎么实现?再比如我有一个User类,User类中有一个属性叫做 ...

  5. 学习Spring Boot:(十二)Mybatis 中自定义枚举转换器

    前言 在 Spring Boot 中使用 Mybatis 中遇到了字段为枚举类型,数据库存储的是枚举的值,发现它不能自动装载. 解决 内置枚举转换器 MyBatis内置了两个枚举转换器分别是:org. ...

  6. mybatis 3的TypeHandler深入解析(及null值的处理)

    最近,在测试迁移公司的交易客户端连接到自主研发的中间件时,调用DAO层时,发现有些参数并没有传递,而在mapper里面是通过parameterMap传递的,因为有些参数为null,这就导致了参数传递到 ...

  7. 自定义 TypeHandler

    自定义TypeHandler分为三个步骤: 1.编写自定义TypeHandler,并继承自抽象类BaseTypeHandler<T>,实现抽象方法 2.在mybatis-config.xm ...

  8. Mybatis使用自定义类型转换Postgresql

    Mybatis使用自定义类型转换Postgresql 主要目的 为了解决从数据库取出来之后再手动转换为javaBean的问题. 主要用mybatis提供的Handler来把处理前置 添加转换类 imp ...

  9. 深入浅出Mybatis系列五-TypeHandler简介及配置(mybatis源码篇)

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(四)---配置详解之typeAliase ...

随机推荐

  1. 设计Optaplanner下实时规划服务的失败经历

    其实本文不知道算不算一个知识点分享,过程很美妙,但结果很失败.我们在利用Optaplanner的Real-Time planning(实时规则)功能,设计实时在线规划服务时,遇到一个属于Optapla ...

  2. 报错:ERROR ParcelUpdateService:com.cloudera.parcel.components.ParcelDownloaderImpl: Unable to retrieve remote parcel repository manifest

    报错背景: CDH断电后重启失败,解决了种种错误之后,重启成功,但是重启之后的服务器没有任何进程, 查看/opt/cm-5.15.1/log/cloudera-scm-server/cloudera- ...

  3. 学习笔记《Java多线程编程实战指南》三

    3.1串行.并发与并行 1.串行:一件事做完接着做下一件事. 2.并发:几件事情交替进行,统筹资源. 3.并行:几件事情同时进行,齐头并进,各自运行直到结束. 多线程编程的实质就是将任务处理方式由串行 ...

  4. 廖雪峰Java8JUnit单元测试-2使用JUnit-2异常测试

    1.异常测试 对可能抛出的异常进行测试: 异常本身是方法签名的一部分: * public static int parseInt(String s) throws NumberFormatExcept ...

  5. 软件推荐----截图软件Snagit

    截图软件,比较推荐使用Snagit,功能上所有截图软件有的他都有.Snagit编辑器有一个[库]功能,可以按日期以及应用程序对截图进行分类整理,最赞的是你可以把整个库备份导出,在新的电脑上进行导入,所 ...

  6. window注册表相关

    参考: https://baike.baidu.com/item/REG_EXPAND_SZ/9102962 一 注册表的相关概念 windows注册表相关api中名字起的比较混乱, 在这放一张从网上 ...

  7. altera DDR2 ip使用笔记之IP核生成

    IP核生成 Quartus生成DDR2 ip流程如下: 点击菜单栏的Tools->MegaWizard Plug-In Manager,弹出  选择IP类型,保持路径即文件名等,如下图  点击n ...

  8. bootstrap 常用class

    导航中的折叠菜单 collapse 手机端折叠 navbar-collapse 电脑端展开 navbar-inverse 反色 navbar-default 默认的nav风格 sr-only 专门给屏 ...

  9. Skyline TerraExplorer 7.0- 扩展信息树

    Skyline TerraExplorer V7增加了一个扩展信息树的控件TEInformationWindowEx.  该控件能够将TE3DWindowEx窗口里面的对象显示为信息树的方式.TEIn ...

  10. 在chrome console中添加jQuery

    由于现有seajs等封装,jQuery等已不在全局暴露,即使网站中已使用jQuery,在console也使用不了. 在chrome中可以用以下代码加入jQuery: fetch('http://cod ...