ITPub博客

首页 > 应用开发 > Java > myBatis自定义传入参数类型(TypeHandler)

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

Java 作者:self_control 时间:2015-01-08 21:45:16 1 删除 编辑
为了要在myBatis查询时使用特殊的数据类型时,使用通常的jdbcType不能满足需要的时候,可以使用自定义的类型TypeHandler。 

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

以下为Orcale类型: 
Sql代码  收藏代码
  1. create or replace  
  2. TYPE Employee AS OBJECT   
  3. (  
  4.   ID    NUMBER,  
  5.   NAME  VARCHAR2(100 BYTE)  
  6. )  
  7.   
  8. create or replace  
  9. TYPE Employee_TABLE   
  10. AS TABLE OF Employee;  


有存储过程如下: 
Sql代码  收藏代码
  1. create or replace  
  2. PROCEDURE Employee_Process  
  3. (  
  4.   FK_LIST IN Employee_TABLE    
  5. ) AS   
  6. BEGIN  
  7.   FOR I IN 1..FK_LIST.COUNT LOOP  
  8.     --操作  
  9.   END LOOP;  
  10.   COMMIT;  
  11. END Employee_Process;  


自定义handler 
Java代码  收藏代码
  1. import ...  
  2.   
  3. //这个jdbcType对应mapper文件中对应的jdbcType  
  4. //如果此处不做配置也可以在mybatis-config.xml中配置  
  5. @MappedJdbcTypes(JdbcType.ARRAY)  
  6. public class MyHandler implements TypeHandler {  
  7.   
  8.     public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {  
  9.   
  10.         //获取OracleConnection  
  11.         C3P0NativeJdbcExtractor cp30NativeJdbcExtractor = (C3P0NativeJdbcExtractor) new C3P0NativeJdbcExtractor();  
  12.         OracleConnection oracleConn=(OracleConnection)cp30NativeJdbcExtractor.getNativeConnection(ps.getConnection());  
  13.         //这个parameter就是我们自己在mapper中传入的参数  
  14.         List dto = (ArrayList) parameter;  
  15.         StructDescriptor sd = new StructDescriptor("Employee",oracleConn);  
  16.         STRUCT[] result = new STRUCT[dto.size()];  
  17.         for(int index = 0; index < dto.size(); index++){  
  18.             AccountCommissionDetailDto d = dto.get(index);  
  19.             Object[] o = new Object[3];  
  20.             o[0] = new Long("1"); //id  
  21.             o[1] = new String("aaa"); //name  
  22.             result[index] = new STRUCT(sd,oracleConn,o);  
  23.         }  
  24.         ArrayDescriptor des_Employee_TABLE = ArrayDescriptor.createDescriptor("Employee_TABLE",oracleConn);  
  25.         ARRAY oracle_array = new ARRAY(des_Employee_TABLE,oracleConn,result);  
  26.         ps.setArray(i, oracle_array);  
  27.     }  
  28.   
  29.     public Object getResult(ResultSet rs, String columnName) throws SQLException {  
  30.         log.error("no result!");  
  31.         return null;  
  32.     }  
  33.   
  34.     public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {  
  35.         log.error("no result!");  
  36.         return null;  
  37.     }  
  38. }  


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


    最后只要在mapper中做如下设置就能使用了 
    Xml代码  收藏代码
    1. #{dtos,jdbcType=ARRAY,javaType=list}  

    或者直接定义需要调用的Handler的类型 
    Xml代码  收藏代码
    1. #{dtos,jdbcType=ARRAY,javaType=list,typeHandler=com.package.MyHandler}  

    来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30066956/viewspace-1395237/ ,如需转载,请注明出处,否则将追究法律责任。

    请登录后发表评论 登录
    全部评论