`
JackAndroid
  • 浏览: 136227 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

iBATIS的自定义类型处理器TypeHandlerCallback

阅读更多

 iBATIS提供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);

}

 

它主要利用上述的三个方法来对自定义类型转换提供支持。下面我详细讲述下如何利用其来对自定义数据进行支持。

演示的内容主要是将表单中gender列中的字段转换为自己需要的内容(female<->女,male<->男)

1.数据库表people

create table people(
 id int not null auto_increment, 
 gender varchar(10),
 constraint pk primary key(id) 
);

 insert into people(id,gender) values (null,'female');
 insert into people(id,gender) values (null,male);
 insert into people(id,gender) values (null,null); 

 

  表单很简单,主要提供一个自增主键和一个可以为null的性别,并插入了实验数据。

2.POJO类

package com.xxx.pojos;
public class People{

	private int id;

	private String gender;

	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * @return the gender
	 */
	public String getGender() {
		return gender;
	}

	/**
	 * @param gender
	 *            the gender to set
	 */
	public void setGender(String gender) {
		this.gender = gender;
	}

	@Override
	public String toString() {
		return "id:" + id + "  gender:" + gender;
	}

}

  

3.TypeHandlerCallback实现类 

public class GenderTypeHandlerCallback implements TypeHandlerCallback {

	private static final String R_FEMALE = "女";

	private static final String R_MALE = "男";

	private static final String FEMALE = "female";

	private static final String MALE = "male";

	/**
	 * @see com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#getResult(com.ibatis.sqlmap.client.extensions.ResultGetter)
	 */
	public Object getResult(ResultGetter getter) throws SQLException {

		if (getter.getObject() == null)
		{
			return null;
		}

		return convertDbToValue(getter.getString());
	}

	/**
	 * @see com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#setParameter(com.ibatis.sqlmap.client.extensions.ParameterSetter,
	 *      java.lang.Object)
	 */
	public void setParameter(ParameterSetter setter, Object value)
			throws SQLException {

		setter.setString(saveValueToDb((String) value));

	}

	/**
	 * @see com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#valueOf(java.lang.String)
	 */
	public Object valueOf(String value) {

		return convertDbToValue(value);
	}

	/**
	 * 将POJO中的值转换数据库值存储
	 * 
	 * @param value
	 * @return
	 */
	private String saveValueToDb(String value) {
		if (value.equals(R_MALE))
		{
			return FEMALE;
		} else if (value.equals(R_FEMALE))
		{
			return MALE;
		} else
		{
			throw new IllegalArgumentException("参数值不正确!" + value);
		}
	}

	/**
	 * 将数据库的值转换为POJO所需要的值
	 * 
	 * @param value
	 * @return
	 */
	private String convertDbToValue(String value) {

		if (value.equals(FEMALE))
		{
			return R_FEMALE;
		} else if (value.equals(MALE))
		{
			return R_MALE;
		} else
		{
			throw new IllegalArgumentException("参数值不正确!" + value);
		}
	}

}

 4.注册TypehandlerCallback

  可以在多个配置文件中进行注册:

  1).sqlMapConfig.xml。全局配置注册.

  2)单独的parameterMap或resultMap中注册。

  本例主要演示在parameterMap中进行注册

 
 <resultMap class="com.xxx.pojos.People" id="people">
   <result property="id" column="id" javaType="int" jdbcType="INT"/>
   <result property="gender" column="gender" javaType="string"   nullValue="male" jdbcType="VARCHAR"  typeHandler="com.xxx.typeHandler.GenderTypeHandlerCallback" />
   
 </resultMap>

 5.运行结果

   可以发现,原本在数据库中存储中gender列内容为female,male和null,但是经过自定义类型转换后相应变成了男或女。

  6.遇到的问题

    上述内容经过我测试没有任何问题,不过我在看到相关资料时却出现了一个问题:

   在TypeHandlerCallback方法中,存在一个valueOf()方法,其主要作用是当数据库中列可以为空(null)时进行处理。相应地,你需要在注册时在result的nullValue中填写为空时的默认值,如上面的nullValue="male"。

  此外,还需要特别注意的一点就是:即使你在注册时填写了nullValue='male',仍然会出现NUllpointer异常,并且跟踪发现valueOf方法没有被调用,解决方法是在getResult方法中添加 if (getter.getObject() == null) { return null; }


 即需要你手动判断一次是否为null,当其结果返回null时才有会调用valueOf方法载入所设置的nullValue的值。

 

 

 

 

 

分享到:
评论
1 楼 Kaede 2011-08-26  
引用

2)单独的parameterMap或resultMap中注册。
  本例主要演示在parameterMap中进行注册


这是不是写错了,你的例子应该是resultMap吧?

同时,

问个问题:
如果在parameter中指定nullValue,而nullValue在自定义typeHandler中如何处理?

<parameterMap id="accountTypeHandlerParameterMap" class="account">
 <parameter property="gender" nullValue="male" jdbcType="VARCHAR" typeHandler="com.xxx.post.ext.GenderTypeHandlerCallback"/>
 </parameterMap>


相关推荐

    使用iBatis的类型处理器TypeHandlerCallback

    `TypeHandlerCallback`是iBatis(或MyBatis)中的一个重要接口,用于处理Java类型与数据库类型之间的转换。在处理数据库操作时,数据的类型转换是必不可少的步骤,因为Java类型和数据库存储的数据类型往往不完全匹配...

    mybatis自定义类型处理器TypehHandler示例详解

    MyBatis提供了BaseTypeHandler作为类型处理器的基类,大部分自定义类型处理器会继承这个基类,因为它提供了一些通用的处理逻辑。 **自定义类型处理器的原理**: 1. **setParameter**:此方法负责将Java类型的参数...

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

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

    Ibatis调用Oracle存储过程返回自定义类型

    ### Ibatis调用Oracle存储过程返回自定义类型 在企业级应用开发中,尤其是在金融、保险等业务场景中,往往需要处理复杂的数据结构与逻辑。本文将深入探讨如何使用Ibatis框架来调用Oracle数据库中的存储过程,并实现...

    3、mybatis类型的定义方式

    自定义类型处理器需要实现`org.apache.ibatis.type.TypeHandler`接口,并重写`setNonNullParameter`、`getNullableResult`和`getResultFromCursor`方法。 ```java public class CustomTypeHandler implements ...

    ibatIS代码生成插件

    ibatIS代码生成插件是一款高效实用的开发工具,它主要应用于Java开发环境中,通过自动化的方式帮助开发者快速生成常见的CRUD(创建、读取、更新、删除)操作代码,极大地提高了开发效率。这款插件基于Abator框架,...

    动态ibatis查询语句配置

    在IT行业中,数据库操作是应用开发的核心部分,而Ibatis作为一个优秀的持久层框架,极大地简化了Java应用程序与数据库之间的交互。动态查询语句配置是Ibatis的一个重要特性,它允许我们在运行时根据业务需求构建灵活...

    ibatis demo,ibatis例子,ibatis示例

    Ibatis提供了多种方式来实现映射,如自动类型匹配、自定义类型处理器、复杂关联映射等。 7. **缓存机制**:Ibatis内置了本地缓存和二级缓存,可以提高数据读取速度。本地缓存作用于单个SqlSession,而二级缓存则...

    Ibatis的DTD文档

    7. **自定义类型处理器**:`&lt;typehandler&gt;`元素允许开发者自定义类型处理器,解决JDBC无法自动转换的复杂类型问题。 8. **SQL映射文件命名约定**:在Ibatis中,通常按照Java类或接口的全限定名来命名SQL映射文件,...

    自定义Ibatis生成器

    标题中的“自定义Ibatis生成器”指的是在使用MyBatis框架时,为了解决重复的手动编写SQL映射文件和Mapper接口,开发者可以创建自己的代码生成器,以自动化这个过程。Ibatis生成器(也称为MyBatis Generator)允许...

    ibatis3资料-介绍

    5. **类型处理器扩展**:iBATIS3允许开发者自定义类型处理器,用于处理不同类型之间的转换,这为处理非标准数据类型提供了便利。 6. **插件架构**:iBATIS3支持插件架构,开发者可以通过编写插件来扩展框架的功能,...

    ibatis 支持枚举类型

    Ibatis对枚举类型的原生支持可能不如实体类那样直观,但通过一些策略,我们可以实现枚举与数据库字段之间的映射。以下将详细解释如何在Ibatis中处理枚举类型。 首先,我们需要定义枚举类。枚举类通常包含若干枚举...

    ibatis jar包

    7. **结果映射**:iBATIS能自动将查询结果映射到Java对象,通过结果映射配置,可以指定字段与Java属性之间的映射关系,支持自定义类型处理器以处理复杂类型的映射。 8. **参数映射**:在调用SQL时,iBATIS可以自动...

    ibatis中输入输出各种类型的参数分析及#与$区别

    在iBatis中,输入输出参数类型的支持非常丰富,几乎涵盖了Java中常见的所有基本数据类型及其封装类,同时也支持自定义JavaBean类型的传递。这使得开发者在处理数据库操作时具有很高的灵活性。 - **基本数据类型**: ...

    ibatis in action 电子书(pdf)

    8. **高级话题**:涵盖与iBATIS相关的高级主题,如批处理、延迟加载、自定义类型处理器、插件扩展等,提升开发者对iBATIS框架的深度理解。 9. **最佳实践**:提供实用的项目开发建议,如如何设计合理的映射文件结构...

    ibatis api 英文文档

    7. **Type Handlers**:iBATIS提供了默认的类型处理器,但开发者也可以自定义类型处理器,以便对特定的数据类型进行特殊处理,比如日期格式化。 8. **Transactions**:iBATIS支持手动和自动事务管理,可以根据需求...

    iBatis详细使用手册(.net版)

    - 支持复杂类型:可以通过自定义类型处理器处理复杂的参数类型。 #### 6. ResultMap - **定义**: 结果映射定义了结果集中列名与对象属性之间的映射关系。 - **作用**: - 自动填充对象属性:根据结果集中的列名...

    ibatis-sqlmaps-2_cn

    同时,教程还会讲解集合映射和自定义类型处理器的使用,这些对于处理复杂的数据结构至关重要。 除了基础功能外,教程还会涉及IBATIS的高级特性,比如缓存机制,这能提高应用的性能。此外,还有关于事务管理和异常...

    ibatis类型

    标题 "ibatis类型" 暗示我们讨论的是关于iBATIS这个持久层框架的一些特定类型或组件。iBATIS是Java开发中的一个流行数据库访问框架,它允许开发者将SQL语句直接集成到XML配置文件中,实现了SQL与Java代码的分离,...

    iBATIS实战

    12.2.1 实现自定义类型处理器 217 12.2.2 创建TypeHandlerCallback 218 12.2.3 注册TypeHandlerCallback以供使用 221 12.3 使用CacheController 222 12.3.1 创建CacheController 223 12.3.2 CacheController的放入、...

Global site tag (gtag.js) - Google Analytics