티스토리 뷰

# Tip. bean Graph를 보면서 MyBatis 전체 구조 파악하기


  • 각 bean 설명

    • AOP 영역+dataSource은 다른 것을 쓰더라도 공통적으로 사용한다.

    • sqlSessionFactory 와 sqlSessionTemplate은 MyBatis 전용이다.

      • 코드를 보면 알수 있다. sqlSessionFactory와 sqlSessionTemplate은 org.mybatis로 시작된다. dataSource는 org.apache로 시작하기 때문에 공통사항이다.





    • dataSource : 연결에 필요한 커넥션들을 미리 만들어놔서 커넥션 풀에 담아두는 역할이였고,

    • sqlSessionFactory : MyBatis가 db에 붙을 수 있게 만들어주는 부분

    • sqlSessionTemplate : MyBatis가 db가 연동되어있는 세션을 이용해서 CRUD를 할 수 있게 만들어준다.



  • bean 간의 관계

    • sqlSessionFactory와 dataSource와의 관계는 서로 참조관계이다.

    • sqlSessionTemplate과 sqlSessionFactory는 서로 참조관계이다.


CRUD


# insert

  • <insert id=”insertAuthor”> 형식으로 적는다.


  • 쿼리문 적을때 원래는 ?(물음표) 를 적었지만, myBatis에서는 #{ 멤버변수 } 형태로 적는다.

    • 예를 들어, LoginVO에 memberId라는 멤버변수가 있다면, #{memberId} 이렇게 적으면 된다.

    • 내부적으로 memberId를 가져올 수 있는 getter를 호출한다. 즉, 위의 예라면 getMemberId()를 호출한다.



  • 그렇다면, #{memberId}의 어떤 타입인지를 알아야 한다.

    • <insert id=”insertAuthor” parameterType=”User”> 형식으로 적는다. parameterType 에 어디서 가져오는지를 적는 것이다. 여기에서는 User 클래스에서 가져오겠다는 뜻이다.

    • 그러면 여러가지 클래스를 가져오고 싶다면 어떻게 하는지 궁금할 수 있다. 정답을 말하면, 여러개의 클래스를 보낼 수 없다.

→ 여러개의 클래스가 반드시 필요하다면 어떻게 할까?

Extends, list 등 여러가지 방법이 있지만, Map을 사용한다. myBatis 가 map을 강력하게 지원한다.


  • myBatis는 #{ 멤버변수 } 와 ${멤버변수} 형식을 모두 지원한다.

그러나, ${멤버변수} 형식은 보안에 매우 취약하므로, 절대 사용하지 않는다. 차라리 여러개의 쿼리를 만드는 것이 불편하지만 보안을 지키는 방법이다.


# select

  • <select id=”selectPerson” parameterType=”int” resultType=”hashmap”> 형식으로 적는다.

  • Select의 경우에는 resultType이 반드시 존재한다. resultType은 이 구문에 의해 리턴되는 결과값을 나타낸다.

  • resultType 이 VO로 넣으면 자동으로 MyBatis가 List에 담아준다. 즉, resultType=”LectureVO”라면, List<LectureVO>로 바꾸어서 저장해준다.



그럼 이제 한번 실습을 해보자. HR계정의 EMPLOYEES 테이블의 모든 데이터를 조회해보자.


1. 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
79
80
81
82
83
84
85
86
87
88
89
90
91
package com.ktds.smahn.vo;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class EmployeesVO {
    
    private Logger logger = LoggerFactory.getLogger(EmployeesVO.class);
    
 
    private int employeeId;
    private String firstName;
    private String lastName;
    private String email;
    private int salary;
    private double commissionPct;
    private String hireDate;
 
    public int getEmployeeId() {
        logger.info("getEmployeeId 호출됨.");
        return employeeId;
    }
 
    public void setEmployeeId(int employeeId) {
        logger.info("setEmployeeId 호출됨.");
        this.employeeId = employeeId;
    }
 
    public String getFirstName() {
        logger.info("getFirstName 호출됨.");
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        logger.info("setFirstName 호출됨.");
        this.firstName = firstName;
    }
 
    public String getLastName() {
        logger.info("getLastName 호출됨.");
        return lastName;
    }
 
    public void setLastName(String lastName) {
        logger.info("setLastName 호출됨.");
        this.lastName = lastName;
    }
 
    public String getEmail() {
        logger.info("getEmail 호출됨.");
        return email;
    }
 
    public void setEmail(String email) {
        logger.info("setEmail 호출됨.");
        this.email = email;
    }
 
    public int getSalary() {
        logger.info("getSalary 호출됨.");
        return salary;
    }
 
    public void setSalary(int salary) {
        logger.info("setSalary 호출됨.");
        this.salary = salary;
    }
 
    public double getCommissionPct() {
        logger.info("getCommissionPct 호출됨.");
        return commissionPct;
    }
 
    public void setCommissionPct(double commissionPct) {
        logger.info("setCommissionPct 호출됨.");
        this.commissionPct = commissionPct;
    }
 
    public String getHireDate() {
        logger.info("getHireDate 호출됨.");
        return hireDate;
    }
 
    public void setHireDate(String hireDate) {
        logger.info("setHireDate 호출됨.");
        this.hireDate = hireDate;
    }
 
}
 
 
cs


2. articleDAO.xml 추가

아래처럼 구문을 작성한다. 알리아스를 주어야 한다.


3. ArticleDAO.java 인터페이스에 List 추가


4. ArticleBiz 인터페이스에 메소드 추가


5. ArticleBizImpl.java 추기


6. Controller에 추가


7. Pom.xml에 jstl과 standard를 추가한다.

  • Jstl과 standard는 버전이 동일해야한다.




8. List.jsp 추가


이제 실행해보자.

이렇게 잘 찍힌다!







#별칭주기

매번 패키지명까지 써야하는게 번거롭다.

다른 wrpper 파일에서 com.ktds.smahn.vo.EmployeesVO를 EmployeesVO로 별칭을 주면 알아서 그 패키지로 찾아갈 수 있도록 하면 좋을 것이다. 이를 위해서는


1. mybatis.xml 추가

아래 구문을 추가한다.


2. articleDAO.xml 수정

  • resultType을 설정했던 별칭으로 준다.




#파라메터 한개 보내기

Last name이 king 인 사람만 보고싶다고 하자.


1. articleDAO.xml 수정


2. ArticleDAOImpl.java 수정

  • 파라메터를 아래와 같이 보낼 수 있다.변수의 이름과 받는 것의 이름은 같아야하기 때문에 똑같이 lastName이라고 적는다.



그리고 실행을 해보자.

LastName 이 King인것만 잘 나온다.




#파라메터 여러개 보내기(Map)

Map을 사용하면 편리하게 파라메터를 여러개 보낼 수 있다.


1.articleDAO.xml 수정

  • 아래와 같이 parameterType 을 map으로 바꾸고, 쿼리문을 수정한다.

2. ArticleDAOImpl.java 수정

Object를 쓰면 어떤 데이터타입이든지 다 넣을 수 있다.



실행을 해보면

Steven King 만 나오는 것을 알 수 있다.



#파라메터 여러개 보내기(VO)

파라메터를 VO클래스로 보낼 수도 있다.


1. articleDAO.xml 수정

  • parameterType 에 EmployeesVO를 적는다.

  • 내부적으로 getter를 찾는다.


2. ArticleDAOIml.java 수정


실행을 해보면


똑같이 1건이 잘 나온다.

'프레임워크 > Spring' 카테고리의 다른 글

Spring으로 간단한 게시판 만들어보기(1)  (1) 2016.04.21
Dynamic Query  (0) 2016.04.20
Transaction, AOP, MyBatis 설정  (1) 2016.04.19
Controller, Interceptor, logger  (0) 2016.04.15
예외 처리하기  (0) 2016.04.14
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함