Mary's log 2021. 8. 2. 09:26

※ 개인적인 개발 수업 정리글입니다. 꾸준히 정리할 예정이고 틀린 부분이 있다면 언제든지 댓글 환영입니다.


왜 mybatis를 쓰는가?

 

JDBC의 

stmt의 단점: sql을 만들기가 어려워서

pstmt로 sql에 ?쓰면서 썼지만, 역시 컬럼이 많으면 데이터나 select로 꺼내오기가 너무 어려웠음

 

그래서 이걸  "몇개의 별도의 파일들로, SQL을 분리해서, 자동으로 관리하게 해주는"

MYBatis 

장점: sql이나 쿼리를 만들 후에 꺼내온 데이터로 작업한게 엄청 줄어듦.

단점: 그 동작시키기 위해서 처음에 설정해야하는게 많음.

 

-마이바티스 쓸거면(=SqlSessionFactory, Configuration, Mapper, properties 사용하려면)

       =>  드라이버 org6_g랑 mybatis 둘다 라이브러리에 등록하고 써야함.

-파일의 내용이 구현은 안되어있어도, 끌어오려는 곳에 파일 자체는 있어야함!!!!

-모델클래스의 멤버변수이름=DB의 컬럼이름, 반드시 꼭 동일해야하고 다르면 문제 생김(소문자통일)

-xml 파일을 만들면, 제일 먼저 xml 파일 먼저 읽음.

 

 


  • MyBatis 설정파일(SqlMapConfig.xml) : [DB의 접속 주소 정보나 Mapping 파일의 경로 등]의 고정된 환경정보 설정
  • SqlSessionFactoryBuilder : MyBatis 설정 파일을 바탕으로 SqlSessionFactory를 생성한다.
  • SqlSessionFactory : SqlSession을 생성한다.
  • SqlSession : 핵심적인 역할을 하는 클래스로서 SQL 실행이다 트랙잭션 관리를 실행한다. SqlSession 오브젝트는 Thread-Safe 하지 않으므로 thread마다 필요에 따라 생성한다.
  • Mapping 파일(ㅁㅁMapper.xml) : SQL문과 OR Mapping을 설정한다.

 

properties(DB4가지정보),Mapper(sql문)을 -> Configu가 모아서 잡고 있음

                                                      -> MySqlSessionFactory가 정리해서 SqlSession함수로 쓸 수 있게 해줌

                                                         (Test main이 원하는 sql를 하고 싶다고 입력하면)

                                                      -> Service에는 [SqlSession함수 호출]하는 함수가 있고

                                                      -> DAO에는 [SqlSession함수 호출하는 함수]를 호출하는 함수로 

                                                      -> Mapper의 sql문이 DB와 연결되어서 실행되는거임


<내가 정리한 mybatis 코드 작성하는 순서>

0. 드라이브를 프로젝트 라이브러리에 등록

1. properties에 DB 4가지 정보가 제대로 되어있는지 확인.

2. Config에 properties 4가지 정보와, Mapper가 등록되어있는지 확인.

////////////////////여기까지 mybatis쓸 준비 완료////////////////////

3. Test main에서 servcie.함수() 호출 코드 적기

     -> Service에서 dao.함수() 호출

     -> DAO에서 Mapper 함수 호출

     -> Mapper에 sql 작성

     -> Mapper의 sql이 DB에 연결되고, DB에서 select,insert into,update,delete연결가능.


<MySqlSessionFactory.java>  [4] 

SqlSession 생성하는 코드

SqlSession함수가 Mapper의 sql문을 return시켜줌

얘가 [DB 4가지 정보, sql문 있는 Mapper]를 품고 있는 Configu의 모든 걸 다 읽어봄.

Factory의 SqlSession함수가 Configu가 품고 있는 Mapper에 있는 sql을 return시켜줌

 

 

<Configuration.xml> [3] 

-4가지정보properties랑, sql문 있는 Mapper까지 품고 있고, SessionFactory가 그걸 읽음

-properties의 4가지 정보를 읽어오고(='DB연결'), sql문 있는 Mapper 경로가 제대로 등록되어있어야함.

 

< Mapper.xml> [2]  <===sql문을 DB랑 연결시킴

-DB로 보낼, SQL문 (또는 Mapping)을 설정

-사용할 id가 중요함

 

 

 

 < jdbc.properties > [1]  DB의 4가지 정보

거의 건들일 없음. 계정 바꿀 때 말고는.

 

-(key, value)로 이루어졌는데, 데이터타입을 문자열 String으로 밖에 쓸 수 없음.

-오라클 DB연동을 위한 4가지 정보를 아예 이 properties에 빼둘거임.

<자바의 다중클래스 처리에 마지막 책273쪽>


프로젝트 JDBC_MyBatis_Ver_1 생성

드라이버 임포트 +

 

Dept

int deptno;

String dname;

String loc;

//멤버변수, 기본생성자,전체생성자, 겟셋함수, toString함수

 

RecordNotFoundException

public RecordNotFoundException(String message) {
super(message);
}

 

 

DeptMapper.XML

프로젝트 - src 오른쪽클릭 - New - Others - XML - XML File - File name : 이름넣고 - Finish -Design 보기와 Source 보기 있음

 

ㄴ하나의 mapper 틀만 만들어 둔거임

<프로젝트 마이바티스 설정 스탭>
1.프로젝트생성, driver build path지정
2.패키지생성
,3.Jdbc.properties파일의4가지정보설정후파일붙이기 =>쫌따 만들거임
4.모델클래스파일만이라도생성, mapper.xml 빈껍데기파일만생성후패키지에붙여넣기
5. Configuration.Xml에서properties, alias, mapper지정 <=여기해야함. 오류 진짜 많이 나는데, 한번 만들면 개꿀
6. MySqlSessionFactory 파일붙여넣기
7. 서비스에서MySqlSessionFactory사용하기

 

configuration.XML

 

 

※이클립스는 가끔 만든 xml에 문제가 없는데 빨간 오류 뜰때가 있음.
그럴 땐, [ 전체선택-잘라내기-xml 저장- 다시 붙여넣기-저장 ] 하면 해결됨

 

┌configuration에 mapper 추가┐

 

 

<프로젝트 마이바티스 설정 스탭>
1.프로젝트생성, driver build path지정
2.패키지생성
3.Jdbc.properties파일의4가지정보설정후파일붙이기 =>이거 넣었고,
4.모델클래스파일만이라도생성, mapper.xml 빈껍데기파일만생성후패키지에붙여넣기
5. Configuration.Xml에서properties,   alias   ,    mapper지정 <=여기했음.
                               직접적음,    안쓸거임,     가져옴
6. MySqlSessionFactory 파일붙여넣기 <=이제 이거 할거임

7. 서비스에서MySqlSessionFactory사용하기

 

MySqlSessionFactory 클래스

//connection 연결과 같은(커넥션은 안씀) , DAO에서 사용할 SqlSession객체

//Configuration.xml를 이용해서 SqlSession객체를 생성하고 리턴시켜주는 클래스

 

 

 

<프로젝트 마이바티스 설정 스탭>
1.프로젝트생성, driver build path지정
2.패키지생성
3.Jdbc.properties파일의4가지정보설정후파일붙이기
4.모델클래스파일만이라도생성, mapper.xml 빈껍데기파일만생성후패키지에붙여넣기
5. Configuration.Xml에서properties,   alias   ,    mapper지정 
                               직접적음,    안쓸거임,     가져옴
6. MySqlSessionFactory 파일붙여넣기 

7. 서비스에서MySqlSessionFactory사용하기

 

 


 

< 에러 정리하기 > 

1. resource에 "Configuration.xml"를 잘못 넣었을때,

 

2. configuration.xml안에서 resource="Mapper.xml"를 잘못 썻을때

 

3. xml의 블럭을 안 닫아주면 뜨는 오류

 

 

4. driver 이름을 잘못 적었으면, ClassNotFoundException 뜸

 

 

5.

 

6. SQL 계정이름 오류면

 

 

 

7. Mapper에 문제가 있다면,

ㄴ select id가 틀렸을 경우에 뜨는 오류

 

8. sql문의 컬럼명을 잘못 썻을 때

 

9. 세미콜론 ; 안써야한느데 썼을때

 

10.

 

11.

 


완전히 새로 만드는 반복
프로젝트 JDBC_MyBatis_Ver_1_1
- 먼저 com.dto패키지, com.exception패키지, 
   DeptMapper.xml, configuration.xml 복사하기

<프로젝트 마이바티스 설정 스탭>
1.프로젝트생성, driver build path지정
2.패키지생성
3.Jdbc.properties파일의4가지정보설정후파일붙이기
3-1. MySqlSessionFactory클래스 생성(모냐 이건?)
4.모델클래스파일만이라도생성, mapper.xml 빈껍데기파일만생성후패키지에붙여넣기
5. Configuration.Xml에서properties,   alias   ,    mapper지정 
                               직접적음,    안쓸거임,     가져옴
6. MySqlSessionFactory 파일붙여넣기 

7. 서비스에서MySqlSessionFactory사용하기

 

JDBC_MyBatis_Ver_1_1프로젝트 순서는

1. com.dto패키지, com.exception패키지, 
   DeptMapper.xml(내용비우고 틀만), configuration.xml 복사하기

2. Main클래스 생성, 작성

3. Service클래스 생성, 작성?

4. DAO 클래스 생성, 작성?

5. Mapper 내용 채우기

 


프로젝트 JDBC_MyBatis_Ver_2

 


<오류 떴을때 내용>

 

IOException : 파일의 이름이 틀렸거나, 경로가 틀렸거나, 뭐가 잘못됐거나 3가지 경우중 하나. 

 

 


3. Test main에서 servcie.함수() 호출 코드 적기

     -> Service에서 dao.함수() 호출

     -> DAO에서 Mapper 함수 호출

     -> Mapper에 sql 작성

    -> Mapper의 sql이 DB에 연결되고, DB에서 select,insert into,update,delete연결가능.

 

디벨로퍼에 데이터 insert

ㄴmain에서  {

          Service클래스 사용할 수 있는 service 변수 생성 ; 

          service.insert (새 객체생성(담을 내용)) ;      <=== Service의 insert함수 부르고

ㄴService클래스의 insert함수 {

          SqlSessionFactory의 SqlSession공간을 불러옴.

          dao.insert(session랑 같이, main이 줬던 값 dept) ;        <=== DAO클래스의 insert함수 부르고,

 

ㄴdao의 insert 함수 {

         session.insert(Mapper의 sql문 id="deptInsert", main이 줬던 값 dept) ;  을 넣어서 요청

ㄴMapper의 sql문

<insert id="deptInser" parameterType="com.dto.Dept"> 아직도 DTO가 이해가 안가냐..

     insert into dept (deptno,dname,loc) values ( #{deptno} , #{dname} , #{loc} )

</insert>

 

아까 main의  ( #{deptno} , #{dname} , #{loc} )가

                        99       ,  "개발"   , "강남" 인거임

 

DB와 연결해서 보낼 Mapper의 sql문 작성 끝났고,

main 실행

 

 

<SQL디벨로퍼 결과>