官网上面讲到:无论是 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和StringTypeHand

网友评论