3.mybatis

이준경·2021년 6월 23일
0

mybatis

  • 손쉽게 DAO 클르새를 구현 할 수 있도록 지원(예외 클래스 제공, 트랜잭션 처리, 템플릿 클래스를 통한 데이터 접근 지원)
  • jdbc를 대체하는 퍼시스턴스 프레임워크(중복 작업 대부분을 없애줌)

data Mapper

  • 객체와 데이터베이스, 매퍼 자체를 독립적으로 유지

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     
    <mapper namespace="com.mybatis.mapper.pd">
        <insert id="insertPd" parameterType="PdDTO">
            insert into pd(no, pdname,price)
            values(pd_seq.nextval, #{pdName}, #{price})
        </insert>
        
        <select id="selectAll" resultType="PdDTO">
        select * from pd order by no desc
        </select>
    </mapper>
    cs

    -#{}안에는 아무렇게나 쓰기 가능. 단 parameter이 PdDTO인 경우 안의 필드명을 맞춰 가져오기 가능
    -parameterType:매핑 구문에 넣는 값의 파라미터를 설정함. PdDTO를 가져오고 #{} 안의 필드를 찾아 자동으로 매핑함.
    -resultType="PdDTO" 반환을 PdDTO형으로 반환 받음.

  • 쿼리를 자바 소스에 두지않고 xml 파일로 관리하여 유지보수성 향상


마이바티스 구조

  1. 설정파일
    -데이터베이스 설정과 트랜잭션 등 마이바티스가 동작하는 규칙을 정의

  2. 매퍼
    -sql을 sml에 정의한 매퍼 xml과 sql을 인터페이스마다 애노테이션으로 정의한 매퍼 인터페이스를 의미

  3. 결과 매핑과 매핑 구문
    -조회 결과를 자바 객체에 설정하는 규칙을 나타내는 결과 매핑과 SQL을 xml 정의한 매핑 구문을 말함(위 소스의 insert,slect의미)

  4. 파라미터, 결과 가능 타입
    -map 객체, 자바 모델 클래스, 원시타입(int,String 등), 원래 com.mybatise 처럼 패키지명을 붙혀서 써야함. 따라서 이를 매핑 처리 해야함. 원시코드는 자동으로 매핑되어있음

  5. select의 경우 하나씩 불러온다. 따라서 반환 타입은 List가 아닌 PdDTO이니 주의할 것


JDBC -> MYBATIS

  1. 데이터베이스 연결 방법
    -URL정보 및 계정정보는 마이바티스에서 설정 파일이 됨 -> mybatis-config.xml
    -getConnection()과 같이 데이터 베이스 연결을 생성하는 API 호출은 mybatis가 제공하는 객체를 생성하는 것으로 바뀜 -> SqlSessionFactory를 이용한 SqlSession 객체 생성

  2. sql을 사용하는 crud에 대해서 처리
    -위 소스처럼 sql을 매핑 구문으로 만듬
    -데이터베이스 연결에 대한 API 호출은 마이바티스 API를 호출하는 것으로 바뀐다.
    -> sqlSession이 제공하는 selectOne, selectList, insert, update, delete을 호출(ps.executeUdate 같은걸 이걸로 변경하는 거인듯)

  3. 데이터베이스 자원을 해제하는 작업
    -sqlSession 객체의 close()메서드 이용

  4. 대부분의 프레임워크는 설정 파일을 한개 이상 가짐. 포멧은 대부분 xml을 채택
    -마이바티스도 xml 설정 파일을 한개 만들어야함 마이바티스의 설정 파일은 데이터베이스 연결 정보와 매퍼의 위치를 지정함


마이바티스 설정 파일(mybatis-config.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
36
37
38
39
40
41
42
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 외부 프로퍼티 파일 로드및 공통 프로퍼티 정의 -->
    <properties resource="mybatis.properties">
    <!--properties url="file:d:\mybatis.properties"-->
      <!-- <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/> -->
      
      <property name="jdbc.driver" value="oracle.jdbc.driver.OracleDriver" />
      <!-- <property name="jdbc.url" value="jdbc:oracle:thin:@yang-hp:1521:orcl" /> -->
      <property name="jdbc.username" value="herb" />
      <property name="jdbc.password" value="herb123" />
    </properties>
 
    
    <!-- 타입별칭 -->
    <typeAliases>
        <typeAlias type="com.mysite.pd.model.PdDTO" alias="PdDTO" />
    </typeAliases>
 
    
    <!-- 데이터베이스및 트랜잭션 관리자 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    
    <!-- 매퍼정의 -->
    <mappers>
        <mapper resource="com/mybatis/mapper/pd.xml" />        
    </mappers>
    
</configuration>
cs

mybatis.properties

1
2
3
4
5
#jdbc.url=jdbc:mysql://localhost:3306/mybatis_example
jdbc.url=jdbc:oracle:thin:@DESKTOP-ODVLIF8:1521:xe
#jdbc.driver=oracle.jdbc.driver.OracleDriver
#jdbc.username=herb
#jdbc.password=herb
cs
  • 외부 프로퍼티 파일을 가져와 공통 프로퍼티를 설정할 수 있음. 여기서 현재 공통 프로퍼티는 db 유저 아이디와 비번, jdbc드라이버, 컴퓨터 주소를 정의함

  • 매퍼 정의는 pd.xml로 매퍼구문 가지고있음

  • 타입별칭은 별칭으로 만들 DTO의 패키지 경로 설정 후 alias로 별칭설정

  • 데이터베이스밒 트랜잭션 관리자는 위에서 공통으로 설정한 프로퍼티를 이용하여 설정


SqlSessionFactory(마이바티스 객체생성)

  • 설정 파일을 만들었다면 이제 이를 이용하여 마이바티스 객체를 생성한다.

  • 이 객체는 sql문 제외하고 jdbc코드가 처리 했던 대부분을 내부적으로 처리(try등등)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public abstract class AbstractRepository {
    private static SqlSessionFactory sqlSessionFactory;
 
    static {
        setSqlSessionFactory();
    }
 
    private static void setSqlSessionFactory() {
        String resource = "mybatis-config.xml";
        InputStream inputStream;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            throw new IllegalArgumentException(e);
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
 
    protected SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}
cs
  • 위 소스를 abstract로 만들고 사용 하고 싶은 클래스에서 이를 상속받아 사용하면 된다.

  • 이 객체는 애플리케이션 내에서 한 개만 생성 되어야 한다.(static)


매핑 구문을 사용하는 DAO

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
public class PdDAO extends AbstractRepository{
    private final String namespace = "com.mybatis.mapper.pd.";
    
    public PdDAO() {
        System.out.println("생성자-PdDAO");
    }
    
    public int insertPd(PdDTO dto){
        SqlSession sqlSession=getSqlSessionFactory().openSession();
        
        try {
            System.out.println("insert전 dto="+dto);
            
            int cnt=sqlSession.insert(namespace+"insertPd", dto);
            System.out.println("insert 후 dto="+dto);
            
            if(cnt>0) {
                sqlSession.commit();
            }
            
            return cnt;
        }finally {
            sqlSession.close();
        }
    }
}
cs
  • factory를 상속 받아 SqlSession 객체를 만들어냄. getSqlSessionFactory().openSession으로 만든다.
    객체를 생성할 때마다 트랜잭션을 시작함

  • 이후 sql의 api인 insert를 쓰는데 이때 namespace는 pd.xml의 경로를 더하고 그안의 매핑 구문 아이디명을 더한 뒤, 매개변수를 넣으면 된다.
    coon, ps, catch 등이 없어지고 thorws도 없어진 것을 볼 수 있다.
    작업을 완료 했다면 sqlSession을 해제한다.

  • 이 경우 자동 commit이 안되기 때문에 cnt>0일 경우 커밋을 해줘야 한다.

  • api는 isnert, delete, update, selectOne, selectList등이 있다.


트랜잭션 처리

  • openSession() 호출시 명시적으로 시작됨.
  • 데이터 입력, 수정 삭제등 명시적으로 적용하기 위해 트랜잭션을 제어하는 메서드 commit이나 rollback 메서드를 호출하는 것과 동시에 트랜잭션이 종료됨.
  • 스프링과 연동시 트랜잭션 데어는 스프링에 위임함

0개의 댓글

관련 채용 정보