为了要在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 ...
-
-
-
-
@MappedJdbcTypes(JdbcType.ARRAY)
-
public class MyHandler implements TypeHandler {
-
-
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
-
-
-
C3P0NativeJdbcExtractor cp30NativeJdbcExtractor = (C3P0NativeJdbcExtractor) new C3P0NativeJdbcExtractor();
-
OracleConnection oracleConn=(OracleConnection)cp30NativeJdbcExtractor.getNativeConnection(ps.getConnection());
-
-
List
-
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");
-
o[1] = new String("aaa");
-
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" handler="com.package.MyHandler"/>
-
typeHandlers>
最后只要在mapper中做如下设置就能使用了
-
#{dtos,jdbcType=ARRAY,javaType=list}
或者直接定义需要调用的Handler的类型
-
#{dtos,jdbcType=ARRAY,javaType=list,typeHandler=com.package.MyHandler}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30066956/viewspace-1395237/
,如需转载,请注明出处,否则将追究法律责任。