※ 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 |