- 浏览: 33167 次
- 性别:
- 来自: 上海
最新评论
在iBatis中(现在已经更名为mybatis),当要实现在某个数据表字段和POJO的
property之间做特殊类型的转换时,如果两个类型转换不是iBatis默认支持的,需
要自己实现一个TypeHandler来满足要求。TypeHandler是iBatis中定义的接口
public interface TypeHandler {
public void setParameter(PreparedStatement ps, int i, Object
parameter, String jdbcType)
throws SQLException;
public Object getResult(ResultSet rs, String columnName)
throws SQLException;
public Object getResult(ResultSet rs, int columnIndex)
throws SQLException;
public Object getResult(CallableStatement cs, int columnIndex)
throws SQLException;
public Object valueOf(String s);
public boolean equals(Object object, String string);
}
从接口定义可以看出很简单,就是定义了如何在DB和POJO直接对属性值做转换。
假设我们还是要实现一个enum到boolean的转换,我这里写了一个,大家可以简单
看一下写法就知道自己需要的时候要做哪些事情了,其中BaseTypeHandler是
iBatis提供的一个基类:
public class StringBooleanTypeHandler extends BaseTypeHandler implements
TypeHandler {
public void setParameter(PreparedStatement ps, int i, Object
parameter, String jdbcType)
throws SQLException {
ps.setString(i, ((Boolean) parameter).toString());
}
public Object getResult(ResultSet rs, String columnName)
throws SQLException {
Object s = rs.getString(columnName);
if (rs.wasNull()) {
return null;
} else {
return Boolean.valueOf((String)s);
}
}
public Object getResult(ResultSet rs, int columnIndex)
throws SQLException {
Object s = rs.getString(columnIndex);
if (rs.wasNull()) {
return null;
} else {
return Boolean.valueOf((String)s);
}
}
public Object getResult(CallableStatement cs, int columnIndex)
throws SQLException {
Object s = cs.getString(columnIndex);
if (cs.wasNull()) {
return null;
} else {
return Boolean.valueOf((String)s);
}
}
public Object valueOf(String s) {
return Boolean.valueOf((String)s);
}
}
如何在iBatis中配置这个自己的TypeHandler呢?有两种方法:
先假设我在sqlMapConfig.xml中给自定义的Handler声明了别名
<typeAlias type="cn.vobile.cyberlocker.dao.StringBooleanTypeHandler"
alias="myHandler" />
(1)对于使用不频繁的情况,可以只在需要的地方声明自己的handler。
如果使用ParamerterMap,就是在子元素ParameterMapping里面声明;
如果使用ParameterClass,那就是在InlineParameter里面声明,这样写:
INSERT INTO matchedFile (company_id, trackingWebsite_id, file_uuid,
clip_title, source_url, page_info, password, contributor,
matchedFileItem_count, is_appended, created_at)
VALUES (#companyId#, #websiteId#,UUID(), #clipTitle#, #sourceUrl#,
#pageInfo#, #password#, #contributor#, #matchedFileItemCount#,
#isAppended,handler=myHandler#, NOW())
注意,这里#isAppended,handler=myHandler#,这样就声明好了。但不要在,和
handler中间留空格,否则通不过
对于ResultMap,一样在ResultMapping中声明就好了,如:
<result column="is_refreshing" property="isRefreshing" jdbcType="CHAR"
javaType="boolean" typeHandler=“myHandler"/>
(2)对于很多地方都要用到的handler,建议在sqlMapConfig.xml中声明,免得每处
都要写。如:
<typeHandler javaType="boolean" jdbcType="VARCHAR"
callback="myHandler" />
这里我个人建议写上jdbcType="VARCHAR",网上或着文档上很多就只写了
javaType="boolean"一个的。如果不写的话,很容易造成自己写的typeHandler把
iBatis默认的替换掉,引起不必要的问题。具体的原理我就不写了,设计到iBatis
的实现,太啰嗦。
property之间做特殊类型的转换时,如果两个类型转换不是iBatis默认支持的,需
要自己实现一个TypeHandler来满足要求。TypeHandler是iBatis中定义的接口
public interface TypeHandler {
public void setParameter(PreparedStatement ps, int i, Object
parameter, String jdbcType)
throws SQLException;
public Object getResult(ResultSet rs, String columnName)
throws SQLException;
public Object getResult(ResultSet rs, int columnIndex)
throws SQLException;
public Object getResult(CallableStatement cs, int columnIndex)
throws SQLException;
public Object valueOf(String s);
public boolean equals(Object object, String string);
}
从接口定义可以看出很简单,就是定义了如何在DB和POJO直接对属性值做转换。
假设我们还是要实现一个enum到boolean的转换,我这里写了一个,大家可以简单
看一下写法就知道自己需要的时候要做哪些事情了,其中BaseTypeHandler是
iBatis提供的一个基类:
public class StringBooleanTypeHandler extends BaseTypeHandler implements
TypeHandler {
public void setParameter(PreparedStatement ps, int i, Object
parameter, String jdbcType)
throws SQLException {
ps.setString(i, ((Boolean) parameter).toString());
}
public Object getResult(ResultSet rs, String columnName)
throws SQLException {
Object s = rs.getString(columnName);
if (rs.wasNull()) {
return null;
} else {
return Boolean.valueOf((String)s);
}
}
public Object getResult(ResultSet rs, int columnIndex)
throws SQLException {
Object s = rs.getString(columnIndex);
if (rs.wasNull()) {
return null;
} else {
return Boolean.valueOf((String)s);
}
}
public Object getResult(CallableStatement cs, int columnIndex)
throws SQLException {
Object s = cs.getString(columnIndex);
if (cs.wasNull()) {
return null;
} else {
return Boolean.valueOf((String)s);
}
}
public Object valueOf(String s) {
return Boolean.valueOf((String)s);
}
}
如何在iBatis中配置这个自己的TypeHandler呢?有两种方法:
先假设我在sqlMapConfig.xml中给自定义的Handler声明了别名
<typeAlias type="cn.vobile.cyberlocker.dao.StringBooleanTypeHandler"
alias="myHandler" />
(1)对于使用不频繁的情况,可以只在需要的地方声明自己的handler。
如果使用ParamerterMap,就是在子元素ParameterMapping里面声明;
如果使用ParameterClass,那就是在InlineParameter里面声明,这样写:
INSERT INTO matchedFile (company_id, trackingWebsite_id, file_uuid,
clip_title, source_url, page_info, password, contributor,
matchedFileItem_count, is_appended, created_at)
VALUES (#companyId#, #websiteId#,UUID(), #clipTitle#, #sourceUrl#,
#pageInfo#, #password#, #contributor#, #matchedFileItemCount#,
#isAppended,handler=myHandler#, NOW())
注意,这里#isAppended,handler=myHandler#,这样就声明好了。但不要在,和
handler中间留空格,否则通不过
对于ResultMap,一样在ResultMapping中声明就好了,如:
<result column="is_refreshing" property="isRefreshing" jdbcType="CHAR"
javaType="boolean" typeHandler=“myHandler"/>
(2)对于很多地方都要用到的handler,建议在sqlMapConfig.xml中声明,免得每处
都要写。如:
<typeHandler javaType="boolean" jdbcType="VARCHAR"
callback="myHandler" />
这里我个人建议写上jdbcType="VARCHAR",网上或着文档上很多就只写了
javaType="boolean"一个的。如果不写的话,很容易造成自己写的typeHandler把
iBatis默认的替换掉,引起不必要的问题。具体的原理我就不写了,设计到iBatis
的实现,太啰嗦。
发表评论
-
JVM的类加载过程
2011-06-01 23:35 1532classloader准备一个类大致分为三步: 1 加载 查找 ... -
maven2下载源码包参数
2011-05-10 14:51 0使maven2在下载依赖包的同时下载其源代码包的方法: 1. ... -
常用的测试组件
2010-11-16 11:00 0Cactus: HttpUnit: org.springfr ... -
iBatis小经验
2010-09-20 10:21 8541. 在MySQL下,对于autoincrement的pk,在 ... -
Spring AOP的配置方式
2010-09-17 17:09 9320在Spring中实现AOP根据版本不同,可以有大致四种配置方式 ... -
Spring对AOP的支持和限制
2010-09-15 15:28 1644目前AOP的三个主要实现为 AspectJ(http://ec ... -
对Spring AOP中一些概念的理解
2010-09-15 15:00 1329AOP可以方便的实现一些交叉事务的功能,使程序员能够专注于主要 ... -
Spring Security的配置
2010-09-14 17:43 0<bean id="authenticatio ... -
URL与编码
2010-09-12 01:03 0http://www.iteye.com/wiki/topic ... -
JUnit使用实践
2010-08-20 14:40 0一 单元测试的实践原则 1.单元测试应该能够独立执行,而不依赖 ... -
ibatis源代码
2010-07-29 10:26 0Nodlet: xml中Node处理方式的回调接口 -
iBatis 写法备忘录
2010-06-11 01:59 0记性太差,一些乱七八糟的写法,记下来方便以后copy (1) ... -
freemarker的eclipse插件
2010-01-13 16:33 846临时要用freemarker,可选的几个eclipse插件 ( ... -
Emma的Eclipse插件Elcemma安装
2009-07-16 11:12 3530Eclipse插件安装地址 http://update.ecl ...
相关推荐
此项目为MyBatis使用TypeHandler的示例 注意,测试需要在MySql中建表 附:建表语句及数据,导入Mysql运行即可 在Mysql命令窗口输入 set names 'utf8'; source 1.sql 将以下文件保存为1.sql DROP TABLE IF EXISTS `...
MyBatis使用自定义TypeHandler转换类型的实现方法 MyBatis是一款流行的ORM(Object-Relational Mapping)框架,提供了强大的数据库交互功能。然而,在使用MyBatis时,开发者可能会遇到类型转换的问题,特别是在处理...
除了基本的TypeHandler,Mybatis还提供了一些高级特性,如`ResultMap`中的`typeHandler`属性,可以针对特定列指定TypeHandler,以及`@TypeAlias`注解,用于简化类型别名的使用。 在实际项目中,我们可能会遇到需要...
完成以上步骤后,我们不再需要在resultMap中为每个枚举字段指定typeHandler属性,Mybatis会自动使用我们注册的自定义TypeHandler进行转换。 总结来说,自定义枚举TypeHandler并解决频繁指定的问题,需要深入理解...
解决在springboot+mybatis+postgresql时,数据库字段类型为json时,如何与mybatis进行映射
最后,我们可以在MyBatis的映射文件中使用自定义的TypeHandler。我们可以在映射文件中指定自定义的TypeHandler,以便将Java类型转换为数据库类型。 示例代码 -------- 下面是一个完整的示例代码,演示了如何自定义...
MyBatis 是一款著名的 Java 持久层...正确理解和使用 TypeHandler 不仅能提高代码的可读性和维护性,还能有效避免因类型转换错误导致的运行时异常。在实际开发中,我们应该根据具体需求灵活运用和扩展 TypeHandler。
当数据库字段需要与Java对象中的特定类型进行映射时,Mybatis会使用预定义或自定义的TypeHandler。以下是对"Mybatis实现自定义的typehandler三步曲"的详细解释: 第一步:实现接口 创建自定义TypeHandler时,你需要...
我们了解了什么是TypeHandler,如何自定义TypeHandler,以及使用自定义TypeHandler的优点。通过使用自定义TypeHandler,我们可以轻松地解决Java数据->MySQL数据的特殊类型转换问题,提高我们的数据库操作效率和代码...
在Mybatis中,枚举类型的数据处理是通过TypeHandler实现的。默认情况下,Mybatis提供了两种内置的枚举TypeHandler: 1. `EnumTypeHandler`: 这个TypeHandler将枚举对象转换为它们的字符串表示,即枚举的名称。在...
4. 使用`@TypeHandler`注解:对于实体类的属性,可以直接在字段上使用`@TypeHandler`注解指定对应的类型处理器。 通过深入理解和灵活运用`TypeHandlerCallback`,开发者可以更好地控制数据在Java应用和数据库之间的...
在这个例子中,`xmlFile`参数使用了自定义的TypeHandler,通过`typeHandler`属性指定。 需要注意的是,如果在查询时也需要使用自定义的TypeHandler,可以在ResultMap的属性标签中指定,方式与插入操作类似。例如:...
文件`chapter3`、`chapter3_2`和`chapter3_3`可能包含了关于这些TypeHandler的详细实现代码、示例和使用说明。通过阅读这些文件,你可以更深入地理解如何在实际项目中使用和自定义TypeHandler。 总的来说,熟练掌握...
在Java开发中,MyBatis是一个非常流行的持久层框架,它简化了数据库操作与对象之间的映射过程。本文将深入探讨在MyBatis中如何...在实践中,熟练掌握枚举和TypeHandler的使用,将有助于提高代码的可维护性和可读性。
在MyBatis的配置文件中,你需要为自定义的TypeHandler添加注册,这样MyBatis才能在处理CLOB类型时找到并使用它。例如: ```xml <typeHandler handler="com.example.ClobTypeHandler" /> ``` 3. **编写Type...
Spring Boot 枚举使用的坑整理 Spring Boot 枚举使用的坑整理是指在使用 Spring Boot 枚举时可能出现的一些问题和解决方法的总结。枚举类型是一种特殊的数据类型,它具有固定的值,且这些值不会被修改。在 Java 中...
接下来,我们谈谈如何使用自定义TypeHandler。TypeHandler是MyBatis处理Java类型与JDBC类型之间转换的接口,用于处理自定义类型的字段。当数据库中的字段需要与Java的枚举类型进行映射时,我们就需要自定义Type...
在我们数据库中有些时候会保存一些用户的敏感信息,比如:手机号、银行卡等信息,如果...由于我们系统中使用了Mybatis作为数据库持久层,因此决定使用Mybatis的TypeHandler或Plugin来解决 也可以自定义注解实现数据脱敏
在MyBatis中,自定义TypeHandler是非常重要的,它负责将Java对象转换为SQL值,以及将数据库返回的值转换回Java对象。对于`LONGBLOB`,我们可以创建一个名为`MyBlobTypeHandler`的类,继承自` BaseTypeHandler[]> `...