项目种部分业务用数据库实现效率比较高,所以决定用oracle函数实现。但是数据结构有点复杂,本来打算用字符串解析的方式去解析参数,但是感觉效率又不行,就决定使用数据库对象,捣鼓了一两天,终于给实现了,分享一下:
数据库用的是oracle,数据结构如下:
-
create or replace type ty_btid is table of varchar2(100);
-
create or replace type ty_wnlss as object
-
(
-
uuid varchar2(100),
-
wnlsid varchar2(100),
-
usercode varchar2(100),
-
modifybalance varchar2(100),
-
validbtidlist ty_btid,
-
invalidbtidlist ty_btid
-
);
-
create or replace type ty_wnlsslist is table of ty_wnlss;
-
-
测试函数:
-
create or replace function f_object_test(p_wnlsslist ty_wnlsslist) return number
-
is
-
begin
-
...
-
end;
应用使用的是mybatis,SQL 映射xml 配置如下:
-
<select id="findItemsList" statementType="CALLABLE" parameterType="java.util.Map" >
-
{
-
#{result,mode=OUT,jdbcType=INTEGER} = call f_object_test( #{parame,jdbcType=ARRAY,jdbcTypeName=TY_WNLSSLIST, mode=IN,typeHandler=com.coc.typehander.ObjectTypeHander} )
-
}
-
</select>
在mybatis的配置文件中加上:
-
<typeHandlers>
-
<typeHandler javaType="list" handler="com.coc.typehander.ObjectTypeHander" />
-
</typeHandlers>
最后主要是类型转换器的实现了,网上很多例子,但是要么数据类型没这个复杂,要么就是不能正常运行,经过分分钟报错的痛苦经历后,终于给正确实现了,代码如下:
-
public class ObjectTypeHander extends BaseTypeHandler<Object> {
-
-
@Override
-
public Object getNullableResult(CallableStatement arg0, int arg1) throws SQLException {
-
-
return null;
-
}
-
-
@Override
-
public Object getNullableResult(ResultSet arg0, int arg1) throws SQLException {
-
// TODO Auto-generated method stub
-
return null;
-
}
-
-
@Override
-
public Object getNullableResult(ResultSet arg0, String arg1) throws SQLException {
-
// TODO Auto-generated method stub
-
return null;
-
}
-
-
@SuppressWarnings("unchecked")
-
@Override
-
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
-
Connection conn = ps.getConnection();
-
//这里必须使用oracle的connection,否则报错。根据项目使用的数据源不同,这里的获取方法也不一样
-
OracleConnection oracleConn = (OracleConnection) ((DelegatingConnection) conn).getInnermostDelegate();
-
List<Wnlss> dto = (List<Wnlss>) parameter;
-
StructDescriptor sd = new StructDescriptor("TY_WNLSS",oracleConn);
-
STRUCT[] result = new STRUCT[dto.size()];
-
for(int index = 0; index < dto.size(); index++){
-
Winloss d = (Wnlss) dto.get(index);
-
Object[] o = new Object[6]; //对应java类的成员,不能多不能少
-
o[0] = d.getUuid();
-
o[1] = d.getWnlssid();
-
o[2] = d.getUserCode();
-
o[3] = d.getModifybalance();
-
//List 对象要单独再做映射
-
ArrayDescriptor desc = ArrayDescriptor.createDescriptor("TY_BTID", oracleConn);
-
ARRAY Validbetidlist = new ARRAY(desc, oracleConn, d.getValidbetidlist().toArray());
-
ArrayDescriptor desc2 = ArrayDescriptor.createDescriptor("TY_BTID", oracleConn);
-
ARRAY Invalidbtidlist = new ARRAY(desc2, oracleConn, d.getInvalidbetidlist().toArray());
-
o[4] = Validbtidlist;
-
o[5] = Invalidbtidlist;
-
result[index] = new STRUCT(sd,oracleConn,o);
-
}
-
ArrayDescriptor des_Employee_TABLE = ArrayDescriptor.createDescriptor("TY_WNLSSLIST",oracleConn);
-
ARRAY oracle_array = new ARRAY(des_Employee_TABLE,oracleConn,result);
-
ps.setArray(i, oracle_array);
-
}
-
-
}
java 类如下:
-
public class Wnlss {
-
String uuid;
-
String wnlssid;
-
String usercode;
-
String modifybalance;
-
List<String> validbtidlist;
-
List<String> invalidbtidlist;
-
-
getter and setter...
-
}
基本上到这里就可以写测试代码了测试了。。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30741760/viewspace-2126501/
,如需转载,请注明出处,否则将追究法律责任。