项目种部分业务用数据库实现效率比较高,所以决定用oracle函数实现。但是数据结构有点复杂,本来打算用字符串解析的方式去解析参数,但是感觉效率又不行,就决定使用数据库对象,捣鼓了一两天,终于给实现了,分享一下:
数据库用的是oracle,数据结构如下:
应用使用的是mybatis,SQL 映射xml 配置如下:
在mybatis的配置文件中加上:
最后主要是类型转换器的实现了,网上很多例子,但是要么数据类型没这个复杂,要么就是不能正常运行,经过分分钟报错的痛苦经历后,终于给正确实现了,代码如下:
java 类如下:
基本上到这里就可以写测试代码了测试了。。
数据库用的是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>
点击(此处)折叠或打开
- <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);
- }
-
- }
点击(此处)折叠或打开
- public class Wnlss {
- String uuid;
- String wnlssid;
- String usercode;
- String modifybalance;
- List<String> validbtidlist;
- List<String> invalidbtidlist;
-
- getter and setter...
- }
基本上到这里就可以写测试代码了测试了。。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30741760/viewspace-2126501/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30741760/viewspace-2126501/