- 浏览: 2444523 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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 3090Externalization没用过, 它通过牺牲默认序列化的 ... -
关于java的检查异常和非检查异常
2012-04-04 21:31 4909这里有一个关于java的检查异常和非检查异常的观点, 我比较赞 ... -
使用ThreadLocal保证DateFormat线程安全
2012-04-03 06:45 3540大家都知道DateFormat是线程非安全的, 一般在多线程环 ... -
使用枚举实现一个状态机
2012-04-02 23:14 3890非常巧妙的一个使用枚举的例子.原文见这里 interface ... -
一个同步队列例子
2012-04-02 21:35 1531这个用的也比较少, 做一个参考, 原文见这里 private ... -
一个读写锁的例子
2012-04-02 21:20 1505用的比较少, 做一个参考. 原文在这里 public clas ... -
如何计算一个合适的线程池大小参数
2012-04-02 20:57 9024原文在这里 下面是一个计算的框架代码: /** * A ... -
正确使用日志的10个技巧
2012-02-11 21:13 28749做一个苦逼的Java攻城师, 我们除了关心系统的架构这种hig ... -
Java编程最差实践
2012-02-04 17:54 26427原文地址:http://www.odi.ch/prog/des ... -
利用jOOR简化Java 反射使用
2012-01-15 20:39 5087原文:http://lukaseder.wordpress.c ... -
《Java Performance》书评
2012-01-15 18:32 2921原文: http://java.dzone.com/rev ... -
《细说Java》读书笔记
2011-10-05 15:01 1947国人写的, 感觉是一 ... -
《Java开发超级工具集》读书笔记
2011-09-28 08:59 2070"工欲善其事必先利其器", 在平时的开发 ... -
《effective java》 读书笔记
2011-07-02 14:52 7565读第一版已经是好几年前的事儿了, 现在想起来也没什么印象, ... -
用java实现"awk -d"功能(保留多行重复)
2010-06-07 21:48 3020一般用过linux脚本的都知道"awk -d&quo ... -
关于方法返回值的两种处理模式
2010-05-13 09:06 1980目前在处理返回值方面, ... -
JVM调优汇总
2010-02-21 19:18 14375参考网址 http://pengjiaheng.spaces. ... -
log4j的输出转换模式
2009-12-12 10:02 1230转换模式(conversion pattern)为" ... -
java正则表达式用法举例
2009-12-08 11:27 4473java正则表达式真难用啊, 这里整理一个java正则表达式用 ... -
ibatis参数传递小技巧
2009-10-30 14:21 3886使用ibatis操作数据库的时候, 如果这个操作需要一些参数, ...
相关推荐
NULL 博文链接:https://wangym.iteye.com/blog/1439520
ibatis学习 ibatis总结 ibatis ibatis ibatis
在做一个mis系统的时候,公司用到了iBATIS来作为持久化的框架,并结合spring2.5的mvc来完成,项目现在已经完成,把iBATIS做了一下总结。
ibatis 相关使用文档及安装包ibatis 相关使用文档及安装包
对iBatis.net的使用 做了一个总结,及里面使用例子说明。 如有不对的地方,还请告知。
ibatis的错误总结
ibatis简易使用ibatis简易使用ibatis简易使用
传智播客ibatis教程_ibatis优点总结.
struts2+spring+ibatis 项目 入门使用 CRUD
IBatis.Net详细使用手册
iBATIS缓存的使用方法
ibatis优点总结 ibatis优点总结
ibatis知识点总结(常用使用,配置文件详细解说)
ibatis技术总结,ibatis技术总结ibatis技术总结
ibatis开发和学习总结借鉴.pdf
ibatis教程 主要是对这个软件的入门的介绍和如何加载和使用
ibatis使用过程中的总结,有助于新手快速使用ibatis应用到自己的项目中
C#中iBatis连接mySQL使用的DLL
09_ibatis教程_ibatis优点总结.zip 09_ibatis教程_ibatis优点总结.zip
ibatis总结的小东西ibatis总结的小东西ibatis总结的小东西ibatis总结的小东西ibatis总结的小东西ibatis总结的小东西ibatis总结的小东西ibatis总结的小东西