ORACLE | query 로 VO 및 mybatis, ibatis에서 사용할 컬럼, resultMap 자동생성하기

2017. 1. 3. 15:22framework/MyBatis

query 로 VO 자동생성 및 DTO 자동생성하기와

mybatis, ibatis에서 사용할 컬럼과 resultMap 자동생성하기

 

 

 

query 를 사용하여 VO를 자동생성해보고, mybatis나 ibatis 에서 사용할 컬럼과 resultMap 도 자동생성해보자.

 

********* Oracle 에서만 사용가능합니다.

 

아래에 예제 테이블이 있다.

 

테이블명 : TEST_MEMBER_TABLE

 

흔히 사용하는 테이블과 컬럼의 모습이다.

 

컬럼은 언더바( _ ) 를 이용하여 단어들을 구분하고있다.

 



 

위 테이블을 가지고 VO 를 만들어 보자.

 

우리는 컬럼의 언더바를 포함한 채 사용할 경우도 있고,

 

언더바를 제외하고 단어와 단어를 연결할 때 첫문자를 대문자로 변경하여 사용할 경우도 있다.

 

두가지 경우를 모두 살펴본다.

 

VO 생성 : 언더바를 제외한 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
SELECT    '/** '
       || NVL (COMMENTS, COLUMN_NAME)
       || ' */
'
       || 'private '
       || CASE WHEN DATA_TYPE = 'NUMBER' THEN 'Integer ' ELSE 'String ' END
       || LOWER (SUBSTR (COLUMN_NAME, 01))
       || SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_'''), 2)
       || ';
' AS VO
  FROM (  SELECT A.COLUMN_ID,
                 A.COLUMN_NAME,
                 A.DATA_TYPE,
                 B.COMMENTS
            FROM ALL_TAB_COLUMNS A, ALL_COL_COMMENTS B
           WHERE     A.TABLE_NAME = B.TABLE_NAME
                 AND A.COLUMN_NAME = B.COLUMN_NAME
                 AND A.OWNER = B.OWNER
                 AND A.OWNER = LOWER('OWNER NAME')             /*owner name*/
                 AND A.TABLE_NAME = LOWER('TABLE NAME')       /*table name*/
        ORDER BY A.COLUMN_ID)
UNION ALL
SELECT    '/**
 * @return '
       || NVL (COMMENTS, COLUMN_NAME)
       || '
 */
'
       || 'public '
       || CASE WHEN DATA_TYPE = 'NUMBER' THEN 'Integer ' ELSE 'String ' END
       || 'get'
       || REPLACE (INITCAP (COLUMN_NAME), '_''')
       || '(){
    '
       || 'return '
       || LOWER (SUBSTR (COLUMN_NAME, 01))
       || SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_'''), 2)
       || ';
}
'
       || '
/**
 * @param '
       || LOWER (SUBSTR (COLUMN_NAME, 01))
       || SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_'''), 2)
       || ' '
       || NVL (COMMENTS, COLUMN_NAME)
       || '
 */
'
       || 'public void set'
       || REPLACE (INITCAP (COLUMN_NAME), '_''')
       || '('
       || CASE WHEN DATA_TYPE = 'NUMBER' THEN 'Integer ' ELSE 'String ' END
       || LOWER (SUBSTR (COLUMN_NAME, 01))
       || SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_'''), 2)
       || '){
    '
       || 'this.'
       || LOWER (SUBSTR (COLUMN_NAME, 01))
       || SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_'''), 2)
       || ' = '
       || LOWER (SUBSTR (COLUMN_NAME, 01))
       || SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_'''), 2)
       || ';
}
' AS VO
  FROM (  SELECT A.COLUMN_ID,
                 A.COLUMN_NAME,
                 A.DATA_TYPE,
                 B.COMMENTS
            FROM ALL_TAB_COLUMNS A, ALL_COL_COMMENTS B
           WHERE     A.TABLE_NAME = B.TABLE_NAME
                 AND A.COLUMN_NAME = B.COLUMN_NAME
                 AND A.OWNER = B.OWNER
                 AND A.OWNER = LOWER('OWNER NAME')                /*owner name*/
                 AND A.TABLE_NAME = LOWER('TABLE NAME')    /*table name*/
        ORDER BY A.COLUMN_ID)
cs

 

위 쿼리에서 OWNER NAME와 TABLE NAME 를 바꿔주어야 한다.

OWNER NAME, TABLE NAME 가 들어가는 곳은 19#, 20#, 76#, 77# 이다.

 

 

주의사항 :

 

데이터 타입은 string, int 만 구분한다.

혹시나 clob나 date, BigDecimal 등 타입을 사용해야 하는 곳은 없는지 미리 확인하고 적용해야 한다.

 

 

그럼 아래와 같은 결과를 얻을 수 있다.

줄바꿈까지 포함되어있기 때문에 결과에서는 아래와 같이 보인다.

당황하지 말고 복사하고 메모장같은곳에 붙혀넣기 하여 확인해 본다.

 



 

 

 

변수, 주석, setter, getter 까지 생성해 준다.

 

 

/** 아이디 */
private int memberId;

 

/** 이름 한글 */
private String memberNameKor;

 

/** 이름 영문 */
private String memberNameEng;

 

/** 부서 */
private String memberDept;

 

/** 주소 한글 */
private String memberAddrKor;

 

/** 주소 영문 */
private String memberAddrEng;

 

/**
 * @return 아이디
 */
public int getMemberId(){
    return memberId;
}

 

/**
 * @param memberId 아이디
 */
public void setMemberId(int memberId){
    this.memberId = memberId;
}

 

/**
 * @return 이름 한글
 */
public String getMemberNameKor(){
    return memberNameKor;
}

 

/**
 * @param memberNameKor 이름 한글
 */
public void setMemberNameKor(String memberNameKor){
    this.memberNameKor = memberNameKor;
}

 

/**
 * @return 이름 영문
 */
public String getMemberNameEng(){
    return memberNameEng;
}

 

/**
 * @param memberNameEng 이름 영문
 */
public void setMemberNameEng(String memberNameEng){
    this.memberNameEng = memberNameEng;
}

 

/**
 * @return 부서
 */
public String getMemberDept(){
    return memberDept;
}

 

/**
 * @param memberDept 부서
 */
public void setMemberDept(String memberDept){
    this.memberDept = memberDept;
}

 

/**
 * @return 주소 한글
 */
public String getMemberAddrKor(){
    return memberAddrKor;
}

 

/**
 * @param memberAddrKor 주소 한글
 */
public void setMemberAddrKor(String memberAddrKor){
    this.memberAddrKor = memberAddrKor;
}

 

/**
 * @return 주소 영문
 */
public String getMemberAddrEng(){
    return memberAddrEng;
}

 

/**
 * @param memberAddrEng 주소 영문
 */
public void setMemberAddrEng(String memberAddrEng){
    this.memberAddrEng = memberAddrEng;
}

 

 

 

VO 생성 : 언더바를 포함한 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
SELECT    '/** '
       || NVL (COMMENTS, COLUMN_NAME)
       || ' */
'
       || 'private '
       || CASE WHEN DATA_TYPE = 'NUMBER' THEN 'Integer ' ELSE 'String ' END
       || LOWER (COLUMN_NAME)
       || ';
' AS VO
  FROM (  SELECT A.COLUMN_ID,
                 A.COLUMN_NAME,
                 A.DATA_TYPE,
                 B.COMMENTS
            FROM ALL_TAB_COLUMNS A, ALL_COL_COMMENTS B
           WHERE     A.TABLE_NAME = B.TABLE_NAME
                 AND A.COLUMN_NAME = B.COLUMN_NAME
                 AND A.OWNER = B.OWNER
                 AND A.OWNER = LOWER('OWNER NAME')            /*owner name*/
                 AND A.TABLE_NAME = LOWER('TABLE NAME')       /*table name*/
        ORDER BY A.COLUMN_ID)
UNION ALL
SELECT    '/**
 * @return '
       || NVL (COMMENTS, COLUMN_NAME)
       || '
 */
'
       || 'public '
       || CASE WHEN DATA_TYPE = 'NUMBER' THEN 'Integer ' ELSE 'String ' END
       || 'get'
       || UPPER (SUBSTR (COLUMN_NAME, 01))
       || LOWER (SUBSTR (COLUMN_NAME, 2))
       || '(){
    '
       || 'return '
       || LOWER (COLUMN_NAME)
       || ';
}
'
       || '
/**
 * @param '
       || LOWER (COLUMN_NAME)
       || ' '
       || NVL (COMMENTS, COLUMN_NAME)
       || '
 */
'
       || 'public void set'
       || UPPER (SUBSTR (COLUMN_NAME, 01))
       || LOWER (SUBSTR (COLUMN_NAME, 2))
       || '('
       || CASE WHEN DATA_TYPE = 'NUMBER' THEN 'Integer ' ELSE 'String ' END
       || LOWER (COLUMN_NAME)
       || '){
    '
       || 'this.'
       || LOWER (COLUMN_NAME)
       || ' = '
       || LOWER (COLUMN_NAME)
       || ';
}
' AS VO
  FROM (  SELECT A.COLUMN_ID,
                 A.COLUMN_NAME,
                 A.DATA_TYPE,
                 B.COMMENTS
            FROM ALL_TAB_COLUMNS A, ALL_COL_COMMENTS B
           WHERE     A.TABLE_NAME = B.TABLE_NAME
                 AND A.COLUMN_NAME = B.COLUMN_NAME
                 AND A.OWNER = B.OWNER
                 AND A.OWNER = LOWER('OWNER NAME')           /*owner name*/
                 AND A.TABLE_NAME = LOWER('TABLE NAME')       /*table name*/
        ORDER BY A.COLUMN_ID)
cs

마찬가지로 OWNER NAME와 TABLE NAME 를 바꿔주어야 한다.

OWNER NAME, TABLE NAME 가 들어가는 곳은 18#, 19#, 72#, 73# 이다.

 

 

주의사항 :

 

데이터 타입은 string, int 만 구분한다.

혹시나 clob나 date, BigDecimal 등 타입을 사용해야 하는 곳은 없는지 미리 확인하고 적용해야 한다.

 

 

결과는 똑같아 보인다.

 

하지만 복사하여 메모장 등에서 확인해보면 언더바가 포함되어 있다.

 

 

언더바를 포함한 변수, 주석, setter, getter 를 생성해 준다.

 

 

/** 아이디 */
private int member_id;

 

/** 이름 한글 */
private String member_name_kor;

 

/** 이름 영문 */
private String member_name_eng;

 

/** 부서 */
private String member_dept;

 

/** 주소 한글 */
private String member_addr_kor;

 

/** 주소 영문 */
private String member_addr_eng;

 

/**
 * @return 아이디
 */
public int getMember_id(){
    return member_id;
}

 

/**
 * @param member_id 아이디
 */
public void setMember_id(int member_id){
    this.member_id = member_id;
}

 

/**
 * @return 이름 한글
 */
public String getMember_name_kor(){
    return member_name_kor;
}

 

/**
 * @param member_name_kor 이름 한글
 */
public void setMember_name_kor(String member_name_kor){
    this.member_name_kor = member_name_kor;
}

 

/**
 * @return 이름 영문
 */
public String getMember_name_eng(){
    return member_name_eng;
}

 

/**
 * @param member_name_eng 이름 영문
 */
public void setMember_name_eng(String member_name_eng){
    this.member_name_eng = member_name_eng;
}

 

/**
 * @return 부서
 */
public String getMember_dept(){
    return member_dept;
}

 

/**
 * @param member_dept 부서
 */
public void setMember_dept(String member_dept){
    this.member_dept = member_dept;
}

 

/**
 * @return 주소 한글
 */
public String getMember_addr_kor(){
    return member_addr_kor;
}

 

/**
 * @param member_addr_kor 주소 한글
 */
public void setMember_addr_kor(String member_addr_kor){
    this.member_addr_kor = member_addr_kor;
}

 

/**
 * @return 주소 영문
 */
public String getMember_addr_eng(){
    return member_addr_eng;
}

 

/**
 * @param member_addr_eng 주소 영문
 */
public void setMember_addr_eng(String member_addr_eng){
    this.member_addr_eng = member_addr_eng;
}

 

 

 

 

 

 

마지막으로 mybatis나 ibatis 에서 사용할 컬럼이나 resultMap 으로 사용할 result를 자동생성해 보자.

 

역시 언더바를 포함하거나 포함하지 않는 경우를 모두 생성한다.

 

mybatis, ibatis에서 사용할 컬럼 및 Result

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
SELECT COLUMN_NAME || ',' AS C1,
       LOWER (COLUMN_NAME) || ',' AS C2,
          LOWER (SUBSTR (COLUMN_NAME, 01))
       || SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_'''), 2)
       || ','
          AS C3,
       '#' || LOWER (COLUMN_NAME) || '#,' AS C4,
          '#'
       || LOWER (SUBSTR (COLUMN_NAME, 01))
       || SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_'''), 2)
       || '#,'
          AS C5,
       '#{' || LOWER (COLUMN_NAME) || '#},' AS C6,
          '#{'
       || LOWER (SUBSTR (COLUMN_NAME, 01))
       || SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_'''), 2)
       || '}#,'
          AS C7,
          '<result property="'
       || LOWER (COLUMN_NAME)
       || '" column="'
       || COLUMN_NAME
       || '" />' AS R1,
          '<result property="'
       || LOWER (SUBSTR (COLUMN_NAME, 01))
       || SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_'''), 2)
       || '" column="'
       || COLUMN_NAME
       || '" />' AS R2
  FROM (  SELECT A.COLUMN_ID,
                 A.COLUMN_NAME,
                 A.DATA_TYPE,
                 B.COMMENTS
            FROM ALL_TAB_COLUMNS A, ALL_COL_COMMENTS B
           WHERE     A.TABLE_NAME = B.TABLE_NAME
                 AND A.COLUMN_NAME = B.COLUMN_NAME
                 AND A.OWNER = B.OWNER
                 AND A.OWNER = LOWER('OWNER NAME')          /*owner name*/
                 AND A.TABLE_NAME = LOWER('TABLE NAME')      /*table name*/
        ORDER BY A.COLUMN_ID)
cs

 

OWNER NAME와 TABLE NAME 를 바꿔주어야 한다.

OWNER NAME, TABLE NAME 가 들어가는 곳은 38#, 39# 이다.

 

 

주의사항 :

 

콤마(,) 가 모든 컬럼의 끝에 붙어있기 때문에

마지막에 사용되는 컬럼은 콤마(,)를 제거해야 한다.

 

 

아래와 같은 결과를 얻을 수 있다.

 

 

 

이미지가 너무 길어서 잘 보이지 않으니 잘라서 확대해 보겠다.

 

 

Insert 문에서 사용할 수 있는 컬럼

Update 문에서 사용할 수 있는 건 쿼리 바꿔서 사용하면되니까 굳이 만들지 않음

 

 

 

 

Insert 문에서 사용할 수 있는 컬럼

Update 문에서 사용할 수 있는 건 위 쿼리 바꿔서 사용하면되니까 굳이 만들지 않음

 

 

 

 

resultMap 에서 사용할 컬럼

 

 

 

끝 ~