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

myBatis自定义传入参数类型(TypeHandler)

阅读更多
为了要在myBatis查询时使用特殊的数据类型时,使用通常的jdbcType不能满足需要的时候,可以使用自定义的类型TypeHandler。

例如,有一个存储过程,我们自定义了一个类型Employee,Employee中有两个属性id(long型),name(String型),然后又要将其放在一个List中,作为参数给一个存储过程批量处理。

以下为Orcale类型:
create or replace
TYPE Employee AS OBJECT 
(
  ID    NUMBER,
  NAME  VARCHAR2(100 BYTE)
)

create or replace
TYPE Employee_TABLE 
AS TABLE OF Employee;


有存储过程如下:
create or replace
PROCEDURE Employee_Process
(
  FK_LIST IN Employee_TABLE  
) AS 
BEGIN
  FOR I IN 1..FK_LIST.COUNT LOOP
    --操作
  END LOOP;
  COMMIT;
END Employee_Process;


自定义handler
import ...

//这个jdbcType对应mapper文件中对应的jdbcType
//如果此处不做配置也可以在mybatis-config.xml中配置
@MappedJdbcTypes(JdbcType.ARRAY)
public class MyHandler implements TypeHandler {

    public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {

        //获取OracleConnection
        C3P0NativeJdbcExtractor cp30NativeJdbcExtractor = (C3P0NativeJdbcExtractor) new C3P0NativeJdbcExtractor();
        OracleConnection oracleConn=(OracleConnection)cp30NativeJdbcExtractor.getNativeConnection(ps.getConnection());
        //这个parameter就是我们自己在mapper中传入的参数
        List<Object> dto = (ArrayList<Object>) parameter;
        StructDescriptor sd = new StructDescriptor("Employee",oracleConn);
        STRUCT[] result = new STRUCT[dto.size()];
        for(int index = 0; index < dto.size(); index++){
            AccountCommissionDetailDto d = dto.get(index);
            Object[] o = new Object[3];
            o[0] = new Long("1"); //id
            o[1] = new String("aaa"); //name
            result[index] = new STRUCT(sd,oracleConn,o);
        }
        ArrayDescriptor des_Employee_TABLE = ArrayDescriptor.createDescriptor("Employee_TABLE",oracleConn);
        ARRAY oracle_array = new ARRAY(des_Employee_TABLE,oracleConn,result);
        ps.setArray(i, oracle_array);
    }

    public Object getResult(ResultSet rs, String columnName) throws SQLException {
        log.error("no result!");
        return null;
    }

    public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
        log.error("no result!");
        return null;
    }
}


mybatis-config.xml中加入如下的代码声明自定义handler
如果没有在Handler中注释jdbcType也可在这里设置
<typeHandlers>
        <typeHandler javaType="list" <!--jdbcType="ARRAY"--> handler="com.package.MyHandler"/>
</typeHandlers>


最后只要在mapper中做如下设置就能使用了
#{dtos,jdbcType=ARRAY,javaType=list}

或者直接定义需要调用的Handler的类型
#{dtos,jdbcType=ARRAY,javaType=list,typeHandler=com.package.MyHandler}
分享到:
评论

相关推荐

    mybatis自定义类型处理器TypehHandler示例详解

    本文将深入探讨MyBatis的自定义类型处理器TypeHandler,并通过一个具体的加密解密案例来阐述其应用。 类型处理器的作用在于,当MyBatis执行SQL语句时,需要将Java对象设置到PreparedStatement的参数中,或从...

    mybatis直接执行sql语句后续之一

    6. **TypeHandler**:负责Java类型与JDBC类型的转换,确保数据在Java对象和数据库之间正确地进行类型转换。 7. **工具类SqlSessionManager和SqlSessionFactoryBuilder**:SqlSessionManager提供了更高级的事务管理...

    Mybatis调用PostgreSQL存储过程实现数组入参传递

    在Java开发中,MyBatis是一个常用的持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,简化了...通过自定义`TypeHandler`,我们可以使MyBatis与PostgreSQL的数组类型无缝对接,实现高效、准确的数据操作。

    mybatis-3.0.4源码

    MyBatis的TypeHandler接口定义了Java类型与JDBC类型之间的转换,系统内置了一些常见的类型处理器,同时支持自定义类型处理器以处理特殊类型。 通过对`mybatis-3.0.4源码`的深入研究,开发者不仅可以理解MyBatis的...

    mybatis-3-mybatis-3.5.4-src-read.zip

    TypeHandler负责Java类型与JDBC类型之间的转换。MyBatis内置了多种常见的类型处理器,也可以自定义处理特殊类型的转换。 10. **插件机制**: MyBatis允许开发者编写Interceptor插件,拦截特定的Executor、...

    mybatis-3.2.7.zip

    - 使用`#{}`语法来引用传入的参数,例如`SELECT * FROM table WHERE id = #{id}`,这会自动处理参数类型和SQL注入问题。 6. **结果映射**: - 结果映射用于将查询结果映射到Java对象,可以使用`&lt;resultMap&gt;`定义...

    Mybatis高级映射查询

    此外,还可以自定义 TypeHandler 实现特定类型的转换。 6. 预编译的 SQL 语句:Mybatis 使用 PreparedStatement 执行 SQL,避免了 SQL 注入问题,并且提高了执行效率。预编译的 SQL 语句可以预先解析并优化,只替换...

    MyBatis3DTD约束

    8. **typeHandler**:用于指定特定类型的字段或参数的处理方式,例如日期、自定义对象等。 9. **result**和**id**:在resultMap中定义,分别表示普通属性和主键属性,可以包含column、javaType、jdbcType等属性,...

    mybatis-3.3.1源码

    9. **TypeHandler**:MyBatis的类型处理器,用于处理Java类型和JDBC类型的转换,确保数据的正确性。 10. **XMLConfigBuilder**和**MapperBuilderAssistant**:这两个类主要用于解析XML配置文件,构建Configuration...

    mybatis-paramDemo.zip

    7. **TypeHandler**:MyBatis 提供了 TypeHandler 接口,用于处理 Java 类型到 JDBC 类型的转换。如果你需要自定义类型转换,可以实现该接口并注册到 MyBatis 配置中。 8. **结果映射 ResultMap**:MyBatis 提供了 ...

    HadLuo-Mybatis3.rar

    Mybatis内置了许多默认的TypeHandler,同时也支持自定义TypeHandler以处理特定的Java类型。 9. **MapperRegistry** MapperRegistry负责管理Mapper配置,它将Mapper接口与XML配置文件或注解关联起来,使得我们在...

    Mybatis常见面试题

    15. **Mybatis的参数处理器**:Mybatis提供了TypeHandler接口,可以自定义类型处理器,处理特殊类型的参数和返回值。 以上内容只是Mybatis面试中可能涉及的一部分知识点,深入理解并掌握这些内容,将有助于你在面试...

    mybatis源码

    7. **TypeHandler**: 类型处理器负责Java类型与数据库类型的转换,确保数据的正确存取。 总的来说,MyBatis源码的分析有助于我们理解其工作原理,提升我们对ORM框架设计的理解,从而更好地利用MyBatis进行数据库...

    学习mybatis

    9. **TypeHandler 类型处理器**: 处理 Java 类型与 JDBC 类型之间的转换,如 Date 与 Timestamp 的转换。 学习 MyBatis 需要掌握以下几个关键点: 1. **配置文件**: 配置 MyBatis 的主配置文件,包括数据源、事务...

    MyBatis.rar

    7. **TypeHandler类型处理器**:处理Java类型与数据库类型的转换。MyBatis内置了许多常见的类型处理器,同时允许用户自定义类型处理器以处理特殊类型。 8. **Mapper动态代理**:当使用注解配置时,MyBatis会生成...

    mybatis-3.4.5.zip(jar包)

    通过Map、Pojo对象或自定义TypeHandler来映射参数,使得传入参数更加灵活。 3. 结果集映射:MyBatis可以自动将查询结果映射到Java对象,支持一对一、一对多、多对多等复杂关系的映射。同时,它可以处理自定义的结果...

    mybatis-3.2.8jar包及其源码jar包

    - 可以自定义类型处理器,通过实现`org.apache.ibatis.type.TypeHandler`接口。 通过这个3.2.8版本的jar包及源码,开发者不仅可以了解MyBatis的基础用法,还可以深入研究其内部实现,提升对数据库操作的优化能力,...

    MyBatis中如何优雅的使用枚举详解

    &lt;typeHandler handler="com.example.typehandler.EnumByCodeTypeHandler" javaType="com.example.entity.enums.ComputerState"/&gt; ``` 6. 使用枚举在Mapper接口及XML映射文件中,现在可以放心地使用我们的枚举类型...

    第一个mybatis.zip

    - MyBatis的扩展:如自定义插件、TypeHandler等,以满足特定需求。 通过对压缩包中的文件进行分析,可以深入学习和实践这些知识点,从而更好地掌握MyBatis框架。记得动手实践,理论结合实际,是学习任何技术的最佳...

Global site tag (gtag.js) - Google Analytics