热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mybatis第四篇|类处理器什么玩意?举个栗子你就知道了

点击上方“JAVAandPython君”,选择“星标”公众号重磅干货,第一时间送达原创|kuls首发:JAVAandPython君目录1.Mybatis

点击上方“JAVAandPython君”,选择“星标”公众号

重磅干货,第一时间送达

原创| kuls

首发: JAVAandPython君

目录

1.Mybatis第一篇|我的第一个Mybatis程序

2.Mybatis第二篇| CRUD,这才是程序员入门第一课

3.Mybatis第三篇| Mybatis配置,有点小个性!

前言

今天这篇文章其实接着上一篇,因为在上一篇讲解配置的时候,少讲了一个配置,类型处理器(typeHandlers)。为什么在上一篇文章中没有说呢?因为如果干说,肯定是有点不好理解,所以单独写一篇文章,给大家举个例子,应该就很容易理解了。废话不多说,直接开讲。

类型处理器

什么是类处理器?

我们首先来看看官网怎么说,MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。

可能这个不太好理解,简单点来说,我们在mapper映射器编写sql语句的时候,mapper映射器会自动帮我们进行JDBC类型和Java类型的转换。首先我们需要弄懂什么是JDBC类型和Java类型。

在官网中给了我们一份表,在表的第一列是各种各样的类型处理器xxxTypeHandler,这些处理器都是mybatis自带的处理器,会自动帮我们处理一些类。

怎么处理呢?我们看到第二列和第三列,分别是Java类型和JDBC类型,这两种类型不是互通的,而是需要通过类型处理器才能进行转换。例如我Java中的boolean值需要转换成JDBC中的(也可以理解为数据库中的)BOOLEAN类型,我们就需要通过BooleanTypeHandler处理器来进行处理。其他的都是如此。

自定义类处理器

那么理解了类处理器到底是干啥的,我们接下来又会有个疑惑,既然mybatis帮我们自动处理了,我们还要学习干啥?mybatis帮我们处理的只是一些基础常用的Java类型,如果我们需要让它来帮我们处理一个自定义对象,它能理解吗?例如下面的对象↓

public class Address {private String country;private String province;private String city;...

在这个对象里,我们有三个变量,mybatis肯定是没有我们Address这个类处理器的,所以我们需要自己动手来写一个类处理器。

我们首先来看到官方文档

也就是说mybatis支持我们自定义类处理器,并且只需要通过实现 org.apache.ibatis.type.TypeHandler 接口,或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler就能够映射成一个JDBC类型。

我们还是根据之前文章中的项目来进行拓展。

假设我的User对象中多了一个属性Address对象,我们来编辑我们的Address对象:

public class Address {private String country;private String province;private String city;public Address(String addressString) {//假设我们是通过 - 来分开country-province-cityString[] address = addressString.split("-");this.country = address[0];this.province = address[1];this.city = address[2];}...//下面是get和set以及toString方法

我们设置了Address对象有country、province、city三个属性,并且从构造器中可以看到,我们是通过country-province-city的方式来进行输入信息的,我们通过String的split方法对该字符串进行划分,并且赋给相应的属性。

此时mybatis是没有Address这个类处理器的,这个时候我们创建handler包,在包下创建AddressTypeHandler类。

AddressTypeHandler.java:

public class AddressTypeHandler extends BaseTypeHandler

 {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Address parameter, JdbcType jdbcType) throws SQLException {ps.setString(i,parameter.toString());}//下面三个getXXX方法,将数据库获得的记录集里的address字段转成java Address类型的对象。@Overridepublic Address getNullableResult(ResultSet rs, String columnName) throws SQLException {return new Address(rs.getString(columnName));}@Overridepublic Address getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return new Address(rs.getString(columnIndex));}@Overridepublic Address getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return new Address(cs.getString(columnIndex));}
}

我们按照官方文档,继承BaseTypeHandler类并且重写了setNonNullParametergetNullableResult总共四个方法。

三个get方法的作用就是将数据库获得的记录集里的address字段转成java Address类型的对象。set方法是用来将java类型转成数据库存储的类型。

接着我们只需要在配置文件中配置我们的类处理器即可使用了。



记得一定要按照相应的顺序进行编写,否则会报错。

最后,我们可以看到输出结果为:

这意味着我们自定义的类处理器成功了。

本文代码

完整代码:

https://github.com/hellokuls/kuls-mybatis

之后该系列的代码和文章全部放在这个GitHub项目,欢迎大家star!


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
author-avatar
小鬼快乐momomo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有