언제 부턴가.. 이클립스 에서 아이바티스 의 자동 완성 기능이 정상적으로 처리가 되지 않아 확인결과


기존 url 이 ( http://www.ibatis.com/dtd/sql-map-2.dtd  <-- 기존 )


지원을 하지 않아 발생 하며 , 지원이 되는 url 로 바꾸더라도 


최근 사이트의 경우 망분리로 인하여 외부 네트워크가 되지 않아 자동 완성이 안되는 상황이 많아 정리 토록 함. 


기존 xml 파일의 경우  아이바티스나 마이바티스 사용하는 경우 (예시는 아이바티스)


최상단에 . 


 <?xml version="1.0" encoding="euc-kr"?>

<!DOCTYPE sqlMap

PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"

"http://www.ibatis.com/dtd/sql-map-2.dtd">


와 같이 정의가 되어 있는데 . 기존의 경로가 다르거나 외부 접근이 안되는 경우 자동 완성이 안되는 것이다. 



접근이 가능한 경우 위 상단에 표시 되겠지만 현재 정상적으로 처리가 되지 않기 때문에 표시가 되지 않는다. 


따라서 dtd 파일을 로컬 PC 에 다운 받아 설정 하는 것이 가장 이상적이다. 


다운 경로 . http://ibatis.apache.org/dtd/

 

sql-map-2.dtd



해당 경로 에서 직접 sql-map-2.dtd 파일을 다운 받은 경우 이제 이클립스 에 등록을 해야 한다. 


preference > xml > xml catalog 

설정 에서 user specified enteris 에 포함을 시켜야 한다. 



입력 하는 부분은 두가지 인데 location  은 localpc 에 다운받은 dtd 파일을 넣으면 되고 (워크스페이스에 없다면 file system 클릭)

(공통 관리자가 workspace 에 포함 시키는 것도 좋은 방법 일듯 하다. 추가는 알아서 해야 겠지만.. 워크스페이스 경로는 개발자 마다 다름으로 xml 에 정의는 힘들듯.. )


key 부분에는 기존의 PUBLIC 으로 정의 되는 부분을 넣으면 된다. 

-//iBATIS.com//DTD SQL Map 2.0//EN




위와 같이 정상적으로 등록이 완료 되면 ( 자동완성이 안되는 경우 eclipse 종료후 다시 시작) 


 ctrl+space 가 안되는 


상황에서 하단과 같이 



정상적으로 아이바티스의 자동 완성기능이 작동 됨을 확인 할수 있다. 


끝!!!! 





Posted by 사라링

UPPER(REPLACE(REPLACE(REPLACE(A.BYR_EMAIL,CHR(10),''),CHR(13),''),' ',''))


되도록 DB 의 정보를 넣을때 체크 하여 넣는게 좋으나 연동 으로 인해 힘들경우 직접 REPLACE 를 이용 하여 제거 . 

Posted by 사라링

아이바티스 에서 xml 에 프로시져를 구현해보았다. 

DECLARE

V_CNT NUMBER;

V_KEY_SEQ NUMBER;

BEGIN

SELECT COUNT(*)

 INTO V_CNT

 FROM PUR_EPUR_KEY_MGT

WHERE KEY = #KEY#||TO_CHAR(SYSDATE,'YYYY');

IF V_CNT = 0 THEN

V_KEY_SEQ := 0;

ELSE

SELECT TO_NUMBER(MAX(KEY_SEQ)+1)

 INTO V_KEY_SEQ

 FROM PUR_EPUR_KEY_MGT

WHERE KEY = #KEY#||TO_CHAR(SYSDATE,'YYYY');

END IF;

INSERT INTO PUR_EPUR_KEY_MGT(

CONVERSATION_ID

,KEY

,KEY_SEQ

,INS_ID

,INS_DT

,UPT_ID

,UPT_DT

)VALUES(

#KEY#||TO_CHAR(SYSDATE,'YYYY')||LPAD(V_KEY_SEQ,8,'0')||'013'

,#KEY#||TO_CHAR(SYSDATE,'YYYY')

,V_KEY_SEQ

,#INS_ID# 

,SYSDATE

,#UPT_ID# 

,SYSDATE 

);

commit;

END;



로 구했는데 . 첫번째 프로세서 실행시 에는 문제가 없었으나 두번째에서 부터 문제가 발생 했다. 

확인해 보니 프로세서상 프로시져를 사용한후 오류가 생겨 트랜잭션이 롤백을 시도 햇는데 procedure 에서 실행한 쿼리 문이 제대로 롤백이 되지 않아

일어 나는 현상 이었다.


따라서 END; 위에 commit 를 추가 하여 문제를 해결했다.

프로세서 완료 후에는 commit 문장을 삭제함 .

 아이바티스및 프로세서의 트랜잭션을 전적으로 의지 하면 안된다는 교휵을 배웠다... 



Posted by 사라링

where 절에 in 으로 1개 또는 여러개의 값을 집어 넣어 검색 하는 방법이 있다. 


1. 

   SELECT * FROM ACT_RESL_MST WHERE ACCT_CD IN (SELECT ACCT_CD FROM ACT_ACCT_CD)


   이런 방식이다 하나의 컬럼을 출력 하는 쿼리 문을 IN 절에 집어 넣어 구현 하며 제일 구현 하기 쉬우며 풀스캔으로 메모리를 많이 먹는다 


2. 

    SELECT * FROM ACT_RESL_MST WHERE ACCT_CD IN ($SUPER_ACCT_CD$)

     

    로 파라미터를 넘기는 방법인데 기존의 ## 으로 묶어서 보내는 것이 아닌 $$ 으로 보내는 것이다 이것은 STATEMENT 와 PREPARESTATEMENT 의 차이로 알면 쉽다

      SUPER_ACCT_CD  파라미터의 값은 스트링 값은 반드시 ArrayList  또는 iterator 형식으로 넣어야 한다. 

  [

Map map = getLoginMap(request);

String temp_Incm_Cls = ((String)map.get("INCM_CD_CLS")).trim();

String[] rscherNo = temp_Incm_Cls.split(",");

List<String> rscherNo_List =Arrays.asList(rscherNo);

map.put("INCM_CD_CLS", rscherNo_List);


 ]



3. 

  SELECT * FROM ACT_RESL_MST 

 <dynamic prepend="WHERE">

         <isNotEmpty property= userNameList>

USERNAME IN 

      <iterate  property="userNameList" open="(" close=")" conjunction=",">

 #userNameList[]#

</iterate>

</isNotEmpty >

 </dynamic >


     이런식으로 직접적으로 LIST 형식 String 값을 map 에 담아 쿼리문에서 생성 하여 구현 한다 속도 측면에서는 가장 높으며 JAVA 단에서 LIST 형식으로 만드는

 작업을 해야 한다. 

설명 하자면 userNameList 라는 리스트에 1개 또는 그 이상 있을때 실행 되며 userNameList 안에는 그 수의 String 타입의 in 조건들이 있다 먼저 username 이 비어 있는지 확인 한후 값이 있다면 username IN 을 생성 한후 다음에 ( 값을 넣고 다음 값이 있는 경우 ',' 넣고 다 끈난 경우 ) 로 닫고 끈낸다. 


Posted by 사라링

동적쿼리

2012. 11. 19. 14:59

<펌글:http://blog.paran.com/devtopia/13828096>

실무에서 SQL문을 작성하다 보면 동적인 쿼리문 작성을 작성해야 할 때가 많이 있다.

이때 지겹게 if~else if 문을 통해 아주 지저분한 소스 코드를 생성할 때가 왕왕 있게 마련이다.

이때 ibatis에서는 아주 깔금하게 구현할 수 있는 방법을 제공해 준다.

 

<statement id="dynamicGetAccountList" resultMap="account-result">

  select * from account

  <dynamic prepend="WHERE">

    <isNotNull prepend="AND" property="firstName">

      (acc_first_name = #firstName#

    <isNotNull prepend="OR" property="lastName">

       acc_last_name = #lastName#

    </isNotNull>

    )

    </isNotNull>

    <isNotNull prepend="AND" property="emailAddress">

      acc_email like #emailAddress#

    </isNotNull>

    <isGreaterThan prepend="AND" property="id" campareValue="0">

      acc_id = #id#

    </isGreaterThan>

  </dynamic>

  order by acc_last_name

</statement>

 

상황에 의존적인 위 동적 statement로 부터 각각 다른 16가지의 SQL문이 생성될 수 있다. if-else구조와 문자열 연결을 코딩하는 경우 수백라인이 필요할 수도 있다.

동적 statement를 사용하는 것은 몇몇 조건적인 태그를 추가하는 것처럼 간단하게 작성할 수 있다.

 

이러한 조건들에 대해 간단히 정리하면 아래와 같다.

 

바이너리 조건 요소-바이너리 조건 요소는 정적값 또는 다른 프로퍼티값을 위한 프로퍼티값과 비교한다. 만약 결과가 true라면 몸체부분의 SQL쿼리가 포함된다.

 

바이너리 조건 속성

prepend

Statement에 붙을 오버라이딩 가능한 SQL부분(옵션)

property

비교되는 property(필수)

compareProperty

비교되는 다른 property (필수 또는 compareValue)

compareValue

비교되는 값(필수 또는 compareProperty)

 

<isEqual>

프로퍼티가 값 또는 다른 프로퍼티가 같은지 체크

<isNotEqual>

프로퍼티가 값 또는 다른 프로퍼티가 같지 않은지 체크

<isGreaterThan>

프로퍼티가 값 또는 다른 프로퍼티 보다 큰지 체크

<isGreaterEqual>

프로퍼티가 값 또는 다른 프로퍼티 보다 크거나 같은지 체크

<isLessThan>

프로퍼티가 값 또는 다른 프로퍼티 보다 작은지 체크

<isLessEqual>

프로퍼티가 값 또는 다른 프로퍼티 보다 작거나 같은지 체크

 

사용법 예제)

<isLessEqual prepend="AND" property="age" compareValue="18">

  ADOLESCENT = 'TRUE'

</isLessEqual>

 

단일 조건 요소-단일 조건 요소는 특수한 조건을 위해 프로퍼티의 상태를 체크한다.

prepend

statement에 붙을 오버라이딩 가능한 SQL부분(옵션)

property

체크하기 위한 프로퍼티(필수)

 

<isPropertyAvailable>

프로퍼티가 유효한지 체크

(이를 테면 파라미터의 프로퍼티이다.)

<isNotPropertyAvailable>

프로퍼티가 유효하지 않은지 체크

(이를 테면 파라미터의 프로퍼티가 아니다.)

<isNull>

프로퍼티가 null인지 체크

<isNotNull>

프로퍼티가 null이 아닌지 체크

<isEmpty>

Collection, 문자열 또는 String.valueOf() 프로퍼티가 null이거나 empty(“” or size() < 1)인지 체크

<isNotEmpty>

Collection, 문자열 또는 String.valueOf() 프로퍼티가 null 이아니거나 empty(“” or size() < 1)가 아닌지 체크

 

사용법 예제)

<isNotEmpty prepend="AND" property="firstName">

  FIRST_NAME = #firstName#

</isNotEmpty>


다른 요소들

Parameter Present : 파라미터 객체가 존재하는지 체크

Parameter Present Attributes : prepend - the statement에 붙을 오버라이딩 가능한 SQL부분

<isParameterPresent>

파라미터 객체가 존재(not null)하는지 체크

<isNotParameterPresent>

파라미터 객체가 존재하지(null) 않는지 체크

 

사용법 예제)

<isNotParameterPresent prepend="AND">

EMPLOYEE_TYPE = 'DEFAULT'

</isNotParameterPresent>


Iterate : 이 태그는 Collection을 반복하거나 리스트내 각각을 위해 몸체 부분을 반복한다.

Iterate Attributes :

  prepend - the statement에 붙을 오버라이딩 가능한 SQL부분 (옵션)

  property - 반복되기 위한 java.util.List타입의 프로퍼티 (필수)

  open - 반복의 전체를 열기 위한 문자열, 괄호를 위해 유용하다. (옵션)

  close - 반복의 전체를 닫기 위한 문자열, 괄호를 위해 유용하다. (옵션)

  conjunction - 각각의 반복 사이에 적용되기 위한 문자열, AND 그리고 OR을 위해 유용하다. (옵션)

<iterate>

java.util.List 타입의 프로퍼티 반복


사용법 예제)

<iterate prepend="AND" property="userNameList" open="(" close=")" conjunction="OR">

username = #userNameList[]#

</iterate>


주의:iterator요소를 사용할 때 리스트 프로퍼티의 끝에 중괄호[]를 포함하는 것은 중요하다. 중괄호는 문자열처럼 리스트를 간단하게 출력함으로부터 파서를 유지하기 위해 리스트처럼 객체를 구별한다.




== Array 를 list 로 


 Integer[] nums = { 1,2,3,4,5,6,7,8,9,10 };

    List<Integer> numList = Arrays.asList(nums);
    for (Integer integer : numList) {
        System.out.println(integer);
    }


Posted by 사라링

<procedure id="crdtorSttlAccNoSync" parameterClass="map">

BEGIN

MERGE INTO (

SELECT STTL_BK_CD,

STTL_ACC_NO

 FROM ACT_RESL_CRDTOR

WHERE RESL_NO = #RESL_NO#

) A

USING (

SELECT COMM_CD,

BK_CD,

BK_ACC_NO

 FROM ACT_STD_MGT

WHERE COMM_CD = '20-50'

) B

  ON (

1=1

)

WHEN MATCHED THEN

UPDATE

  SET A.STTL_BK_CD = B.BK_CD,

A.STTL_ACC_NO = B.BK_ACC_NO;

END;

</procedure>

Posted by 사라링

1) replaceAll 메소드 이용
public boolean isNumeric(String s) { 
    return s.replaceAll("[+-]?\\d+", "").equals("") ? true : false; 

 

2) Pattern 클래스 이용
public boolean isNumeric(String s) { 
    java.util.regex.Pattern pattern = Pattern.compile("[+-]?\\d+"); 
    return pattern.matcher(s).matches(); 




isNumeric(String.valueOf(strMap.get(col[1][i]))); 

이런식으로 데이터를 가져 오자. . 



public boolean checkDate(String str){

boolean dateValidity = true;

SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss",Locale.KOREA); //20041102101244

df.setLenient(false); // false 로 설정해야 엄밀한 해석을 함.

try {

Date dt = df.parse(str);

}

catch(ParseException pe){

dateValidity = false;

}catch(IllegalArgumentException ae){

dateValidity = false;

}

return dateValidity;

}

Posted by 사라링

검색문1. 


<isNotEmpty prepend="AND" property="SBJ">

UPPER(A.SBJ) LIKE '%' || UPPER(#SBJ#) || '%'

</isNotEmpty>


SBJ 의 value 값이 비어 있지 않다면. 


비교 대상자인 A,SBJ 를 대문자로 바꾸어 LIKE 로 

'%' || UPPER(#SBJ#)|| '%'  붙어 넣어 like 문을 완성 한다. 


즉 이 검색문은 대소문자를 구분 하지 않고 검색 한다. 


조건문1.


<isEqual prepend="AND" property="ACT_ROLE_YN" compareValue="N">

(Z.RQST_NO IS NOT NULL OR A.RQST_ID = #RQST_ID#)

</isEqual>


 이 역시 where 전에 붙고 있다. 

ACT_ROLE_YN 프로퍼티의 값이 N 과 같을때 실행 한다. 

Z.RQST_NO 의 값이 널이 아니거나 (OR)

A.RQST_ID 의 값이 RQST_ID라는 프로퍼티의 값과 같을때 라는 where 조건 문을 명시 하고 있다. 

Posted by 사라링

BLOG main image
.. by 사라링

카테고리

사라링님의 노트 (301)
JSP (31)
J-Query (41)
JAVA (24)
VM-WARE (0)
디자인패턴 (1)
스크랩 (0)
스트러츠 (3)
안드로이드 (11)
오라클 (45)
우분투-오라클 (1)
이클립스메뉴얼 (6)
스프링3.0 (23)
자바스크립트 (10)
HTML5.0 (17)
정보처리기사 (1)
기타(컴퓨터 관련) (1)
문제점 해결 (3)
프로젝트 (2)
AJAX (4)
하이버네이트 (3)
트러스트폼 (11)
Jeus (2)
재무관리(회계) (5)
정규식 (5)
아이바티스 (8)
취미 (2)
소프트웨어 보안 관련모음 (0)
정보보안기사 (6)
C언어 베이직 및 프로그램 (3)
보안 관련 용어 정리 (2)
넥사크로 (6)
Total :
Today : Yesterday :