Mybatis 전송list 매개 변수가oracle 저장 프로세스를 호출하는 해결 방법

어떻게 MyBatis 전송 List 유형 파라미터를 이용하여 데이터베이스에 저장하는 과정에서 대량으로 데이터를 삽입합니까?
MyBatis의 매개변수가 List 유형일 경우 어떻게 처리합니까?모두들 MyBatis가 대량의 데이터를 일괄 처리하는 것은 업무가 굴러가는 것을 하기 어렵다는 것을 알고 있다. (사무는 Spring에서 관리한다.) 모두 논리를 저장에 쓰는 것도 골치 아픈 일이다. (파라미터 길이도 제한이 있다.) 그러면 나는 파라미터를 백엔드에서 단일 또는 여러 개의list 집합으로 봉인하고 MyBatis를 통해 이 파라미터를 데이터베이스 저장 과정에 직접 전달하는 것을 생각한다.첫째, MyBatis가 대량으로 데이터를 삽입하는 많은 제한에서 벗어났다. (예를 들어 실시간으로 메인 키를 되돌릴 수 없고foreach 라벨 순환 집합의 길이가 제한된다.) 둘째, 저장소에서 유연하게 업무를 제어하는 것이다. 그러나 이것은 두 가지 문제와 관련된다. MyBatis의 xml 파일에서 어떻게 봉인하고 BaseTypeHandler를 이용해야 하는가?
이 문제에 대해 하루의 연구를 거쳐 마침내 통과된 셈이다. 해결 방법을 말해 보자.
1. 데이터베이스 테이블을 만들면 모두가 자신의 라이브러리 테이블을 가지고 있기 때문에 이 단계는 기본적으로 넘어갈 수 있다.내가 여기서 라이브러리를 붙인 것은 모두가 안에 있는 매개 변수에 대응하기 위해서이다.
데이터베이스 테이블:

create table ZD_UNIT_MENU 
( 
 unit_id VARCHAR2(32), 
 menu_id VARCHAR2(32) 
) 
2. 데이터베이스에 해당하는 자바 객체(Oracle의 유형)와 그룹을 만듭니다.

CREATE OR REPLACE TYPE unit_menu_obj AS OBJECT( 
 unitId VARCHAR2(32), 
 menuId VARCHAR2(32) 
); 
CREATE OR REPLACE TYPE unit_menu_table AS table OF unit_menu_obj; 
3. 저장 프로세스:

create or replace procedure save_unit_power(list0 in unit_menu_table,result0 out int) as 
 sql_bind varchar(200); 
begin 
 FOR i IN 1 .. list0.count LOOP  
  sql_bind := 'insert into ZD_UNIT_MENU(UNIT_ID,MENU_ID) values('''||list0(i).unitId||''', '''||list0(i).menuId||''' )'; 
  execute immediate sql_bind; 
 end loop;  
 commit;  
 -- , 1 
 result0 := 1; 
 -- ,  
 EXCEPTION 
   WHEN OTHERS THEN 
     result0 := -1;-- -1 
   ROLLBACK; 
end save_unit_power; 
4. mybatis의 설정을 다시 봅시다.

<parameterMap type="java.util.Map" id="_map"> 
    <parameter property="list0" jdbcType="ARRAY" 
      javaType="java.util.List" mode="IN" typeHandler="com.zd.util.ListHandler"/> 
    <parameter property="result0" jdbcType="DECIMAL" 
      javaType="java.lang.Integer" mode="OUT" /> 
 </parameterMap> 
 <select id="addUnitPower" statementType="CALLABLE" parameterMap="_map"> 
    <![CDATA[ 
    CALL save_unit_power(?,?) 
    ]]> 
 </select> 
5. 내가 어떻게 호출하는지 볼까?내가 직접 내 서버 코드를 붙였으니 dao층의 것은 필요 없다.

List<UnitMenu> list = new ArrayList<UnitMenu>(); 
  Map<String, Object> _map = new HashMap<String, Object>(); 
  String[] menuIds = menuTreeIds.split(","); 
  JSONObject job = new JSONObject(); 
  int result = -1; 
  for(int i = 0; i < menuIds.length; i++){ 
    UnitMenu um = new UnitMenu(); 
    um.setMenuId(menuIds[i]); 
    um.setUnitId(unitId); 
    list.add(um); 
  } 
  _map.put("list0", list); 
  _map.put("result0", ""); 
  unitMenuMapper.addUnitPower(_map); 
  System.out.println("================================================_map = "+_map.toString()); 
  result = (Integer)_map.get("result0"); 
  System.out.println("================================================result = "+result); 
6. 아주 중요한 점은 세심한 사람이 알아차릴 것이다. 마퍼에서.xml 설정에는 typeHandler 설정이 있습니다. 그 안에 설정된 것은 실제로 제가 쓴 클래스입니다. 이 클래스의 역할은 자바의list를 데이터베이스에서 우리가 만든 대상과 그룹으로 바꾸는 것입니다. 코드를 보십시오.

package com.zd.util; 
 import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.List; 
import oracle.sql.ARRAY; 
import oracle.sql.ArrayDescriptor; 
import oracle.sql.STRUCT; 
import oracle.sql.StructDescriptor; 
import org.apache.ibatis.type.BaseTypeHandler; 
import org.apache.ibatis.type.JdbcType; 
import com.zd.model.system.UnitMenu; 
public class ListHandler extends BaseTypeHandler{ 
  @Override 
  public Object getNullableResult(ResultSet arg0, String arg1) 
      throws SQLException { 
    // TODO Auto-generated method stub 
    return null; 
  } 
  @Override 
  public Object getNullableResult(CallableStatement arg0, int arg1) 
      throws SQLException { 
    // TODO Auto-generated method stub 
    return null; 
  } 
  @SuppressWarnings("unchecked") 
  @Override 
  public void setNonNullParameter(java.sql.PreparedStatement parameterSetter, int i, 
      Object o, JdbcType jdbcType) throws SQLException { 
    Connection conn = null; 
    try { 
      if(null != o){ 
        List<UnitMenu> list = (ArrayList<UnitMenu>) o; 
        conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.88:1521:orcl", "tctscm", "tctscm"); 
        // , , , :orai18n.jar 
        ARRAY array = getArray(conn, "UNIT_MENU_OBJ", "UNIT_MENU_TABLE", list); 
        parameterSetter.setArray(i, array); 
      } 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } finally{ 
      if(null != conn){ 
        conn.close(); 
      } 
    } 
  } 
  @SuppressWarnings("rawtypes") 
  private ARRAY getArray(Connection con,String OracleObj, String Oraclelist, List<UnitMenu> listData) throws Exception { 
    ARRAY array = null; 
    ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist, con); 
    STRUCT[] structs = new STRUCT[listData.size()]; 
    if (listData != null && listData.size() > 0){ 
      StructDescriptor structdesc = new StructDescriptor(OracleObj, con); 
      for (int i = 0; i < listData.size(); i++){ 
        Object[] result = {listData.get(i).getUnitId(),listData.get(i).getMenuId()}; 
        structs[i] = new STRUCT(structdesc, con, result); 
      } 
      array = new ARRAY(desc, con, structs); 
    }else{ 
      array = new ARRAY(desc, con, structs); 
    } 
    return array; 
  } 
} 
위에서 말한 것은 여러분께 소개해 드린 Mybatis 전송list 매개 변수가oracle 저장 프로세스를 호출하는 해결 방법입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 점이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기