(자료 : From https://mybatis.org/mybatis-3/ko/getting-started.html )
위 MyBatis 공식 사이트에서 나에게 필요한 내용만 쏙속 뽑아와서 정리하기
1. 마이바티스란?
- 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크
- JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다.
- 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다
2. 시작
1) 설치 : 사용하기 위해선 mybatis-x.x.x.jar 파일을 클래스패스에 두어야함(https://github.com/mybatis/mybatis-3/releases)
- 메이븐 사용시, pom.xml에 다음의 설정 추가
더보기
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version> </dependency> |
2) XML에서 SqlSessionFactory 빌드
- 모든 마이바티스 애플리케이션은 SqlSessionFactory 인스턴스를 사용하고 SqlSessionFactory인스턴스는 SqlSessionFactoryBuilder를 사용하여 만들수 있다.
- SqlSessionFactoryBuilder는 XML설정파일에서 SqlSessionFactory인스턴스를 빌드할 수 있다.
- XML(mybatis-config.xml) 설정방법 (최소한의 가장 핵심부분 예시)
: 가장 윗부분은 유효성체크를 위해 필요
: environment엘리먼트 = 트랜잭션 관리와 커넥션 풀링을 위한 환경적인 설정
: mappers엘리먼트 = SQL 코드와 매핑 정의를 가지는 XML 파일인 mapper 의 목록을 지정
더보기
<?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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration> |
3) SqlSessionFactory 에서 SqlSession 만들기
- SqlSession 은 데이터베이스에 대해 SQL명령어를 실행하기 위해 필요한 모든 메소드를 가지고 있다.
- SqlSession 인스턴스를 통해 직접 SQL구문을 실행할 수 있음
- 마이바티스는 클래스패스와 다른 위치에서 자원을 로드하는 것으로 좀더 쉽게 해주는 Resources 라는 유틸성 클래스를 가지고 있다
SqlSession sqlSession = null;
try {
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession(false);
} catch (IOException e) {
e.printStackTrace();
}
- commit(), rollback(), close() 메소드는 SqlSession 객체에서 이미 제공하므로 별도로 만들 필요 없음
3. 매퍼 설정 : 마이바티스 XML 설정파일
<configuration>
- properties
- settings
- typeAliases
- typeHandlers
- objectFactory
- plugins
- environments
- databaseIdProvider
- mappers
</configuration>
1) properties 속성
- 이 설정은 외부에 옮길 수 있다. 자바 프로퍼티 파일 인스턴스에 설정할 수도 있고 properties 엘리먼트의 하위 엘리먼트에 둘수도 있다. 속성들은 파일 도처에 둘 수도 있다.
- 속성이 한 개 이상 존재한다면 마이바티스는 일정한 순서로 로드한다
- properties 엘리먼트에 명시된 속성을 가장 먼저 읽는다.
- properties 엘리먼트의 클래스패스 자원이나 url 속성으로 부터 로드된 속성을 두번째로 읽는다. 그래서 이미 읽은 값이 있다면 덮어쓴다.
- 마지막으로 메소드 파라미터로 전달된 속성을 읽는다. 앞서 로드된 값을 덮어쓴다.
<dataSource type="POOLED">
<!-- ... -->
<property name="username" value="${username:ut_user}"/>
<!-- 만약 'username' 속성이 없다면, username 은 'ut_user' 가 된다. -->
</dataSource>
2) settings 셋팅
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
3) typeAliases 타입별칭
- 오직 XML 설정에서만 사용되며, 타이핑을 줄이기 위해 존재
- alias="별칭" type="자바타입" 별칭을 사용하면 자바타입을 찾아서 사용
예시)
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
4) typeHandlers (추후 추가)
5) objectFactory (추후 추가)
6) plugins (추후 추가)
7) environments
- 마이바티스는 여러개의 환경으로 설정할 수 있다.
- 중요하게 기억해야 할 것은 다중 환경을 설정할 수는 있지만 SqlSessionFactory 인스턴스마다 한개만 사용할 수 있다는 것이다.
- environments 엘리먼트는 환경을 설정하는 방법을 정의한다.
* 디폴트 환경(Environment) ID (예를들면. default=”development”).
* 각각의 환경을 정의한 환경(Environment) ID (예를들면. id=”development”).
* TransactionManager 설정 (예를들면. type=”JDBC”)
* DataSource 설정 (예를들면. type=”POOLED”)
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
# transactionManager
- 마이바티스는 두가지 타입의 TransactionManager를 제공한다.
* JDBC : 이 설정은 JDBC 커밋과 롤백을 처리하기 위해 사용.
* MANAGED : 이 설정은 어떤 것도 하지 않음. 대신 컨테이너가 트랜잭션의 모든 생명주기를 관리
참고) 마이바티스를 스프링과 함께 사용하는 경우에는 구성할 필요가 없음. 스프링 모듈 자체의 설정 때문에 어떤 TransactionManager 이전에 설정된 구성을 무시합니다.
# dataSource
- dataSource엘리먼트는 표준 JDBC DataSource인터페이스를 사용하여 JDBC Connection객체의 소스를 설정한다.
* UNPOOLED - 이 구현체는 매번 요청에 대해 커넥션을 열고 닫는 간단한 DataSource이다. 조금 늦긴 하지만 성능을 크게 필요로 하지 않는 간단한 애플리케이션을 위해서는 괜찮은 선택이다.
* POOLED - DataSource에 풀링이 적용된 JDBC 커넥션을 위한 구현체이다. 이는 새로운 Connection 인스턴스를 생성하기 위해 매번 초기화하는 것을 피하게 해준다. 그래서 빠른 응답을 요구하는 웹 애플리케이션에서는 가장 흔히 사용되고 있다.
* JNDI - 이 DataSource 구현체는 컨테이너에 따라 설정이 변경되며 JNDI 컨텍스트를 참조한다. 이 DataSource 는 오직 두개의 프로퍼티만을 요구한다.
8) databaseIdProvider (추후 추가)
9) mappers
- 매핑된 SQL 구문 정의
- 먼저 설정을 어디에 둘지 결정하되, 자바는 자동으로 리소스를 찾기 위한 좋은 방법을 제공하지 않으므로 어디서 찾으라고 지정할 필요가 있다.
<mappers>
<!-- 클래스패스의 상대경로의 리소스 사용 -->
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
<!-- 절대경로의 url을 사용 -->
<mapper url="file:///var/mappers/PostMapper.xml"/>
<!-- 매퍼 인터페이스를 사용 -->
<mapper class="org.mybatis.builder.PostMapper"/>
<!-- 매퍼로 패키지내 모든 인터페이스를 등록 -->
<package name="org.mybatis.builder"/>
</mappers>
4. Mapper XML 파일
ㅡ select
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
- id : 구문을 찾기 위해 사용될 수 있는 네임스페이스내 유일한 구분자
- parameterType : 구문에 전달될 파라미터의 패키지 경로를 포함한 전체 클래스명이나 별칭
- resultType : 이 구문에 의해 리턴되는 기대타입의 패키지 경로를 포함한 전체 클래스명이나 별칭. collection인 경우 collection 타입 자체가 아닌 collection 이 포함된 타입이 될 수 있다. resultType이나 resultMap을 사용할 것
- resultMap : 외부 resultMap 의 참조명
- 그외 생략
ㅡ insert, update and delete
<insert id="insertAuthor">
insert into Author (id,username,password,email,bio)
values (#{id},#{username},#{password},#{email},#{bio})
</insert>
<update id="updateAuthor">
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
</update>
<delete id="deleteAuthor">
delete from Author
where id = #{id}
</delete>
- 결과값은 지정해주지 않아도 int로 자동반환
ㅡ sql
: 이 엘리먼트는 다른 구문에서 재사용가능한 SQL구문을 정의할 때 사용된다. 로딩시점에 정적으로 파라미터처럼 사용할 수 있다. 다른 프로퍼티값은 포함된 인스턴스에서 달라질 수 있다.
- 프로퍼티값은 다음처럼 refid속성이나 include절 내부에서 프로퍼티값으로 사용할 수 있다.
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"><property name="alias" value="t1"/></include>,
<include refid="userColumns"><property name="alias" value="t2"/></include>
from some_table t1 cross join some_table t2
</select>
ㅡ Parameters
- ParameterType은 'int'로 설정되어있음
- Integer나 String 같은 원시탑이나 간단한 데이터 타입은 프로퍼티를 가지지 않으나 복잡한 객체를 전달하고자 한다면 필히 작성/특정해주어야 한다.
<insert id="insertUser" parameterType="User">
insert into users (id, username, password)
values (#{id}, #{username}, #{password})
</insert>
ㅡ Result Maps
- ResultSet에서 데이터를 가져올때 작성되는 JDBC코드를 대부분 줄여주는 역할을 담당한다.
- 사실 join매핑과 같은 복잡한 코드는 굉장히 많은 코드가 필요하다. ResultMap은 간단한 구문에서는 매핑이 필요하지 않고 복잡한 구문에서 관계를 서술하기 위해 필요하다.
- TypeAliases를 사용하면 타이핑 수를 줄일 수 있다.
<!-- XML설정파일에서 -->
<typeAlias type="com.someapp.model.User" alias="User"/>
<!-- SQL매핑 XML파일에서 -->
<select id="selectUsers" resultType="User">
select id, username, hashedPassword
from some_table
where id = #{id}
</select>
- 자바빈 스펙에 기반하여 프로퍼티가 select구문에서 칼럼명과 정확히 일치할 경우 ResultSet에 매핑된다.
- 만약 칼럼명과 프로퍼티명이 다르다면 SQL 구문에 별칭을 지정할 수 있다.
<select id="selectUsers" resultType="User">
select user_id as "id",
user_name as "userName",
hashed_password as "hashedPassword"
from some_table
where id = #{id}
</select>
- 칼럼명과 프로퍼티명이 다른 경우에 대해 데이터베이스 별칭을 사용하는 것과 다른 방법으로 명시적인 resultMap 을 선언하는 방법도 있다.
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="username"/>
<result property="password" column="password"/>
</resultMap>
10) 복잡한 매핑결과 (추후 추가)
'Upgrade.배우고익히기' 카테고리의 다른 글
자바/메이븐 환경변수 설정하기+오류(JAVA_HOME)오류 (0) | 2020.08.27 |
---|---|
테크트리(비전공자-국비6개월) (0) | 2020.08.27 |
fail-fast 기법 (0) | 2020.04.07 |
서블릿Servlet 이해 (0) | 2020.03.09 |
싱글턴Singleton & LazyHolder (0) | 2020.03.08 |