- 浏览: 2467106 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (574)
- Book (62)
- Architecture (6)
- Java (39)
- Taobao (41)
- Distributed (4)
- Life (72)
- Database (7)
- Spring (16)
- Photography (15)
- Bicycle (41)
- Test (20)
- jBPM (8)
- Business (12)
- Movie (3)
- Ajax (15)
- Code (7)
- Eclipse (96)
- VIM (2)
- Music (6)
- Groovy (10)
- AutoHotKey (3)
- Dorado (10)
- Maven (7)
- Scrum (5)
- English (20)
- Financial (12)
- OSGi (3)
- Other (4)
- Tool (6)
- Browser (1)
- PPT (1)
- Project Management (4)
- Agile (6)
- Nosql (1)
- Search engine (6)
- Shell (2)
- Open Source (4)
- Storm (10)
- Guava (3)
- Baby (1)
- netty (1)
- Algorithm (1)
- Linux (1)
- Python (2)
最新评论
-
roy2011a:
https://github.com/ebottabi/sto ...
storm的序列化问题及与spring的结合方式 -
roy2011a:
能抗能打 写道哥们儿,你好!能共享下那个storm与sprin ...
storm的序列化问题及与spring的结合方式 -
Alick1:
兄弟,你之前是不是在深圳的正阳公司呆过啊?
storm的ack和fail -
liuleixwd:
先点个赞,写的非常好!有个问题请教下,如果我再bolt里不用e ...
storm的ack和fail -
yao-dd:
solr的facet查询
ibatis中有一个TypeHandler(准确的说应该是TypeHandlerCallback), 这个接口一般用的比较少, google一下, 大部分就是用来将数据库中的值与java的枚举值或者clob与字符串之间的转换. 最近本人也用到了这个东东. 不过我们使用的是将保存在数据库中以一定分隔符连接的字符串转换成List类型. 开始不知道有TypeHandler这个东东, 于是在JavaBean中定义了两个属性, 一个string类型的, 一个List类型的, 然后内部之间转换, 这种做法有一个弊端, 就是实际上在对一个属性操作的时候, 会有两个接口, 一方面给使用方造成了困惑, 另一个维护起来也不方便, 于是将转换过程完全封装, 对外提供提一个访问接口, 成了一个必要的选择.
先来看看TypeHandlerCallback的定义:
代码很好理解, 而且为了说明如何使用, 作者不惜在注视中给出了一个example.
代码很好理解, setParameter()方法主要是给PrepareStatement赋值. 因此是在insert, update, delete这些操作的时候, 指定传递参数用的.
getResult()方法用来将ResultSet结果集中的内容转换到JavaBean中对应的属性.
valueOf()主要是用来当没有指定的值的时候, 指定默认值的. 主要是ResultSet到JavaBean之间的转换的时候会用到. 最好不要返回null值, 它跟nullValue相关.
下面是一个将数据库中";"分隔的字符串与DO中的list对象之间的转换的实现:
接下来是sqlmap的映射文件中进行配置.
针对sql返回结果的转换, 需要在对应的resultMap中指定一下, 比如这样写:
针对赋值的参数的设置, 有两种做法, 一种是在parameterMap中的parameter标签中的设置typeHandler属性为对应的callback, 这种做法有一种不好的地方, 就是不同的赋值map, 需要单独定义, 这个反而增加了工作量. 而且使用parameterMap之后, sql语句中的原来在##中指定赋值名称需要改成?, 赋值遵循parameterMap中的定义顺序, 这种做法既繁琐, 可维护性也不好, 因此推荐采用inlineParameter的做法, 比如这样写:
对于TypeHandler的配置, 还有一种做法, 就是在sqlmap中对某一种类型, 使用typeHandler标签进行定义, 比如这样写:
注意这个需要定义在sqlMapConfig标签下.
先来看看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中如何处理。
当前gender属性值为空时,报错,com.ibatis.common.jdbc.exception.NestedSQLException:
如果在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:
发表评论
-
使用Externalization更高效的实现java对象序列化
2012-04-04 22:38 3144Externalization没用过, 它通过牺牲默认序列化的 ... -
关于java的检查异常和非检查异常
2012-04-04 21:31 4953这里有一个关于java的检查异常和非检查异常的观点, 我比较赞 ... -
使用ThreadLocal保证DateFormat线程安全
2012-04-03 06:45 3596大家都知道DateFormat是线程非安全的, 一般在多线程环 ... -
使用枚举实现一个状态机
2012-04-02 23:14 3934非常巧妙的一个使用枚举的例子.原文见这里 interface ... -
一个同步队列例子
2012-04-02 21:35 1564这个用的也比较少, 做一个参考, 原文见这里 private ... -
一个读写锁的例子
2012-04-02 21:20 1528用的比较少, 做一个参考. 原文在这里 public clas ... -
如何计算一个合适的线程池大小参数
2012-04-02 20:57 9067原文在这里 下面是一个计算的框架代码: /** * A ... -
正确使用日志的10个技巧
2012-02-11 21:13 28848做一个苦逼的Java攻城师, 我们除了关心系统的架构这种hig ... -
Java编程最差实践
2012-02-04 17:54 26622原文地址:http://www.odi.ch/prog/des ... -
利用jOOR简化Java 反射使用
2012-01-15 20:39 5153原文:http://lukaseder.wordpress.c ... -
《Java Performance》书评
2012-01-15 18:32 2960原文: http://java.dzone.com/rev ... -
《细说Java》读书笔记
2011-10-05 15:01 1992国人写的, 感觉是一 ... -
《Java开发超级工具集》读书笔记
2011-09-28 08:59 2098"工欲善其事必先利其器", 在平时的开发 ... -
《effective java》 读书笔记
2011-07-02 14:52 7599读第一版已经是好几年前的事儿了, 现在想起来也没什么印象, ... -
用java实现"awk -d"功能(保留多行重复)
2010-06-07 21:48 3067一般用过linux脚本的都知道"awk -d&quo ... -
关于方法返回值的两种处理模式
2010-05-13 09:06 2027目前在处理返回值方面, ... -
JVM调优汇总
2010-02-21 19:18 14413参考网址 http://pengjiaheng.spaces. ... -
log4j的输出转换模式
2009-12-12 10:02 1271转换模式(conversion pattern)为" ... -
java正则表达式用法举例
2009-12-08 11:27 4518java正则表达式真难用啊, 这里整理一个java正则表达式用 ... -
ibatis参数传递小技巧
2009-10-30 14:21 3921使用ibatis操作数据库的时候, 如果这个操作需要一些参数, ...
相关推荐
4. 使用`@TypeHandler`注解:对于实体类的属性,可以直接在字段上使用`@TypeHandler`注解指定对应的类型处理器。 通过深入理解和灵活运用`TypeHandlerCallback`,开发者可以更好地控制数据在Java应用和数据库之间的...
Ibatis提供了一系列内置的TypeHandler,如StringTypeHandler、DateTypeHandler等,同时允许自定义TypeHandler以处理特殊类型。 6. **Mapper接口和映射文件**:Mapper接口定义了数据库操作的方法,而映射文件则包含...
例如,`org.apache.ibatis.type.TypeHandler`接口定义了如何在Java对象和数据库字段之间进行转换的逻辑,这对于处理复杂的数据类型尤其有用。 2. **ibatis-sqlmap-2.jar**: 这是Ibatis的核心组件,实现了SQL映射...
总结来说,`iBatis`的自定义数据类型机制允许我们在不支持中文的数据库中存储汉字,通过编写自定义的TypeHandler,我们可以灵活地将中文字符串转换为数据库可以接受的格式,然后在读取时恢复原状。这种方式在无法...
这里我们可以使用`TypeHandler`接口来实现这个功能: ```java public class StatusTypeHandler extends BaseTypeHandler<Status> { @Override public void setNonNullParameter(PreparedStatement ps, int i, ...
7. **TypeHandler**:Ibatis的TypeHandler机制用于处理Java类型与数据库类型的转换,3.0版本对TypeHandler进行了优化,扩展性更强。 8. **插件支持**:Ibatis 3.0引入了插件机制,允许用户在运行时拦截SqlSession、...
8. **类型处理器**:MyBatis的TypeHandler接口提供了更丰富的类型转换,避免了在SQL语句中处理复杂数据类型时的困扰。 9. **缓存机制**:MyBatis提供了一级缓存和二级缓存,可以提高数据查询的效率。 10. **集成...
TypeHandler是Ibatis中处理Java类型和数据库类型之间转换的关键,`TypeHandlerRegistry`可以根据Java类型或JDBC类型找到对应的TypeHandler。 8. **Plugins**: 插件机制是Ibatis的一大特色,`ibatis.util.Plugins`类...
2. **TypeHandler**:TypeHandler是Ibatis处理Java类型和数据库类型之间转换的关键接口。每个数据库字段类型都可能对应一个TypeHandler,用于将Java对象转化为SQL语句中的参数,或者将查询结果转化为Java对象。例如...
`CustomDisplayedEnumTypeHandler` 类需要实现`org.apache.ibatis.type.TypeHandler`接口,覆盖`setParameter`和`getResult`方法,以处理枚举值到数据库字段以及字段到枚举值的转换。 通过这种方式,我们不仅可以...
此外,可能会讲解如何使用Executor执行器进行批量操作,以及如何利用TypeHandler处理自定义数据类型。 通过阅读这三份文档,你可以系统地学习到iBatis框架的各个方面,从基本的配置和使用,到高级的优化和扩展。...
6. **TypeHandler**和**DataExchange**:在参数映射过程中,TypeHandler负责Java类型到数据库类型的转换,DataExchange则完成参数值的复制。 7. **SqlMapSession的创建与释放**:SqlMapSession负责数据库连接的创建...
此外,Ibatis还提供了TypeHandler机制,用于自定义Java类型与数据库类型的转换,解决一些特殊类型的数据处理问题。 与Hibernate相比,Ibatis的优势在于对SQL的直接控制,使得开发者可以充分利用SQL的功能,优化...
Ibatis提供了一些预定义的TypeHandler,也可以自定义。 9. **事务管理**: Ibatis支持手动和自动两种事务管理模式。手动模式下,开发者需要自己控制事务的开启、提交和回滚;自动模式下,可以通过Spring等框架进行...
Ibatis-common 包含了Ibatis框架的基础工具类和通用模块,提供了诸如类型处理器(TypeHandler)、结果映射(ResultMap)等核心功能。TypeHandler是Ibatis中用于处理Java类型与数据库类型的转换,确保数据在Java对象...
2. **ibatis-common-2.jar**:这个包提供了Ibatis框架的一系列通用工具和类,包括类型处理器(TypeHandler)用于处理Java类型与数据库类型的转换,以及ResultHandler结果集处理器,用于处理查询结果。此外,还包括了...
4. **反射和类型处理**:Ibatis在处理对象与SQL映射时,会用到反射和类型处理机制,如TypeHandler接口,用于自定义类型转换。 5. **缓存支持**:Ibatis的本地缓存机制部分实现位于此包中,它可以提高数据读取速度,...
9. TypeHandler:处理Java类型与数据库类型的转换,确保数据在Java世界和数据库世界的准确传递。 三、动态SQL iBatis 3.0引入了动态SQL,允许在映射文件中使用条件语句,如`if`, `choose`, `when`, `otherwise`, `...
7. **TypeHandler**:类型处理器用于处理Java类型的转换,确保Java对象和数据库之间的数据类型匹配。 8. **插件机制**:iBATIS提供了一种插件机制,允许用户自定义拦截器来扩展其功能。 通过深入研究iBATIS 2.3的...