BaseTypeHandler를 확장하여  사용자 정의 테이블에 대응되는 객체를 만들어 줍니다.
 
Handler
public class TypeUpDataVibHandler extends BaseTypeHandler<List<TypeUpDataVibVo>>{ 
	  @Override 
	  public void setNonNullParameter(PreparedStatement ps, 
	      int i, List<TypeUpDataVibVo> parameter, JdbcType jdbcType) 
	      throws SQLException { 
	    SQLServerDataTable tvp = new SQLServerDataTable(); 

        tvp.addColumnMetadata("C1" ,java.sql.Types.NVARCHAR); 
        tvp.addColumnMetadata("C2" ,java.sql.Types.NVARCHAR); 
        tvp.addColumnMetadata("C3" ,java.sql.Types.NVARCHAR); 
        tvp.addColumnMetadata("C4" ,java.sql.Types.NVARCHAR); 
        tvp.addColumnMetadata("C5" ,java.sql.Types.NVARCHAR); 
        tvp.addColumnMetadata("C6" ,java.sql.Types.NVARCHAR); 

	    for (TypeUpDataVibVo param : parameter) { 
	    	tvp.addRow( 

	    			param.getC1(), 
	    			param.getC2(), 
	    			param.getC3(), 
	    			param.getC4(), 
	    			param.getC5(), 
	    			param.getC6()
				); 
	    } 
	    ps.unwrap(SQLServerPreparedStatement.class).setStructured(i, "TYPE_UP_DATA_VIB_BULK", tvp); 
	  } 
	  @Override 
	  public List<TypeUpDataVibVo> getNullableResult(ResultSet rs, String columnName) throws SQLException { 
	    return null; 
	  } 
	  @Override 
	  public List<TypeUpDataVibVo> getNullableResult(ResultSet rs, int columnIndex) throws SQLException { 
	    return null; 
	  } 
	  @Override 
	  public List<TypeUpDataVibVo> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { 
	    return null; 
	  } 
}
 

VO

public class TypeUpDataVibVo { 
	String C1; 
	String C2; 
	String C3; 
	String C4; 
	String C5; 
	String C6; 


	public String getC1() { 
		return C1; 
	} 
	public void setC1(String c1) { 
		C1 = c1; 
	} 
	public String getC2() { 
		return C2; 
	} 
	public void setC2(String c2) { 
		C2 = c2; 
	} 
	public String getC3() { 
		return C3; 
	} 
	public void setC3(String c3) { 
		C3 = c3; 
	} 
	public String getC4() { 
		return C4; 
	} 
	public void setC4(String c4) { 
		C4 = c4; 
	} 
	public String getC5() { 
		return C5; 
	} 
	public void setC5(String c5) { 
		C5 = c5; 
	} 
	public String getC6() { 
		return C6; 
	} 
	public void setC6(String c6) { 
		C6 = c6; 
	} 
}

 

xml 

<select id="saveUpload_bulk" statementType="CALLABLE" resultType="hashMap"> 
{ 
    call P_BULK(#{list, typeHandler=kr.common.data.TypeUpDataVibHandler}) 
} 
</select>
 
service 
@Override 
public void saveUpload_bulk(List<TypeUpDataVibVo> list) throws SQLServerException { 
    tsMapper.saveUpload_bulk(list); 
}

테이블 반환 매개 변수 사용

 

멀티 로우를 데이터 삽입시에 SQLServerDataTable 를 사용하여 한번에 table parameter로 넘기는 방법 넘기는 방법

 

pom.xml

<dependency> 
    <groupId>com.microsoft.sqlserver</groupId> 
    <artifactId>mssql-jdbc</artifactId> 
    <version>9.2.1.jre8</version> 
</dependency>

 

controller
List<HashMap<String, Object>> mapList = new ArrayList<>(); 
for( int i = 0; i < list1.size(); i++ ) { 
    HashMap<String, Object> paramMap = (HashMap<String, Object>) params.clone(); 
    String key = list1.get(i).get(0); 
    paramMap.put("x1", list1.get(i).get(1)); 
    paramMap.put("x2", list1.get(i).get(3)); 
    paramMap.put("y1", list2.get(i).get(key).getField1()); 
    paramMap.put("y2", list2.get(i).get(key).getField2()); 
    paramMap.put("z1", list3.get(i).get(key).getField1()); 
    paramMap.put("z2", list3.get(i).get(key).getField2()); 
    mapList.add(paramMap); 
}				 
tsServiceImpl.saveQma003Upload_bulk(mapList);
 
service
@Autowired 
private DataSource dataSource;
table parameter에 row를 add하여 프로시저 호출

 

public boolean saveUpload_bulk(List<HashMap<String, Object>> mapList) throws SQLServerException { 
	        SQLServerDataTable tvp = new SQLServerDataTable(); 
	        // Define metadata for the data table.   
	        
	        tvp.addColumnMetadata("C1" ,java.sql.Types.NVARCHAR); 
	        tvp.addColumnMetadata("C2" ,java.sql.Types.NVARCHAR); 
	        tvp.addColumnMetadata("C3" ,java.sql.Types.NVARCHAR); 
	        tvp.addColumnMetadata("C4" ,java.sql.Types.NVARCHAR); 
	        tvp.addColumnMetadata("C5" ,java.sql.Types.NVARCHAR); 
	        tvp.addColumnMetadata("C6" ,java.sql.Types.NVARCHAR); 
	         
	        for (HashMap<String, Object> params : mapList) { 
	        	 tvp.addRow( 
	        				StringUtil.blankIfNull(params.get("x1")),//c1 
	        				StringUtil.blankIfNull(params.get("x2")),//c2 
	        				StringUtil.blankIfNull(params.get("y1")),//c3 
	        				StringUtil.blankIfNull(params.get("y2")),//c4 
	        				StringUtil.blankIfNull(params.get("z1")),//c5 
	        				StringUtil.blankIfNull(params.get("z2")),//c6 
	                ); 
			}			 
	         
	        String SQL_COMMAND = "{call P_BULK (?)}"; 
	         
	        try  { 
	        	CallableStatement  callableStmt  = dataSource.getConnection().prepareCall(SQL_COMMAND); 
	        	SQLServerPreparedStatement sqlServerStatement = callableStmt.unwrap(SQLServerPreparedStatement.class); 
	        			 
	        	sqlServerStatement.setStructured(1, "TYPE_UP_DATA_VIB_BULK", tvp); 
	        	return sqlServerStatement.execute(); 
	        } catch (SQLTimeoutException e) { 
				// TODO Auto-generated catch block 
				e.printStackTrace(); 
			} catch (SQLException e1) { 
				// TODO Auto-generated catch block 
				e1.printStackTrace(); 
			} 
	         
	        return false; 
	    }
 
MSSQL
테이블 반환 매개 변수 형식
CREATE TYPE [dbo].[TYPE_UP_DATA_VIB_BULK] AS TABLE( 
	[C1] [nvarchar](50) NULL, 
	[C2] [nvarchar](50) NULL, 
	[C3] [nvarchar](50) NULL, 
	[C4] [nvarchar](50) NULL, 
	[C5] [nvarchar](50) NULL, 
	[C6] [nvarchar](50) NULL
)
 
프로시저
ALTER PROCEDURE [dbo].[P_BULK]  
( 
    @itblParam TYPE_UP_DATA_VIB_BULK Readonly, 
	@p_error_code       VARCHAR(100) = ''   OUTPUT,     -- 사용자 에러코드 리턴   
    @p_row_count        INT = 0             OUTPUT,     -- 실행/리턴하는 레코드행수  
    @p_error_note       NVARCHAR(100) = ''  OUTPUT,     -- 사용자 지정 문자열   
    @p_return_str       NVARCHAR(100) = '' OUTPUT,     -- 사용자 지정 반환값   
    @p_error_str        NVARCHAR(1000) = '' OUTPUT,     -- 오류메세지  
    @ErrorState         VARCHAR(500) = ''   OUTPUT,     -- 오류번호/심각도/오류상태번호오류발생루틴내의 줄번호 
    @ErrorProcedure     NVARCHAR(200) = ''  OUTPUT      -- 오류발생 프로시저/트리거   
)  
AS  
SET NOCOUNT ON   
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
--select * from UP_DATA_VIB_VURK; 
BEGIN  
    BEGIN TRY 
       -----------------------------------------------------------------------------------------------------------------------  
        -- 첫번째 리턴 레코드셋 처리  --첫 번째 Excel Insert 
		INSERT INTO UP_DATA_VIB_VURK  
		(C1, C2, C3, C4, C5, C6) 
		SELECT  
		C1, C2, C3, C4, C5, C6
		FROM @itblParam AS nr; 
		 SELECT @p_row_count = @@ROWCOUNT 
        -- 에러가 없을 경우에 정상적인 처리 진행 
        IF @p_row_count > 0 
            SET @p_error_code = 'MSG0002'                                   -- 정상적으로 등록되었습니다. 
        ELSE 
            SET @p_error_code = 'MSG0029'                                   -- 등록된 레코드가 없습니다.   
        -----------------------------------------------------------------------------------------------------------------------  
    END TRY 
    BEGIN CATCH 
        SELECT @p_error_code =  CASE SUBSTRING('N',1,1) 
                                  WHEN 'Q' THEN 'ERR0006'                 -- 조회시 에러가 발생하였습니다.  
                                  WHEN 'N' THEN 'ERR0008'                 -- 등록시 오류가 발생하였습니다. 
                                  WHEN 'U' THEN 'ERR0009'                 -- 수정시 오류가 발생하였습니다. 
                                  WHEN 'D' THEN 'ERR0010'                 -- 삭제시 오류가 발생하였습니다. 
                                           ELSE 'ERR0000' 
                                  END 
        SELECT @ErrorState = CONVERT(VARCHAR(100), ERROR_NUMBER()) + '|' + CONVERT(VARCHAR(100), ERROR_SEVERITY()) + '|' + CONVERT(VARCHAR(100), ERROR_STATE()) + '|' + CONVERT(VARCHAR(100), ERROR_LINE()), 
                @ErrorProcedure = 'PRC=' + ERROR_PROCEDURE(), @p_error_str = ERROR_MESSAGE(); 
    END CATCH; 
END
 

개요 

Selenium을 이용한 웹 크롤러

GUI 환경에서 설정하여 순차적 실행 자동화 프로그램 

기본 기능 

1. URL이동 

2. INPUT에 지정한 값을 입력 

3. 버튼 클릭 

4. FRAME 이동 

5. 글 목록 가져오기  

6. 가져온 글 저장하기 

설정한 값들을 순차적 실행.

 

프로그램 다운로드 

1. GITHUB에 전체 소스 및 실행파일이 올라가 있으며 하기 URL 다운로드

 

 

세부설명

 

1.  그룹 리스트

  - 작업 리스트의 묶음을 관리하기 위한 그룹 리스트

 
2. 작업 리스트

  - 하나의 작업을 지정할 할 수 있습니다.

  - 컬럼정보
 
이름 작업이름
Target구분
1. single :하나의 element에 대한 수행
2. multiple : 부모 element에 대한 하위 element를 수행할때
    multiple이고 target정보가 동일한 것을 하나의 작업 그룹으로
    지정됨
3. url : 이동
4. frame : frame이동
Target정보 Target input
액션_구분 1. click
2. get
3. set
선택자구분 1. xpath
2. id
3. class
4. query_selector
선택자 선택자 input
Input 액션 set인 경우 input입력 
확인 선택 행 실행 
위로 행 위로 이동
아래로 행 아래로 이동

3. 실행 결과 : 실행 시 단위 이름 결과가 출력

4. 그룹 실행 결과 : multiple의 경우 하위 element를 테이블 형태로 출력됨.

 

네이버 카페 글 목록 가져오기 설정

1. 그룹 추가 

2. url 이동 

3. 카페 메뉴 클릭 

 

4. 프레임 이동

 

5. 글 가져오기 설정 

 

6. 실행 > 글가져오기

 

 

+ Recent posts