Mybatis 전송list 매개 변수가oracle 저장 프로세스를 호출하는 해결 방법
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 저장 프로세스를 호출하는 해결 방법입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 점이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL/마이바티스 | 동적 쿼리 사용A라는 서비스에 해당하는 테이블을 조인하고 조회하는 데 사용됩니다. 나중에 공통화를 위해 B 및 C 서비스도 추가됩니다. A, B, C 서비스는 모두 단일 쿼리에서 작동할 수 있도록 공통화되어야 합니다. 테이블에 각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.