由于Java 类型和数据库的JDBC 类型不是一一对应的(比如String 与varchar),所以我们把Java 对象转换为数据库的值,和把数据库的值转换成Java 对象,需要经过一定的转换,这两个方向的转换就要用到TypeHandler。

有的同学可能会有疑问,我没有做任何的配置,为什么实体类对象里面的一个String属性,可以保存成数据库里面的varchar 字段,或者保存成char 字段?

这是因为MyBatis 已经内置了很多TypeHandler(在type 包下),它们全部全部注册在TypeHandlerRegistry 中,他们都继承了抽象类BaseTypeHandler,泛型就是要处理的Java 数据类型。

当我们做数据类型转换的时候,就会自动调用对应的TypeHandler 的方法。

如果我们需要自定义一些类型转换规则,或者要在处理类型的时候做一些特殊的动作,就可以编写自己的TypeHandler,跟系统自定义的TypeHandler 一样,继承抽象类BaseTypeHandler<T>。有4 个抽象方法必须实现,我们把它分成两类:

set 方法从Java 类型转换成JDBC 类型的,get 方法是从JDBC 类型转换成Java 类型的。

从Java 类型到JDBC 类型 从JDBC 类型到Java 类型
setNonNullParameter:设置非空参数 getNullableResult:获取空结果集(根据列名),一般都是调用这个
getNullableResult:获取空结果集

比如我们想要在获取或者设置String 类型的时候做一些特殊处理,我们可以写一个String 类型的TypeHandler(mybatis-standalone 工程)。

public class MyTypeHandler extends BaseTypeHandler<String> {public void setNonNullParameter(PreparedStatement ps, int i, String parameter,JdbcType jdbcType)throws SQLException {// 设置String 类型的参数的时候调用,Java 类型到JDBC 类型System.out.println("---------------setNonNullParameter1:"+parameter);ps.setString(i, parameter);}public String getNullableResult(ResultSet rs, String columnName) throws SQLException{// 根据列名获取String 类型的参数的时候调用,JDBC 类型到java 类型System.out.println("---------------getNullableResult1:"+columnName);return rs.getString(columnName);}// 后面两个方法省略…………
}

第二步,在mybatis-config.xml 文件中注册:

<typeHandlers><typeHandler handler="com.gupaoedu.type.MyTypeHandler"></typeHandler>
</typeHandlers>

第三步,在我们需要使用的字段上指定,比如:

插入值的时候,从Java 类型到JDBC 类型,在字段属性中指定typehandler:

<insert id="insertBlog" parameterType="com.gupaoedu.domain.Blog">insert into blog (bid, name, author_id)values (#{bid,jdbcType=INTEGER},#{name,jdbcType=VARCHAR,typeHandler=com.gupaoedu.type.MyTypeHandler},#{authorId,jdbcType=INTEGER})
</insert>

返回值的时候,从JDBC 类型到Java 类型,在resultMap 的列上指定typehandler:

<result column="name" property="name" jdbcType="VARCHAR"
typeHandler="com.leon.type.MyTypeHandler"/>

【思考,不强制要求完成】

如果我们的对象里面有复杂对象,比如Blog 里面包括了一个Comment 对象,这个时候Comment 对象的全部属性不能直接映射到数据库的一个字段。

要求:创建一个TypeHandler,可以将任意的对象转换为json 字符串,保存到数据库的VARCHAR 类型中。在从数据库查询的时候,再转换为原来的Java 对象。

1、在数据库表添加一个VARCHAR 字段;

2、在Blog 对象中添加一个Comment 属性,字段Integer id;String content;

3、JSON 工具没有要求,jackson 或者fastjson、gson 都可以。

4、在查询和插入的statement 上使用这个TypeHandler。

MyBatis 实际使用案例-typeHandlers【重点】相关推荐

  1. Spring+SpringMVC +MyBatis整合配置文件案例66666

    Spring+SpringMVC +MyBatis整合配置文件案例 标签: springspringmvcmybatismvcjava 2017-04-13 19:12 228人阅读 评论(1) 收藏 ...

  2. 《信息处理技术员考试考前冲刺预测卷及考点解析》下午案例复习重点

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 出版日期:&l ...

  3. MyBatis 实际使用案例-Mapper.xml 映射配置文件【重点】

    http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html 映射器里面最主要的是配置了SQL 语句,也解决了我们的参数映射和结果集映射的问题.一共有8 个标 ...

  4. MyBatis 实际使用案例-objectFactory【重点】

    当我们把数据库返回的结果集转换为实体类的时候,需要创建对象的实例,由于我们不知道需要处理的类型是什么,有哪些属性,所以不能用new 的方式去创建.在MyBatis 里面,它提供了一个工厂类的接口,叫做 ...

  5. 【学习笔记】mybatis自定义插件案例代码

    文章目录 插件介绍 案例 实体类: 定义插件: 测试: 插件介绍 插件是MyBatis提供的一个非常强大的机制,我们可以通过插件来修改MyBatis的一些核心行为.插件通过动态代理机制,可以介入四大对 ...

  6. MyBatis 实际使用案例-总结

    最后我们来总结一下: 配置名称 配置含义 配置简介 configuration 包裹所有配置标签 包裹所有配置标签整个配置文件的顶级标签 properties 属性 该标签可以引入外部配置的属性,也可 ...

  7. MyBatis 实际使用案例-编程式使用

    大部分时候,我们都是在Spring 里面去集成MyBatis.因为Spring 对MyBatis 的一些操作进行的封装,我们不能直接看到它的本质,所以先看下不使用容器的时候,也就是编程的方式,MyBa ...

  8. 高项 案例分析重点知识 人力资源沟通干系人

    七.人力资源管理 人力资源管理常见考点: 一.人力资源重要知识点(人力资源管理计划.成功团队的特征.项目经理要求.权利的分类.激励理论等) 二.人力资源常见问题及答题要点(管理风格.领导关系.人员责职 ...

  9. MyBatis之类型处理器typeHandlers

    typeHandlers类型处理器 实现java类型与数据库类型之间的转换,可以使用系统提供的类型处理器,也可以自定义类型处理器,这里介绍的是实现自定义类型处理器处理数据库类型与java类型的转换 比 ...

最新文章

  1. eeglab中文教程系列(15)-绘制独立成分ERP贡献
  2. 上汽接入Momenta飞轮,成为中国第一个落地RoboTaxi的车企
  3. Sql Server 三种事务模式
  4. linux系统增加swap分区
  5. 案例:返回固定页面的http服务器
  6. HTML在线颜色代码选取器源码
  7. 分析:苹果招GPU工程师并不是打算放弃英特尔
  8. zynq7020安装linux图形界面,ZYNQ开发板的NFS文件系统安装 - ZYNQ7020学习
  9. python图书馆预约系统_python实现图书馆研习室自动预约功能
  10. double类型数据做加和操作时会丢失精度问题处理
  11. spark 稀疏矩阵存储详细解读
  12. 通讯录管理系统mysql,EML企业通讯录管理系统 v5.4.15
  13. 海思HI35xx平台软件开发快速入门之H265解码实例
  14. Windows 2000/XP IIS5.1安装
  15. 百度人脸识别api php demo,百度人脸识别api实现及demo
  16. EI收录的中国(中文)期刊(2022版)
  17. 洛谷 P4208 [JSOI2008]最小生成树计数 矩阵树定理
  18. [计算机数值分析]牛顿下山法求方程的根
  19. js监听手机屏幕旋转
  20. 如何将pip更新到最新版本?

热门文章

  1. 在迷失中前进--hatita22年蹉跎岁月的长嘘短叹(短叹篇)
  2. 机器学习之数据预处理
  3. vue-li 配置介绍
  4. 3章-字符串类型操作
  5. Verilog中的UDP
  6. 2017-2018-1 20155222 201552228 实验五 通讯协议设计
  7. junit基础学习之-断言注解(3)
  8. HDU 4588 Count The Carries 数学
  9. 数据库访问 mysql连接库--查询
  10. nand ubi -1 nand基础