我们在使用 mybatis 获取数据库数据或者设置 sql 参数时, mybatis 会将指定的 java 类型转成合适的数据库类型, 一般情况下, 使用 mybatis 预置的类型处理器都可以解决, 刚开始写代码的时候总不知道对应数据库类型该使用哪种 java 类型与之对应, 这里简单总结一下常见的数据库类型与 java 类型的对应, 权当做个记录, 没有技术含量.
- java> MySQL
- int,integer> INTEGER
- long,Long> LONG
- float> FLOAT
- double> DOUBLE
- BigDecima> DECIMAL
- String> CHAR,VARCHAR
- byte[]> BLOB
- Date> TIMESTAMP
- Date> DATE
- Date> DATE
以上基本覆盖了我们平时使用的大部分类型, 我们定义实体类的时候根据数据库类型定义相应的 java 类型即可.
原理
接下来我们来看一下源码层面的处理, 看他是如何完成转换的.
mybatis 的 java 类型与数据库类型之间的转换通过各种 TypeHandle 来处理, 我们以最常见的 String 类型来看一下 mybatis 的处理.
mybatis 通过 StringTypeHandler 来映射 java 中的字符串与数据库中的字符类型, 通过继承 BaseTypehandler 并实现父类 4 个方法来实现. 方法也比较简单直接.. 没啥可说的, 第一次看源码的时候也没想到会这么简单.
自定义处理器
最后说一下如何自定义类型处理器
我们模仿 StringTypeHandler 继承 BaseTypeHandler, 其中 @MappedJdbcType 代表与之关联的 jdbc 类型, BaseType 中的泛型代表其处理的 java 类型. 定义完之后, 有 2 种方式来使用它, 分别是在 mapper.xml 文件中
- "where NAME = #{name,jdbcType=VARCHAR, javaType=string}"
- "where NAME = #{name, typeHandler=com.tl.ExampletypeHandler}".
来源: http://www.jianshu.com/p/77dd6a7cb076