PL/SQL 复杂自定义对象类型与java类型映射

    项目种部分业务用数据库实现效率比较高,所以决定用oracle函数实现。但是数据结构有点复杂,本来打算用字符串解析的方式去解析参数,但是感觉效率又不行,就决定使用数据库对象,捣鼓了一两天,终于给实现了,分享一下:
 
数据库用的是oracle,数据结构如下:

点击(此处)折叠或打开

  1. create or replace type ty_btid is table of varchar2(100)
  2. create or replace type ty_wnlss as object
  3.   (
  4.     uuid varchar2(100),
  5.     wnlsid varchar2(100),
  6.     usercode varchar2(100),
  7.     modifybalance varchar2(100),
  8.     validbtidlist ty_btid,
  9.     invalidbtidlist ty_btid
  10.   )
  11. create or replace type ty_wnlsslist is table of ty_wnlss;

  12. 测试函数:
  13. create or replace function f_object_test(p_wnlsslist ty_wnlsslist) return number
  14. is
  15. begin
  16. ...
  17. end;



应用使用的是mybatis,SQL 映射xml 配置如下:

点击(此处)折叠或打开

  1. <select id="findItemsList" statementType="CALLABLE" parameterType="java.util.Map" >
  2.       {
  3.        #{result,mode=OUT,jdbcType=INTEGER} = call f_object_test( #{parame,jdbcType=ARRAY,jdbcTypeName=TY_WNLSSLIST, mode=IN,typeHandler=com.coc.typehander.ObjectTypeHander} )
  4.      }
  5.    </select>
在mybatis的配置文件中加上:

点击(此处)折叠或打开

  1. <typeHandlers>
  2.         <typeHandler javaType="list" handler="com.coc.typehander.ObjectTypeHander" />
  3. </typeHandlers>
最后主要是类型转换器的实现了,网上很多例子,但是要么数据类型没这个复杂,要么就是不能正常运行,经过分分钟报错的痛苦经历后,终于给正确实现了,代码如下:

点击(此处)折叠或打开

  1. public class ObjectTypeHander extends BaseTypeHandler<Object> {

  2.     @Override
  3.     public Object getNullableResult(CallableStatement arg0, int arg1) throws SQLException {
  4.         
  5.         return null;
  6.     }

  7.     @Override
  8.     public Object getNullableResult(ResultSet arg0, int arg1) throws SQLException {
  9.         // TODO Auto-generated method stub
  10.         return null;
  11.     }

  12.     @Override
  13.     public Object getNullableResult(ResultSet arg0, String arg1) throws SQLException {
  14.         // TODO Auto-generated method stub
  15.         return null;
  16.     }

  17.     @SuppressWarnings("unchecked")
  18.     @Override
  19.     public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
  20.         Connection conn = ps.getConnection();
  21.          //这里必须使用oracle的connection,否则报错。根据项目使用的数据源不同,这里的获取方法也不一样
  22.         OracleConnection oracleConn = (OracleConnection) ((DelegatingConnection) conn).getInnermostDelegate();
  23.         List<Wnlss> dto = (List<Wnlss>) parameter;
  24.         StructDescriptor sd = new StructDescriptor("TY_WNLSS",oracleConn);
  25.         STRUCT[] result = new STRUCT[dto.size()];
  26.         for(int index = 0; index < dto.size(); index++){
  27.             Winloss d = (Wnlss) dto.get(index);
  28.             Object[] o = new Object[6];  //对应java类的成员,不能多不能少
  29.             o[0] = d.getUuid();
  30.             o[1] = d.getWnlssid();
  31.             o[2] = d.getUserCode();
  32.             o[3] = d.getModifybalance();

  33.             //List 对象要单独再做映射
  34.             ArrayDescriptor desc = ArrayDescriptor.createDescriptor("TY_BTID", oracleConn);
  35.             ARRAY Validbetidlist = new ARRAY(desc, oracleConn, d.getValidbetidlist().toArray());
  36.             ArrayDescriptor desc2 = ArrayDescriptor.createDescriptor("TY_BTID", oracleConn);
  37.             ARRAY Invalidbtidlist = new ARRAY(desc2, oracleConn, d.getInvalidbetidlist().toArray());
  38.             o[4] = Validbtidlist;
  39.             o[5] = Invalidbtidlist;
  40.             result[index] = new STRUCT(sd,oracleConn,o);
  41.         }
  42.         ArrayDescriptor des_Employee_TABLE = ArrayDescriptor.createDescriptor("TY_WNLSSLIST",oracleConn);
  43.         ARRAY oracle_array = new ARRAY(des_Employee_TABLE,oracleConn,result);
  44.         ps.setArray(i, oracle_array);
  45.     }
  46.     
  47. }
java 类如下:

点击(此处)折叠或打开

  1. public class Wnlss {
  2.     String uuid;
  3.     String wnlssid;
  4.     String usercode;
  5.     String modifybalance;
  6.     List<String> validbtidlist;
  7.     List<String> invalidbtidlist;

  8.     getter and setter...
  9. }

基本上到这里就可以写测试代码了测试了。。





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

转载于:http://blog.itpub.net/30741760/viewspace-2126501/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值