MyBatis 개요
MyBatis?
ㆍSQL Mapping Framework
ㆍ자바 코드로부터 SQL문을 분리하여 관리
ㆍ 매개변수 설정 및 쿼리 결과를 읽어오는 코드들을 제거 ex) setString() 등
→ 작성할 코드를 줄여 생산성의 향상 및 유지보수 용이
MyBatis 주요 컴포넌트
MyBatis 모듈에서 제공
ㆍSqlSessionFactory : SqlSession을 생성하여 제공
ㆍSqlSession : SQL 명령을 수행하는데 필요한 메서드 제공
MyBatis Spring에서 제공
ㆍSqlSessionFactoryBean : SqlSessionFactory를 Spring에서 사용하기 위한 빈(bean). 등록할 때 SQL문들이 담겨 있는 Mapper.xml 문서의 위치를 지정해주어야 함.
ㆍSqlSessionTemplate : SQL 명령을 수행하는데 필요한 메서드 제공 (Thread-Safe)
SqlSession 주요 메서드
ㆍint insert(String statement) int insert(String statement, Object parameter)
→ insert문 실행 후 insert 된 행의 갯수를 반환. 반환 타입은 DB에 영향을 준 row 수를 의미.
(delete문, update문 등 동일) Object parameter 의 경우 values(?, ?, ?)와 같은 값들을
객체에 담음.
ㆍ T SelectOne(String statement)
T SelectOne(String statement, Object parameter)
→ 한 행을 반환하는 select문
ㆍ List<E> selectList(String statement)
List<E> selectList(String statement, Object parameter)
→ 여러 행을 반환하는 select문
ㆍ Map<K,V> selectMap(String statement)
Map<K,V> selectMap(String statement, Object parameter)
→ 여러 행을 Map 형태로 반환
Mapper XML 작성
ㆍnamespace + "id명"
→ id 이름이 겹칠 수도 있기 때문에 namespace 지정. Mapper 인터페이스를 사용하기도 함.
ㆍparameterType : 입력 값의 타입
resultType : 반환 값의 타입
→ 별명<typeAliases>을 사용하여 간단하게 지정(이때, 별명인 alias는 대소문자 구별X, 실제 이름인 type은 대소문자 구별O)
ex) <typeAlias alias = "BoardDto" type = "com.(생략).BoardDto"
DTO(Data Transfer Object)?
관심사와 역할에 따라 계층(@Controller, @Service, @Repository)을 분리하고, 각 계층 간에 데이터를 주고받을 필요가 있으므로 이 데이터를 담기 위한 객체. DB 테이블 생성 후 Mapper XML 문서를 작성할 때 parameterType 혹은 resultType으로 DTO를 사용할 수 있음.
#{} 와 ${} 차이
ㆍ #{}
PreparedStatement를 사용하여 값에만 사용할 수 있다는 단점이 있으나, SQL Injection 공격에 방어할 수 있다는 장점이 있음.
ㆍ #{}
Statement를 사용하여 값 외에 테이블 이름 등에도 사용될 수 있어 유연하다는 장점이 있으나, SQL Injection 공격에 취약할 수 있음. 따라서 외부에서 입력받은 것으로 처리해서는 안 되고 내부적으로만 사용해야함.
# XML 특수 문자 처리
특수문자가 포함된 쿼리를 <![CDATE[ ]]> 로 감싸준다.