Spring

[Spring] mybatis

sian han 2022. 5. 30. 19:35

※ mybatis

프레임워크이고 얘는 매우 쉬움

JDBC를 대체하는 퍼시스턴스 프레임워크

                            ㄴ 영속적인( 영구적으로 db에 저장해줌 ) - dao 작업에서 쿼리문 하나만 입력하면 됨

별도의 xml 이나 어노테이션으로 정의함

ps.set ~ - prepare 에 매핑하는 것 자동으로 해줌

조회결과 자동매핑

SQL 을 이용하여 관계형 데이터베이스를 관리하는 Persistence Layer의 Framework

 

insert할때도 vo 갚을 매핑해주고

select 할때도 vo값을 자동매핑해준다 우리가 일일히 꺼내서 작업할 필요가없음

  => JDBC를 이용하여 SQL 구문을 만들기 위하여 VO(Bean)객체의 속성을 직접 접근하거나

        또 실행 결과를 VO(Bean) 객체로 담기 위해 일일이 ResultSet 에서 꺼내는 수고를 덜어줌

MemberVO 클래스에는 select 명령어의 결과로 추출된 각 컬럼의 이름과 동일한 이름의 프로퍼티가 포함되어 있어 mybatis가 MemberVO 객체를 생성하고 각각의 필드를 찾아 자동으로 매핑함

자동매핑될때는 컬럼명과 vo (멤버변수이름) 이름이 동일해야한다

 

 

 

▶ 마이바티스 구성요소

 

▷ 설정파일

    - mybatis-config.xml : 데이터베이스 설정과 트랜잭션 등 마이바티스가 동작하는 규칙을 정의 함

    - 테이블 하나당 하나의 xml을 만든다고 생각하면됨

매퍼 : 어노테이션으로 정의한 매퍼 인터페이스(1개 이상)를 의미함

    - SQL을 XML에 정의한 매퍼 XML 파일(1개 이상)과 SQL을 인터페이스마다

      어노테이션으로 정의한 매퍼 인터페이스(1개 이상)를 의미함

▷결과 매핑 : 조회 결과를 자바 객체에 설정하는 규칙을 나타내는 결과 매핑

매핑 구문 : 매퍼xml 안에 들어가는 쿼리문 하나하나

 

 

 

 

▶ mybatis 프로그램 절차

[1] 매핑 파일을 작성함

<select id="getMember" resultType="MemberVO" parameterType="java.lang.String">
	select id, pwd, name, tel from member where id=#{id}
</select>

[2] 매핑 파일을 이용해서 데이터를 조회함

sqlSession = sqlSessionFactory.openSession();
MemberVO vo= sqlSession.selectOne("getMember", “hong");

 

 

 

 

 jdbc를 mybatis로 변경하는 과정

 

          jdbc                           Mybatis

db연결하는 과정         mybatis 설정화일에 넣기

getconnection            SqlSessionFactory 에서 SqlSession 객체생성 : sqlSession 을 이용해서 값을 셋팅하고 넣을거임

crud                            SQL은 Mybatis 의 매핑구문으로 만들고 / DB 연결에 대한 API 호출은 Mybatis API를 호출

execute                       mybatis 메서드 호출

 

 

Mybatis API

예시 ) select

selectOne : 레코드가 하나일때

selectList : 레코드가 여러개일때

 

 

▷ mybatis 설정화일에서 하는 두가지

db연결작업

매퍼위치 - 테이블 개수만큼 매퍼개수가 나오는데 이 패키지의 위치를 찾아줌

 

설정화일을 이렇게 준비되면 설정화일의 내용을 갖는 객체를 생성해야함 (Mybatis 객체생성)

이렇게 생성한 객체는 db연결정보와 매퍼위치정보를 갖고있다

 

 

 

▶ Mybatis 객체생성

1.설정화일만들기

2.설정화일을 로드해서 mybatis 객체를 생성한다 =SqlSessionFactory

    - sqlsessionfactory = mybatis 설정화일의 정보를 갖는 mybatis 객체이다

3. sqlsession 을 얻어서 사용

public class CommentSessionRepository {
    private SqlSessionFactory getSqlSessionFactory() {
        String resource = "mybatis-config.xml";
        InputStream inputStream;
        try {
          	  inputStream = Resources.getResourceAsStream(resource);
            } catch (IOException e) {
          	  throw new IllegalArgumentException(e);
        }
    return new SqlSessionFactoryBuilder().build(inputStream);
}

  - SqlSessionFactory 객체가 마이바티스의 전반적인 정보를 가지고 제어한다.

 

 

 

 

 

▶ Mybatis 파라미터 표기법

  ▷ #{commentNo}

       - 값을 설정할 때 사용

       - 자바빈 , 프로퍼티명을 적으면 됨

       - Map 객체 - key 값

#{connentNo, javaType=Date, jdbcType=TIMESTAMP}

 

 

▶ 매퍼 XML

<?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="ldg.mybatis.repository.mapper.CommentMapper">
<select id="selectCommentByPrimaryKey" parameterType="long" 
resultType="ldg.mybatis.model.CommentVO">
SELECT
comment_no AS commentNo,
user_id AS userId,
comment_content AS commentContent,
reg_date AS regDate
FROM COMMENT
WHERE comment_no = #{commentNo}
</select>
</mapper>

 

▷ namespace :

    - 여러개의 매퍼에서 매핑 구문 아이디가 겹치더라도 마이바티스에 서는 네임스페이스와 함께

       매핑 구문 아이디를 사용하기 때문에 아이디가 겹치지 않게 분류할 수 있다

    - namespace와 id 를 합쳐서 full name 이 되는 것임

    - namespace에 table을 넣는거임 = 유니크해짐 (board.selectAll)

ex ) <mapper namespace="com.mybatis.mapper.pd">

 

▷ resultMap 엘리먼트

· 속성

     - id : 매핑 구문에서 결과 매핑을 사용할 때 구분하기 위한 아이디

     - type : 대개는 Map 이나 자바 모델 클래스를 지정함

<resultMap id="baseResultMap" type="Comment">
    <id column="comment_no" jdbcType="BIGINT" property="commentNo" />
    <result column="user_id" jdbcType="VARCHAR" property="userId" />
    <result column="reg_date" jdbcType="TIMESTAMP" property="regDate" />
    <result column="comment_content" jdbcType="VARCHAR" property="commentContent" />
</resultMap>
<select id="selectCommentByPrimaryKey" parameterType="long" resultMap="baseResultMap"> 
    SELECT 
        comment_no,
        user_id,
        comment_content,
        reg_date
    FROM comment2 
    WHERE comment_no = #{commentNo} 
</select>

 

 

sql 엘리먼트

  - 각각의 매핑 구문에서 공통으로 사용할 수 있는 SQL 문자열의 일부를 정의하고 재사용하기 위해 사용함

<sql id="BaseColumns">
    comment_no AS commentNo,
    user_id AS userId,
    comment_content AS commentContent,
    reg_date AS regDate
</sql>
<select id="selectCommentByPrimaryKey" parameterType="long" 
    resultType="ldg.mybatis.model.Comment">
    SELECT
    <include refid="BaseColumns"/>
    FROM comment2
    WHERE comment_no = #{commentNo}
</select>

 

  - insert   

      속성 (insert 엘리먼트만 추가로 사용하는 속성) : keyProperty

<insert id="insertComment" parameterType="ldg.mybatis.model.Comment">
INSERT INTO comment2(comment_no, user_id, comment_content, reg_date)
VALUES (comment2_seq.nextval, #{userId}, #{commentContent}, #{regDate})
</insert>

 

  - update

<update id="updateComment" parameterType="ldg.mybatis.model.Comment">
UPDATE comment2 SET comment_content = #{commentContent}
WHERE comment_no = #{commentNo};
</update>

 

  - delete

<delete id="deleteComment" parameterType="long">
DELETE FROM comment2
WHERE comment_no = #{commentNo};
</delete>

 

 

selectKey 엘리먼트 : 방금 입력한 자동 생성 키가 무슨 값인지 입력과 동시에 알아내기 위한 기능이 selectKey의 기능

 

 

 


 

 

※ 트랜잭션

 

마이바티스를 사용할 때 중요한 객체는 SqlSessionFactory 객체이고, 각각의 세부 작업은 SqlSessionFactory 에서 만들어지는 SqlSession 객체가 담당함

 

openSession() 메서드를 사용해 SqlSession 객체를 생성하면 객체를 생성할 때마다 트랜잭션을 시작한다

 

▶ properties

  - 공통적인 속성을 정의하거나 외부 파일에서 값을 가져와서 사용해야하는 경우 사용

  - 외부 프로퍼티 파일을 읽기 위해서는 properties 엘리먼트 의 resource 속성에 위치를 지정

 

▶ settings

  - settings 엘리먼트를 사용해서 설정하는 각종 값은 SqlSessionFactory 객체가 SqlSession 객체를 만들 때 생성할 객체의 특성을 결정함

▷ cacheEnabled - 캐시를 기본으로 사용할지를 결정, 디폴트값 : true

 useGeneratedKeys - 생성 키 사용여부를 결정, 디폴트값:false

                                       mysql 계열을 사용할때는 useGeneratedKeys 를 true 로 설정해야 사용할 수 있다

 mapUnderscoreToCamelCase - 언더 바 형태를 낙타 표현식으로 자동매핑 할지에 대한 옵션

                                                         디폴트값:false(자동으로 매핑하지 않음)

 

<!-- 마이바티스의 작동 규칙정의 -->
<settings>
<setting name="cacheEnabled" value="false"/>
<setting name="useGeneratedKeys" value="true"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

일치하지 않는 경우 세가지

테이블을 만들때는 대문자로 만드는데, 테이블컬럼명은 대문자_컬럼명 이렇게 만들거다

그러면 vo는 카멜케이스로 씀 (첫글자 대문자 뒤에 소문자)

그럼이제 컬럼명과 vo 이름이다른데 이를 처리하는 방법

1. 별칭쓰기

2. 별칭을 사용하지않고 resultmap을 사용 => 결과매핑할방법을정함

3. 마이바티스 설정파일의 mapUnderscoreToCamelCase 설정을 true 로 설정하면 다음 규칙을 자동으로 적용함 comment_no => setCommentNo()

 

그렇다고 vo를 컬럼명이랑 똑같이하면안된다

 

 

 

 

 

typeAliases 

  - 매핑 구문의 파라미터나 결과 타입을 지정할 때 타입별 별칭을 설정할 수 있다

  - 어노테이션으로 설정도 가능

 

 

 

▶ mappers

마이바티스에서 가장 중요한 매퍼를 지정하는 엘리먼트

                                                  ㄴ 매핑 구문과 파라미터나 결과 타입등을 지정하는 역할을 함

 

 

▷ 매퍼 위치를 지정하는 방법

 

[1] 클래스 패스에 위치한 XML 매퍼 파일 지정(resource 속성)

[2] URL을 사용한 XML 매퍼 파일 지정(url 속성)

[3] 매퍼 인터페이스를 사용하는 인터페이스 위치 지정 (class 속성)

[4] 패키지 지정으로 패키지 내 자동으로 매퍼 검색(name 속성)

<mappers>
<mapper resource="ldg/mybatis/repository/mapper/CommentMapper.xml" />
<mapper url="file:///ldg/mybatis/repository/mapper/CommentMapperResultMap.xml" />
<mapper class="ldg.mybatis.repository.mapper.CommentMapper" />
<packgae name="ldg.mybatis" />
</mappers>

  - 근데이제 스프링 연동 모듈을 사용하면 mapperLocations 프로퍼티 를 사용해 매퍼 위치를 지정할 수 있기 때문에          mappers 엘리먼트를 사용하지 않을 수도 있다

 

 


 

 

 

동적sql 을 쓰려면 파라미터 타입이 무조건 map 이나 vo 이어야한다

 

where 엘리먼트를 붙이면

하위 엘리먼트에 생성한 내용이 있다? 여기에 붙이삼

만약 둘다만족해 ? 그럼 위에만 where 를 쓰고 아래에는 and 에 붙임

 = > 그래서 where 가 중복되지않게 함

 

 

동적sql은 모두 다 중요하다! 

 

 

 

Spring Mybatis 연동

1)db연결정보

2) trasaction 처리를 위한 두개 1.transaction manager 2. 어노테이션 사용한 트랜잭션 처리(tx:annotaion - driven)

3) mybatis 설정 1.sqlsessionfactory(mapper 위치, 별칭) 2.sqlsession 

 

스프링 마이바티스 연동
1.db연결정보
2.트랜젝션 처리
(1)트랜잭션 관리자
(2)Annotation 을 사용한 트랜잭션 사용시 활성화
<tx:annotation-driven transaction-manager="transactionManager" />
3. 마이바티스 설정
(1)sqlSessionFactory(매퍼위치, 별칭, 마이바티스 설정파일)
(2)sqlSession

4. 4개 어노테이션이 붙은 클래스를 자동으로 빈으로 등록

  - context component scan

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Spring' 카테고리의 다른 글

[Spring] 파일업로드 / 다운로드  (0) 2022.06.02
[Spring] spring boot 스프링부트  (0) 2022.05.31
[Spring] 스프링 MVC를 이용한 웹 요청 처리  (0) 2022.05.26
[Spring] 스프링 프레임워크  (0) 2022.05.24
[jsp]JSTL  (0) 2022.05.24