`

Ibatis TypeHandler使用总结

    博客分类:
  • Java
阅读更多
ibatis中有一个TypeHandler(准确的说应该是TypeHandlerCallback), 这个接口一般用的比较少, google一下, 大部分就是用来将数据库中的值与java的枚举值或者clob与字符串之间的转换. 最近本人也用到了这个东东. 不过我们使用的是将保存在数据库中以一定分隔符连接的字符串转换成List类型. 开始不知道有TypeHandler这个东东, 于是在JavaBean中定义了两个属性, 一个string类型的, 一个List类型的, 然后内部之间转换, 这种做法有一个弊端, 就是实际上在对一个属性操作的时候, 会有两个接口, 一方面给使用方造成了困惑, 另一个维护起来也不方便, 于是将转换过程完全封装, 对外提供提一个访问接口, 成了一个必要的选择.
先来看看TypeHandlerCallback的定义:
public interface TypeHandlerCallback {
  public void setParameter(ParameterSetter setter, Object parameter)
      throws SQLException;

  public Object getResult(ResultGetter getter)
      throws SQLException;

  public Object valueOf(String s);


代码很好理解, 而且为了说明如何使用, 作者不惜在注视中给出了一个example.
代码很好理解, setParameter()方法主要是给PrepareStatement赋值. 因此是在insert, update, delete这些操作的时候, 指定传递参数用的.
getResult()方法用来将ResultSet结果集中的内容转换到JavaBean中对应的属性.
valueOf()主要是用来当没有指定的值的时候, 指定默认值的. 主要是ResultSet到JavaBean之间的转换的时候会用到. 最好不要返回null值, 它跟nullValue相关.
下面是一个将数据库中";"分隔的字符串与DO中的list对象之间的转换的实现:
public class PropertiesTypeHandlerCallback implements TypeHandlerCallback {
    private static final String LIST_SPLIT_FLAG = ";";

    public Object getResult(ResultGetter getter) throws SQLException {
        String properties = getter.getString();
        return CollectionUtils.stringToList(properties, LIST_SPLIT_FLAG, new
                StringConvertor<Property>() {
            public Property convert(String str) {
                return Property.valueOf(str);
            }
        });
    }

    @SuppressWarnings("unchecked")
    public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
        List<String> propertyList = (List<String>) parameter;
        setter.setString(CollectionUtils.listToString(propertyList, LIST_SPLIT_FLAG));
    }

    public Object valueOf(String s) {
        return Collections.EMPTY_LIST;
    }
}


接下来是sqlmap的映射文件中进行配置.
针对sql返回结果的转换, 需要在对应的resultMap中指定一下, 比如这样写:
<result property="propertyList" column="PROPERTIES"  typeHandler="com.mysoft.dao.ibatis.support.PropertiesTypeHandlerCallback"/>

针对赋值的参数的设置, 有两种做法, 一种是在parameterMap中的parameter标签中的设置typeHandler属性为对应的callback, 这种做法有一种不好的地方, 就是不同的赋值map, 需要单独定义, 这个反而增加了工作量. 而且使用parameterMap之后, sql语句中的原来在##中指定赋值名称需要改成?, 赋值遵循parameterMap中的定义顺序, 这种做法既繁琐, 可维护性也不好, 因此推荐采用inlineParameter的做法, 比如这样写:
#propertyList,handler=com.taobao.item.dao.ibatis.support.ItemVerticalPropertiesTypeHandlerCallback#


对于TypeHandler的配置, 还有一种做法, 就是在sqlmap中对某一种类型, 使用typeHandler标签进行定义, 比如这样写:
<typeHandler javaType="" callback=""/>

注意这个需要定义在sqlMapConfig标签下.
分享到:
评论
1 楼 Kaede 2011-08-26  
问个问题:

如果在parameter 中指定nullValue,在自定义typeHandler中如何处理。
<parameterMap id="accountTypeHandlerParameterMap" class="account">
 <parameter property="gender" nullValue="male" jdbcType="VARCHAR" typeHandler="com.xxx.post.ext.GenderTypeHandlerCallback"/>
 </parameterMap>


当前gender属性值为空时,报错,com.ibatis.common.jdbc.exception.NestedSQLException: 

相关推荐

    使用iBatis的类型处理器TypeHandlerCallback

    4. 使用`@TypeHandler`注解:对于实体类的属性,可以直接在字段上使用`@TypeHandler`注解指定对应的类型处理器。 通过深入理解和灵活运用`TypeHandlerCallback`,开发者可以更好地控制数据在Java应用和数据库之间的...

    ibatis源码

    Ibatis提供了一系列内置的TypeHandler,如StringTypeHandler、DateTypeHandler等,同时允许自定义TypeHandler以处理特殊类型。 6. **Mapper接口和映射文件**:Mapper接口定义了数据库操作的方法,而映射文件则包含...

    ibatis开发包(common+sqlmap+dao)

    例如,`org.apache.ibatis.type.TypeHandler`接口定义了如何在Java对象和数据库字段之间进行转换的逻辑,这对于处理复杂的数据类型尤其有用。 2. **ibatis-sqlmap-2.jar**: 这是Ibatis的核心组件,实现了SQL映射...

    ibatis自定义数据类型在不支持中文的数据库存储汉字

    总结来说,`iBatis`的自定义数据类型机制允许我们在不支持中文的数据库中存储汉字,通过编写自定义的TypeHandler,我们可以灵活地将中文字符串转换为数据库可以接受的格式,然后在读取时恢复原状。这种方式在无法...

    ibatis 支持枚举类型

    这里我们可以使用`TypeHandler`接口来实现这个功能: ```java public class StatusTypeHandler extends BaseTypeHandler&lt;Status&gt; { @Override public void setNonNullParameter(PreparedStatement ps, int i, ...

    最新的ibatis 3.0(包含源码)

    7. **TypeHandler**:Ibatis的TypeHandler机制用于处理Java类型与数据库类型的转换,3.0版本对TypeHandler进行了优化,扩展性更强。 8. **插件支持**:Ibatis 3.0引入了插件机制,允许用户在运行时拦截SqlSession、...

    从iBatis迁移到MyBatis

    8. **类型处理器**:MyBatis的TypeHandler接口提供了更丰富的类型转换,避免了在SQL语句中处理复杂数据类型时的困扰。 9. **缓存机制**:MyBatis提供了一级缓存和二级缓存,可以提高数据查询的效率。 10. **集成...

    ibatis.util包

    TypeHandler是Ibatis中处理Java类型和数据库类型之间转换的关键,`TypeHandlerRegistry`可以根据Java类型或JDBC类型找到对应的TypeHandler。 8. **Plugins**: 插件机制是Ibatis的一大特色,`ibatis.util.Plugins`类...

    ibatis-common.jar包

    2. **TypeHandler**:TypeHandler是Ibatis处理Java类型和数据库类型之间转换的关键接口。每个数据库字段类型都可能对应一个TypeHandler,用于将Java对象转化为SQL语句中的参数,或者将查询结果转化为Java对象。例如...

    Mybatis中自定义TypeHandler处理枚举详解

    `CustomDisplayedEnumTypeHandler` 类需要实现`org.apache.ibatis.type.TypeHandler`接口,覆盖`setParameter`和`getResult`方法,以处理枚举值到数据库字段以及字段到枚举值的转换。 通过这种方式,我们不仅可以...

    iBatis.rar 开发文档

    此外,可能会讲解如何使用Executor执行器进行批量操作,以及如何利用TypeHandler处理自定义数据类型。 通过阅读这三份文档,你可以系统地学习到iBatis框架的各个方面,从基本的配置和使用,到高级的优化和扩展。...

    iBATIS 框架简介

    6. **TypeHandler**和**DataExchange**:在参数映射过程中,TypeHandler负责Java类型到数据库类型的转换,DataExchange则完成参数值的复制。 7. **SqlMapSession的创建与释放**:SqlMapSession负责数据库连接的创建...

    Ibatis jar

    此外,Ibatis还提供了TypeHandler机制,用于自定义Java类型与数据库类型的转换,解决一些特殊类型的数据处理问题。 与Hibernate相比,Ibatis的优势在于对SQL的直接控制,使得开发者可以充分利用SQL的功能,优化...

    ibatis配置

    Ibatis提供了一些预定义的TypeHandler,也可以自定义。 9. **事务管理**: Ibatis支持手动和自动两种事务管理模式。手动模式下,开发者需要自己控制事务的开启、提交和回滚;自动模式下,可以通过Spring等框架进行...

    ibatis相关的common,dao,sqlmap包

    Ibatis-common 包含了Ibatis框架的基础工具类和通用模块,提供了诸如类型处理器(TypeHandler)、结果映射(ResultMap)等核心功能。TypeHandler是Ibatis中用于处理Java类型与数据库类型的转换,确保数据在Java对象...

    ibatis的3个jar包.rar

    2. **ibatis-common-2.jar**:这个包提供了Ibatis框架的一系列通用工具和类,包括类型处理器(TypeHandler)用于处理Java类型与数据库类型的转换,以及ResultHandler结果集处理器,用于处理查询结果。此外,还包括了...

    ibatis基本架包

    4. **反射和类型处理**:Ibatis在处理对象与SQL映射时,会用到反射和类型处理机制,如TypeHandler接口,用于自定义类型转换。 5. **缓存支持**:Ibatis的本地缓存机制部分实现位于此包中,它可以提高数据读取速度,...

    ibatis-core-3.0.jar.zip

    9. TypeHandler:处理Java类型与数据库类型的转换,确保数据在Java世界和数据库世界的准确传递。 三、动态SQL iBatis 3.0引入了动态SQL,允许在映射文件中使用条件语句,如`if`, `choose`, `when`, `otherwise`, `...

    ibatis2.3源码

    7. **TypeHandler**:类型处理器用于处理Java类型的转换,确保Java对象和数据库之间的数据类型匹配。 8. **插件机制**:iBATIS提供了一种插件机制,允许用户自定义拦截器来扩展其功能。 通过深入研究iBATIS 2.3的...

Global site tag (gtag.js) - Google Analytics