研究了一下,写出来,方便有同样需求的兄弟。如果哪位大神有更好的方法,欢迎赐教。
在数据库层面需要做一下步骤
1:创建数据库表、创建数据库类型
1--创建测试数据库 2create table USERS 3( 4 USERCODE VARCHAR2(20), 5 LOGINNAME VARCHAR2(20) 6) 7--定义oracle对象 8create or replace type user_obj as object 9( 10 idx varchar2(20), 11 name varchar2(30) 12); 13create or replace type user_tab as table of user_obj; 14 15--创建一个测试存储过程 16create or replace procedure test_batch 17( 18 p_items in user_tab, 19 p_out out string 20) is 21 mob user_obj; 22begin 23 for idx in p_items.first() .. p_items.last() 24 loop 25 mob := p_items(idx); 26 insert into users(usercode, loginname) 27 values(mob.idx, mob.name); 28 end loop; 29 commit; 30 p_out := '成功'; 31 return; 32end;
2: Java代码开发
1// 定义JAVA实体对象,该对象与数据库实体OBJ对应 2import java.sql.Connection; 3import java.sql.SQLException; 4 5import oracle.jdbc.OracleTypes; 6import oracle.jpub.runtime.MutableStruct; 7import oracle.sql.Datum; 8import oracle.sql.ORAData; 9import oracle.sql.ORADataFactory; 10 11public class User implements ORAData{ 12 private String idx; 13 private String name; 14 15 public static final String typeName = "USER_OBJ"; //这里需要大写 16 protected MutableStruct struct; 17 static int[] sqlType = { OracleTypes.VARCHAR, OracleTypes.VARCHAR}; 18 static ORADataFactory[] factory = new ORADataFactory[sqlType.length]; 19 20 public User() { 21 struct = new MutableStruct(new Object[sqlType.length], sqlType, factory); 22 } 23 public User(String idx,String name) { 24 this(); 25 this.idx=idx; 26 this.name=name; 27 } 28 @Override 29 public Datum toDatum(Connection conn) throws SQLException { 30 struct.setAttribute(0, this.idx); 31 struct.setAttribute(1, this.name); 32 return struct.toDatum(conn, typeName); 33 } 34 public String getIdx() { 35 return idx; 36 } 37 public void setIdx(String idx) { 38 this.idx = idx; 39 } 40 public String getName() { 41 return name; 42 } 43 public void setName(String name) { 44 this.name = name; 45 } 46} 47 48// 定义测试方法 49@Test 50public void testProcedure() { 51 List<User> userList = new ArrayList<User>(); 52 User s1 = new User(); 53 User s2 = new User(); 54 55 s1.setIdx("110"); 56 s1.setName("zz"); 57 58 s2.setIdx("111"); 59 s2.setName("xx"); 60 61 userList.add(s1); 62 userList.add(s2); 63 64 String sql = "{call test_batch(?,?)}"; 65 String resp = jdbcTemplate.execute(sql, new CallableStatementCallback<String>() { 66 public String doInCallableStatement(CallableStatement cstmt) throws SQLException, DataAccessException { 67 Connection con = cstmt.getConnection().getMetaData().getConnection(); 68 ArrayDescriptor tabDesc = ArrayDescriptor.createDescriptor("USER_TAB", con); 69 ARRAY vArray = new ARRAY(tabDesc, con, userList.toArray()); 70 cstmt.setArray(1, vArray); 71 cstmt.registerOutParameter(2, Types.VARCHAR); 72 cstmt.execute(); 73 74 return cstmt.getString(2); 75 } 76 }); 77 System.out.println(resp); 78}
3: 测试结果
测试成功,数据库查询结果,成功。