`
realizeamg
  • 浏览: 32866 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

typehandler的使用

    博客分类:
  • Java
阅读更多
在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
的实现,太啰嗦。
分享到:
评论

相关推荐

    MyBatis使用TypeHandler示例

    此项目为MyBatis使用TypeHandler的示例 注意,测试需要在MySql中建表 附:建表语句及数据,导入Mysql运行即可 在Mysql命令窗口输入 set names 'utf8'; source 1.sql 将以下文件保存为1.sql DROP TABLE IF EXISTS `...

    MyBatis使用自定义TypeHandler转换类型的实现方法

    MyBatis使用自定义TypeHandler转换类型的实现方法 MyBatis是一款流行的ORM(Object-Relational Mapping)框架,提供了强大的数据库交互功能。然而,在使用MyBatis时,开发者可能会遇到类型转换的问题,特别是在处理...

    Mybatis类型转换介绍 TypeHandler

    除了基本的TypeHandler,Mybatis还提供了一些高级特性,如`ResultMap`中的`typeHandler`属性,可以针对特定列指定TypeHandler,以及`@TypeAlias`注解,用于简化类型别名的使用。 在实际项目中,我们可能会遇到需要...

    Mybatis实战之TypeHandler高级进阶

    完成以上步骤后,我们不再需要在resultMap中为每个枚举字段指定typeHandler属性,Mybatis会自动使用我们注册的自定义TypeHandler进行转换。 总结来说,自定义枚举TypeHandler并解决频繁指定的问题,需要深入理解...

    自定义TypeHandler,解决在springboot+mybatis+postgresql时,数据库字段类型为json时,如何与mybatis进行映射

    解决在springboot+mybatis+postgresql时,数据库字段类型为json时,如何与mybatis进行映射

    MyBatis自定义typeHandler的完整实例

    最后,我们可以在MyBatis的映射文件中使用自定义的TypeHandler。我们可以在映射文件中指定自定义的TypeHandler,以便将Java类型转换为数据库类型。 示例代码 -------- 下面是一个完整的示例代码,演示了如何自定义...

    Typehandler mybatis

    MyBatis 是一款著名的 Java 持久层...正确理解和使用 TypeHandler 不仅能提高代码的可读性和维护性,还能有效避免因类型转换错误导致的运行时异常。在实际开发中,我们应该根据具体需求灵活运用和扩展 TypeHandler。

    Mybatis实现自定义的typehandler三步曲

    当数据库字段需要与Java对象中的特定类型进行映射时,Mybatis会使用预定义或自定义的TypeHandler。以下是对"Mybatis实现自定义的typehandler三步曲"的详细解释: 第一步:实现接口 创建自定义TypeHandler时,你需要...

    Mybatis自定义TypeHandler解决特殊类型转换问题详解

    我们了解了什么是TypeHandler,如何自定义TypeHandler,以及使用自定义TypeHandler的优点。通过使用自定义TypeHandler,我们可以轻松地解决Java数据-&gt;MySQL数据的特殊类型转换问题,提高我们的数据库操作效率和代码...

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

    在Mybatis中,枚举类型的数据处理是通过TypeHandler实现的。默认情况下,Mybatis提供了两种内置的枚举TypeHandler: 1. `EnumTypeHandler`: 这个TypeHandler将枚举对象转换为它们的字符串表示,即枚举的名称。在...

    使用iBatis的类型处理器TypeHandlerCallback

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

    Mybatis实现自定义类型转换器TypeHandler的方法

    在这个例子中,`xmlFile`参数使用了自定义的TypeHandler,通过`typeHandler`属性指定。 需要注意的是,如果在查询时也需要使用自定义的TypeHandler,可以在ResultMap的属性标签中指定,方式与插入操作类似。例如:...

    mybatis入门之typeHanlder的三种使用案例

    文件`chapter3`、`chapter3_2`和`chapter3_3`可能包含了关于这些TypeHandler的详细实现代码、示例和使用说明。通过阅读这些文件,你可以更深入地理解如何在实际项目中使用和自定义TypeHandler。 总的来说,熟练掌握...

    mybatis入门实战之枚举类型

    在Java开发中,MyBatis是一个非常流行的持久层框架,它简化了数据库操作与对象之间的映射过程。本文将深入探讨在MyBatis中如何...在实践中,熟练掌握枚举和TypeHandler的使用,将有助于提高代码的可维护性和可读性。

    mybatis 对clob类型转换

    在MyBatis的配置文件中,你需要为自定义的TypeHandler添加注册,这样MyBatis才能在处理CLOB类型时找到并使用它。例如: ```xml &lt;typeHandler handler="com.example.ClobTypeHandler" /&gt; ``` 3. **编写Type...

    mybatis入门之级联1对1(无延迟加载)

    接下来,我们谈谈如何使用自定义TypeHandler。TypeHandler是MyBatis处理Java类型与JDBC类型之间转换的接口,用于处理自定义类型的字段。当数据库中的字段需要与Java的枚举类型进行映射时,我们就需要自定义Type...

    手机号码、邮箱等敏感数据前端显示脱敏处理的解决方案

    在我们数据库中有些时候会保存一些用户的敏感信息,比如:手机号、银行卡等信息,如果...由于我们系统中使用了Mybatis作为数据库持久层,因此决定使用Mybatis的TypeHandler或Plugin来解决 也可以自定义注解实现数据脱敏

    struts2+mybatis解决longblob字段问题

    在MyBatis中,自定义TypeHandler是非常重要的,它负责将Java对象转换为SQL值,以及将数据库返回的值转换回Java对象。对于`LONGBLOB`,我们可以创建一个名为`MyBlobTypeHandler`的类,继承自` BaseTypeHandler[]&gt; `...

    Mybatis编程示例:基于XML的实现

    使用mysql数据库,配置下数据库就可以直接运行 Mybatis编程步骤分为: 步骤1、创建好MySQL数据库 步骤2、在pom.xml中添加mysql-connector-java和Mybatis依赖 步骤3、创建实体类User(pojo) 步骤4、添加Mybatis全局...

Global site tag (gtag.js) - Google Analytics