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 dto = (ArrayList) 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也可在这里设置

         handler="com.package.MyHandler"/>



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

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

你可能感兴趣的:(mybatis,TypeHandler,自定义参数类型)