场景

场景一:比如我有一个 Java 中的 Date 数据类型,我想将之存到数据库的时候存成一个1970年至今的毫秒数,怎么实现?

场景二:我有一个 User 类,User 类中有一个属性叫做 interest,这个属性用来描述用户的爱好,它的数据类型是一个 List 集合,那么我想在把这个 List 集合存入数据库的时候能够自动的变成 {XXX,XXX,XXX} 这样一个字符串然后存起来,当我从数据库读取的时候也是读取到这样一个字符串,读取成功之后再自动的将之转为一个 List 集合

使用

TypeHandler 处理数据库类型和 Java 类型之间的转换,先看下这个是怎么使用的。

  • 第一种我们不用配置,框架会根据 javaType 自动获取一个 TypeHandler 的实现类型
  • 第二种是自定义,并在 resultmap 中配置上,如:typeHandler="mytype",如:

image.png
Mybatis 框架中预定义了很多默认的 TypeHandler,下图是部分类型。默认注册的时候会注册一个 UnknownTypeHandler,这个handler 是处理 java 中的 Object 的变量的。
image.png
其实在 result 标签中不定义 javaType 和 typeHandler,框架就会默认处理成 UnknownTypeHandler。
在 ResultMapping 中的 build 方法中会调用 resolveTypeHandler 方法,这个方法会返回真正 TypeHandler。
image.png
getTypeHandler 方法中,如果是 type 是 Object 类型,获取的 jdbcHandlerMap 中的key有三个,NULL,OTHER,ARRAY 这三个,如果用Object从map查,肯定返回null,如果handler此时还是null,会把key为NULL对应的typeHandler取出来,也就是UnknownTypeHandler。如果type是已经定义的类型就会获取对应的 TypeHandler。
image.png

  1. @LogMapping
  2. public class XssTypeHandle extends BaseTypeHandler<String> {
  3. private Whitelist whitelist = WhitelistUtil.basicWithImages();
  4. @Override
  5. public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
  6. ps.setString(i, Jsoup.clean(parameter,whitelist));
  7. }
  8. @Override
  9. public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
  10. return null;
  11. }
  12. @Override
  13. public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
  14. return null;
  15. }
  16. @Override
  17. public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
  18. return null;
  19. }
  20. }