到:无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。那么为什么会有类型处理器呢?这一点并不难理解,SQL语句事实上可以理解为一门面向数据库的编程语言。所以相对而言都有自己的数据类型。这也就意味着存在数据类型不一至的问题。同时不同的数据库之间数据类型还有一定的差义。类型处理器则就是用于处理数据类型不一至的问题。
笔者看过几个不同的ORM框架都存在着类型处理器的概念。可见类型处理器在ORM框架上实现有多么重要。在官网上面已经列出了20多种的内部类型处理器。笔者建议最好选择性的看。好比如说笔者当前的列子里面用到的一个叫UnknownTypeHandler的类型处理器。
List<Product> products = dao.SelectProducts(30, "a");
<select id="SelectProducts" resultMap="result" >
select * from Products where #{0} > ProductID and ProductName like #{1}</select>例子里面并没有指出是什么样子的JAVA类型。所以当然是UnknownTypeHandler类型了。即然这样子我们不烦设置一下他的类型在来看看。我们只要把上面的配置修改一下就可以了。如下红色标记。
<select id="SelectProducts" resultMap="result" >
select * from Products where #{0,javaType=int,jdbcType=NUMERIC} > ProductID and ProductName like #{1,javaType=String,jdbcType=VARCHAR}</select>关于#{}的语法问题,相信笔者不用多讲大家都清楚。从上面简单的设置里,我们可以看到源码里面会找到IntegerTypeHandler和StringTypeHandler类型处理器来设置参数。类型处理器都是实现于TypeHandler接口,源码都存放在org.apache.ibatis.type的命名空间下。TypeHandler接口的源码也很简单。我们可以看到setParameter方法。顾名思义他就是用于设置参数。其他的方法都是用于处理回返的结果。如下。
延伸阅读
- ssh框架 2016-09-30
- 阿里移动安全 [无线安全]玩转无线电——不安全的蓝牙锁 2017-07-26
- 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 论文笔记【图片目标分割】 2017-07-26
- 词向量-LRWE模型-更好地识别反义词同义词 2017-07-26
- 从栈不平衡问题 理解 calling convention 2017-07-26
- php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明 2017-07-26
- Swift实现JSON转Model - HandyJSON使用讲解 2017-07-26
- 阿里移动安全 Android端恶意锁屏勒索应用分析 2017-07-26
- 集合结合数据结构来看看(二) 2017-07-26
学习是年轻人改变自己的最好方式
