본문 바로가기
JSP/JSP & Servlet

MyBatis 사용 이해하기

by avvin 2019. 6. 4.

jsp 10강 mybatis, 한줄메모장(목록,글쓰기,수정,삭제)

https://www.youtube.com/watch?v=6BLEkwVIMVs&list=PLY9pe3iUjRrSyS0L2w9p7D0Okt1I5inys&index=10



MyBatis


1) 개발자가 지정한 SQL, 저장 프로시저를 지원하는 프레임워크


2) 프로그램 소스 안에 SQL문을 작성하던 기존 JDBC 방식과 달리 SQL문을 프로그램에서 분리하여

XML 파일에 별도로 작성


3) mybatis 의 장점

- 코딩량 절감

- 간편한 유지보수 : 

SQL을 변경하고자 할 경우 기존처럼 프로그램을 수정하는 것이 아니라 

XML 파일의 SQL문만을 변경하면 되기 때문에 SQL 변환이 자유로움


4) ibatis 라는 이름으로 2.5까지 개발 



MyBatis 설정방법


1) mybatis jar파일 lib폴더에 복사 ( maven 방식이면 X )


2) MybatisManager.java : mybatis framework 실행할 수 있는 세션 생성 코드(여기서 sqlSession 객체 생성)


3) sqlMapConfig.xml : mybatis 기본 설정 파일     //설정 파일


4) mapper 파일 : 실제 sql query 문장을 입력        //쿼리 파일




jsp04 프로젝트 (한줄 메모장) 구조 : MVC


web.xml ( 배치 기술서 )



Controller  

- MemoController.java



Model 

- MemoDTO / MemoDAO



View 

- index.jsp : ajax 요청 페이지, 메모 입력

- list.jsp : 메모목록

- view.jsp : 메모 보기, 수정, 삭제 기능



+★★★★★

sqlmap.sqlMapConfig.xml : MyBatis기본 설정 파일 

sqlmap.MubatisManager.java : sqlMapConfig.xml 설정파일을 읽어들여서 sql을 실행할 수 있는 객체(sqlSession) 생성

  memo.xml을 인식할 수 있도록 맵핑


+ memo.xml : sql이 모여있다. namespace와 태그 id로 구별






sqlmap.sqlMapConfig.xml

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
//현재 문서가 XML 문서라는 XML 지시어
<?xml version="1.0" encoding="UTF-8"?>
 
// xml은 1. 데이터 전달 목적의 xml  2. 설정 정보 저장하는 xml 
// DOCTYPE!은 문서에 대한 정보를 기록하는 문서 규약 (mybatis의 설정파일이라는 것을 알려줌)
 
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    // 알리아스 : 클래스 이름이 길때 줄임말 설정해줌. 이 프로젝트에선 사용 X
    <typeAliases>
    </typeAliases>
 
    //DB연결 참조. 여기서 연결 설정해도되지만 context.xml에 커넥션풀 설정해놓은게 있으므로 가져다쓴다.
    <environments default="">
        <environment id="">
            <transactionManager type="JDBC" />
            <dataSource type="JNDI">
                <property name="data_source" 
                value="java:comp/env/oraDB" />
            </dataSource>
        </environment>
    </environments>
    //실제 sql 쿼리 맵핑
    //서버가 올라올때 이 sqlMapConfig를 가장 먼저 읽어들여 매퍼 리소스를 읽고 쿼리를 맵핑한다.
    <mappers>
        <mapper resource="memo/mapper/memo.xml" />
    </mappers>
</configuration>
 
<!-- <mapper resource="emp/mapper/emp.xml" /> <mapper resource="student/mapper/student.xml" 
    /> <mapper resource="student/mapper/dept.xml" /> <mapper resource="student/mapper/prof.xml" 
    /> <mapper resource="student/mapper/lecture.xml" /> <mapper resource="memo/mapper/memo.xml" 
    /> -->
cs



*Server의 context.xml에 커넥션풀 등록돼있음

1
2
3
4
5
6
7
8
9
<Context>
  
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    <Resource name="oraDB" auth="Container" type="javax.sql.DataSource"
                      driverClassName="oracle.jdbc.driver.OracleDriver" loginTimeout="10" maxWait="5000"
                      username="system" password="123456" url="jdbc:oracle:thin:@localhost:1521:xe"/>
 
</Context>
cs




sqlmap.MybatisManager.java

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
package sqlmap;
 
import java.io.Reader;
 
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 
public class MybatisManager { //싱글톤 패턴으로 sqlSession 객체 하나만 만들기
  private static SqlSessionFactory instance; // 필드와 생성자 모두 프라이빗 처리로 외부 접근 막는다.
  private MybatisManager() {} //생성자
  public static SqlSessionFactory getInstance() {
    Reader reader=null;
    try {
     
      reader=Resources.getResourceAsReader("sqlmap/sqlMapConfig.xml");
      instance=new SqlSessionFactoryBuilder().build(reader);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if(reader != null) reader.close();
      } catch (Exception e2) {
        e2.printStackTrace();
      }
    }
    return instance;
  }
}
 

cs


SqlSessionFactory와 SqlSession은 MyBatis.jar 내에 정의된 클래스


(reader로 DB연동 등 mybatis 설정 정보를 읽고 SqlSessionFactory객체에 reader정보를 준다.)


Reader타입 reader 변수에 리소스를 담고 ( Resources.getResourceAsReader ( " 읽어들일 리소스 " ) )

SqlSessionFactoryBuilder()로 생성된  객체의 build메서드로 리소스를 담은 reader 객체를 읽어들인 후

sqlSessionFactory타입 instance 변수에 담는다.


mybatis 설정 정보를 담은 이 싱글톤 객체(sqlFactory)를 사용하여 sqlSession을 생성할 수 있다.

//공장은 하나만 있으면되니까 싱글톤으로 생성 (메모리 절약)


MemoDAO.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MemoDAO {
 
  public List<MemoDTO> list(){
    
    //sqlSession 객체 생성
    SqlSession session=MybatisManager.getInstance().openSession();
    
    //DTO형식의 리스트 변수에 sqlsession.selectList("네임스페이스.sql명령어의 id") 
    //selectList는 레코드셋을 리스트로 리턴한다.
 
    List<MemoDTO> items=session.selectList("memo.list");
    //memo.xml에서 <select resultType="memo.dto.MemoDTO" id="list">가 sql을 담고있음
    session.close();
     
    return items;
  }
 
 }
cs


memo namespace의 태그id=list를 실행

 ( memo.xml의 namespace를 읽을 수 있도록 sqlMapConfig.xml(mybatis 설정파일)에서 memo.xml를 맵핑했다.)




memo.xml  (sql을 모아놓음)

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
<?xml version="1.0" encoding="UTF-8"?>
 
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN">
//데이터만 담긴 xml은 !DOCTYPE 필요 없다. 설정 정보를 담을 때만 사용
 
//List<MemoDTO> items=session.selectList("memo.list");
-<mapper namespace="memo">
 
    <!-- id="태그의 id" resultType="결과자료형" -->
 
 
    <!-- 달러{변수명} ==> 따옴표 처리를 하지 않음, 샵{변수명} ==> 따옴표 처리를 함 -->
 
    <select resultType="memo.dto.MemoDTO" id="list"> //List에 담기는 타입(resultType), 변수명(id)
    SELECT idx,writer,memo,post_dateFROM memowhere ${searchkey} like '%' ||#{search} || '%'ORDER BY idxdesc 
    </select>
 
    <select resultType="memo.dto.MemoDTO" id="listAll">
    SELECT idx,writer,memo,post_dateFROM memowhere writer like '%' || #{search}|| '%'or memo like '%' ||#{search} || '%'ORDER BY idx desc 
    </select>
 
 
    <!-- 메모 갯수를 계산하는 구문 -->
 
    <select resultType="int" id="count">
    select count(*) from memowhere${searchkey} like '%' || #{search} || '%'
    </select>
 
    <select resultType="int" id="countAll">
    select count(*) from memowherewriter like '%' || #{search} || '%'or memolike '%' || #{search}|| '%' 
    </select>
 
 
    <!-- 게시물 번호에 대한 메모 레코드 정보 -->
 
    <select resultType="memo.dto.MemoDTO" id="view">
    select * from memo whereidx=#{idx}
    </select>
 
 
<!-- resultType="결과 자료형" parameterType="입력매개변수 자료형" 달러{변수명} 달러{writer} ==>MemoDto.java의 getWriter() 호출 -->
 
 
    <insert id="insert">insert into memo ( idx,writer, memo ) values( (selectnvl(max(idx)+1, 1) from memo),#{writer}, #{memo} ) </insert>
    <update id="update">update memo setwriter=#{writer}, memo=#{memo}whereidx=#{idx} </update>
    <delete id="delete">delete from memo whereidx=#{idx} </delete>
 
</mapper>
cs