`
yjhexy
  • 浏览: 331600 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

IBATIS typeHandler 探究

阅读更多

我们可以在IBATIS中加入我们自定义类的支持。

 

IBATIS 提供给了我们两个 接口:

 

1,TypeHandlerCallback (一般我们扩展这个接口,说实话它和TypeHandler有什么非常大的区别我还没看出来,希望有人能帮我解答 )

 

2,TypeHandler

 

 

这里我研究了 TypeHandlerCallback 写了下代码:

 

承接上一篇IBATIS中的代码修改了下babyDO类如下:

 

package com.yajun.dataobject;

import java.util.Date;

import org.apache.commons.lang.time.DateFormatUtils;

import com.yajun.enumdemo.SexEnum;

/**
 * Baby DO类
 * 
 * @author yajun
 * 
 */
public class BabyDO {
	private int id;
	private String name;
	private SexEnum sex;
	private Date birthday;
	private String hobby;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public SexEnum getSex() {
		return sex;
	}

	public void setSex(SexEnum sex) {
		this.sex = sex;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public String getHobby() {
		return hobby;
	}

	public void setHobby(String hobby) {
		this.hobby = hobby;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Override
	public String toString() {
		return "name :" + name + "\t" + "sex:" + sex.getValue() + "\t" + "birthday:"
				+ DateFormatUtils.format(birthday, "yyyy-MM-dd") + "\t" + "hobby:" + hobby;
	}

}
 

 

这里把Baby里面的性别写成了 Enum 类:

 

package com.yajun.enumdemo;

/**
 * 性别枚举
 * 
 * @author yajun
 * 
 */
public enum SexEnum {
	/** 男性 */
	Male("male"),
	/** 女性 */
	Female("female"),
	/** 人妖 */
	Monster("monster");

	private String value;

	private SexEnum(String value) {
		this.value = value;
	}

	public String getValue() {
		return value;
	}
}
 

创建了处理这个enum类的handler ,继承了TypeHandlerCallback

 

package com.yajun.typehandler;

import java.sql.SQLException;

import com.ibatis.sqlmap.client.extensions.ParameterSetter;
import com.ibatis.sqlmap.client.extensions.ResultGetter;
import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;
import com.yajun.enumdemo.SexEnum;

/**
 * 性别类型转换
 * 
 * @author yajun
 * 
 */
public class SexEnumTypeHandlerCallBack implements TypeHandlerCallback {

	/**
	 * 根据查询出来的变量值转换成相应的枚举值
	 */
	public Object getResult(ResultGetter getter) throws SQLException {
		String s = getter.getString();
		for (SexEnum sex : SexEnum.values()) {
			if (sex.getValue().equals(s)) {
				return sex;
			}
		}
		return null;
	}

	/**
	 * 在设置参数前先转换成参数需要的类型
	 */
	public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
		SexEnum sex = (SexEnum) parameter;
		setter.setString(sex.getValue());
	}

	/**
	 * 值类型转换
	 */
	public Object valueOf(String s) {
		return Enum.valueOf(SexEnum.class, (String) s);
	}

}

 

在resutlMap中加入一下配置:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap 
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="babyStore">
	<typeAlias alias="baby" type="com.yajun.dataobject.BabyDO"/>
    
    <resultMap id="baby-Result" class="baby">
        <result property="id"                column="id"             jdbcType="Integer"         javaType="integer"/>
        <result property="name"         column="name"      jdbcType="VARCHAR"  javaType="string"/>
        <result property="sex"             column="sex"          jdbcType="VARCHAR"  javaType="com.yajun.enumdemo.SexEnum"  typeHandler="com.yajun.typehandler.SexEnumTypeHandlerCallBack"
/>
        <result property="birthday"     column="birthday" jdbcType="DATE"            javaType="date"/>
        <result property="hobby"        column="hobby"     jdbcType="VARCHAR"  javaType="string"/>		
    </resultMap>

	<select id="getBabyByParams" resultMap="baby-Result">
		select * from Baby
		<dynamic prepend="where">
			<isPropertyAvailable property="name" prepend="and">
				name = #name#
		   	</isPropertyAvailable>
			<isPropertyAvailable property="sex" prepend="and">
				sex = #sex,jdbcType=VARCHAR,javaType=com.yajun.enumdemo.SexEnum#
		   	</isPropertyAvailable>
			<isPropertyAvailable property="BirthdayBondStart" prepend="and"> 
		   	   <![CDATA[
		   	         birthday >= cast(#BirthdayBondStart# as datetime)
		   	   ]]>
			</isPropertyAvailable>
			<isPropertyAvailable property="BirthdayBondEnd" prepend="and">
				 <![CDATA[
				     birthday <= cast(#BirthdayBondEnd# as datetime)
				 ]]>
			</isPropertyAvailable>
			<isPropertyAvailable property="hobby" prepend="and">
				     hobby like '%'||#hobby#||'%'
			</isPropertyAvailable>
		</dynamic>
	</select>
</sqlMap>

 

上面注意到两个地方必须有:

1,

    result property="sex"             column="sex"          jdbcType="VARCHAR"  javaType="com.yajun.enumdemo.SexEnum" typeHandler="com.yajun.typehandler.SexEnumTypeHandlerCallBack"
    这句话中 jdbcType,javaType,TypeHandler 3个属性一个不能少,否则无效
。这里主要指明在返回结果的时候要用自定义的javaType包装

2,

sex = #sex,jdbcType=VARCHAR,javaType=com.yajun.enumdemo.SexEnum#
这里面的jdbcType,javaType 一个不能少,否则不能执行 setParameter方法。
这里主要指明在传入参数的时候需要自定义的javaType 进行包装

 

编写测试类:

 

package com.yajun;

import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.time.DateFormatUtils;

import com.yajun.dataobject.BabyDO;
import com.yajun.enumdemo.SexEnum;
import com.yajun.impl.BabyDAOImpl;

/**
 * IBATIS 查找DEMO
 * 
 * @author yajun
 * 
 */
public class Demo {
	private BabyDAOImpl babyDAO = new BabyDAOImpl();

	public static void main(String[] args) throws SQLException {
		Demo demo = new Demo();
		System.out.println("============根据性别查找========");
		demo.queryBySex(SexEnum.Male);
	}

	private void queryBySex(SexEnum sex) throws SQLException {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("sex", sex);
		List<BabyDO> list = babyDAO.query(params);
		for (BabyDO baby : list) {
			System.out.println(baby);
		}
	}
}

 

运行结果:

 

============根据性别查找========
name :吴亚军    sex:male    birthday:2009-08-08    hobby:hao se

 

追踪了下ibatis的源代码关键点如下:

 

SqlExecutor 类的 executeQuery方法中的重点代码:

 

// 这里在设置参数      (执行了 TypeHandler 的setParameter()方法)
statementScope.getParameterMap().setParameters(statementScope, ps, parameters);
      errorContext.setMoreInfo("Check the statement (query failed).");
// 开始执行
      ps.execute();
      errorContext.setMoreInfo("Check the results (failed to retrieve results).");

// 包装返回结果  (执行了 TypeHandler 的 getResult()方法)
      // Begin ResultSet Handling
      rs = handleMultipleResults(ps, statementScope, skipResults, maxResults, callback);

 

也就在这里面进行了的, 可以参考下图:


 

 

  • 大小: 9.5 KB
分享到:
评论
1 楼 lt1988 2011-01-10  
typeHandler
[flash=200,200][/flash]

相关推荐

    使用iBatis的类型处理器TypeHandlerCallback

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

    ibatis源码

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

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

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

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

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

    ibatis总结 ibatis ibatis ibatis ibatis

    Ibatis 是一款轻量级的Java持久层框架,它允许开发者将SQL语句与Java代码分离,从而使得数据库访问更加灵活、易于维护。本篇文章将深入探讨Ibatis的核心概念、最佳实践以及与其他框架如Struts和Spring的整合。 1. ...

    ibatis开发包(common+sqlmap+dao)

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

    最新的ibatis 3.0(包含源码)

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

    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对象。例如...

    ibatis 支持枚举类型

    注册自定义的`TypeHandler`到Ibatis配置中是非常重要的一步。在`mybatis-config.xml`中添加以下配置: ```xml &lt;typeHandler handler="com.example.StatusTypeHandler" javaType="com.example.Status"/&gt; ``` ...

    ibatis demo,ibatis例子,ibatis示例

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将SQL语句与Java代码分离,从而更好地管理数据库操作。Ibatis的出现,解决了传统JDBC中手动编写SQL和结果集映射的繁琐工作,...

    ibatis相关的common,dao,sqlmap包

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

    iBATIS 框架简介

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

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    《深入解析iBatis源码》 iBatis,一个优秀的Java持久层框架,以其轻量级、灵活的特性在众多ORM(Object-Relational Mapping)框架中独树一帜。iBatis的核心在于它的SQL映射机制,它将数据库操作与业务逻辑解耦,...

    ibatis配置

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

    iBatis.rar 开发文档

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

    从iBatis迁移到MyBatis

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

    Ibatis jar

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

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    iBATIS DAO是Java开发中的一个持久层框架,它提供了数据访问对象(DAO)的实现,使得数据库操作更加简单和灵活。在这个2.3.4.726版本的源码中,我们可以深入理解iBATIS DAO的工作原理,并通过添加注释来帮助我们更好...

    Ibatis入门例子,Ibatis教程

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将注意力集中在编写SQL语句上,而无需关注JDBC代码的编写。Ibatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的...

Global site tag (gtag.js) - Google Analytics