2017. 1. 3. 15:22ㆍframework/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, 0, 1))
|| 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, 0, 1))
|| SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_', ''), 2)
|| ';
}
'
|| '
/**
* @param '
|| LOWER (SUBSTR (COLUMN_NAME, 0, 1))
|| 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, 0, 1))
|| SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_', ''), 2)
|| '){
'
|| 'this.'
|| LOWER (SUBSTR (COLUMN_NAME, 0, 1))
|| SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_', ''), 2)
|| ' = '
|| LOWER (SUBSTR (COLUMN_NAME, 0, 1))
|| 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 까지 생성해 준다.
/** 아이디 */
/** 이름 한글 */
/** 이름 영문 */
/** 부서 */
/** 주소 한글 */
/** 주소 영문 */
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
|
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, 0, 1))
|| LOWER (SUBSTR (COLUMN_NAME, 2))
|| '(){
'
|| 'return '
|| LOWER (COLUMN_NAME)
|| ';
}
'
|| '
/**
* @param '
|| LOWER (COLUMN_NAME)
|| ' '
|| NVL (COMMENTS, COLUMN_NAME)
|| '
*/
'
|| 'public void set'
|| UPPER (SUBSTR (COLUMN_NAME, 0, 1))
|| 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 를 생성해 준다.
/** 아이디 */
/** 이름 한글 */
/** 이름 영문 */
/** 부서 */
/** 주소 한글 */
/** 주소 영문 */
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/**
/** |
마지막으로 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, 0, 1))
|| SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_', ''), 2)
|| ','
AS C3,
'#' || LOWER (COLUMN_NAME) || '#,' AS C4,
'#'
|| LOWER (SUBSTR (COLUMN_NAME, 0, 1))
|| SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_', ''), 2)
|| '#,'
AS C5,
'#{' || LOWER (COLUMN_NAME) || '#},' AS C6,
'#{'
|| LOWER (SUBSTR (COLUMN_NAME, 0, 1))
|| SUBSTR (REPLACE (INITCAP (COLUMN_NAME), '_', ''), 2)
|| '}#,'
AS C7,
'<result property="'
|| LOWER (COLUMN_NAME)
|| '" column="'
|| COLUMN_NAME
|| '" />' AS R1,
'<result property="'
|| LOWER (SUBSTR (COLUMN_NAME, 0, 1))
|| 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 에서 사용할 컬럼
끝 ~
'framework > MyBatis' 카테고리의 다른 글
Mybatis DAO에서 쿼리 추출 및 로그 찍기 (Log 라이브러리 사용안함) (0) | 2018.07.31 |
---|---|
MyBatis isNull isEmpty 사용하기 (0) | 2017.06.28 |
MyBatis resultType이 Map일경우 key를 소문자로 만들기 (2) | 2017.06.28 |
Mybatis > RowBounds 의 고찰 (8) | 2016.08.09 |
다이나믹 쿼리 / if / 공백체크 / 숫자 0 / 이슈 | MyBatis (2) | 2016.01.05 |
NumberformatException / if /문자 1글자 비교 / equals / 이슈 | MyBatis (4) | 2016.01.05 |