Spring 프로젝트를 하이버네이트로 하려고 했었는데 자료도 그다지 없고... 의지박약으로 지지부진해서 일단 Mybatis라도 잘하자라는 마음에 노선을 변경...ㅠ
Mybatis와 DB 연결방식은 대략 다음과 같다.
Database Connection Pool(DBCP) : JDBC를 통하여 DB에 연결할 경우, 매번 드라이버를 로드하고 Connection 객체를 가져와야하는데 매우 비효율적이다. 이를 해소하기 위해 웹 컨테이너가 실행되면서 DB와 연결된 Connection 객체를 미리 Pool에 생성해두고 필요할 때에 가져다쓰고 반환한다. DB의 부하를 줄이고 유동적으로 연결을 관리할 수 있다.
SessionFactory : 단일 데이터 저장소, 안정적인 스레드를 위한 목적으로 사용된다. SessionFactory를 사용함으로서 다수의 스레드가 DB세션에 동시에 접근가능하며 특정 데이터베이스에 매핑된 캐시가 변하지 않는다. SessionFactory는 프로그램이 실행될 때만 생성되고 프로그램 내의 소스코드가 이에 접근할 수 있도록 Singleton형태를 지닌다.
SessionTemplate : Mybatis에서는 SqlSessionTemplate라는 이름으로 쓰이고 Mybatis에서 있는 개념같고 연동모듈의 핵심이라고 한다. SqlSessionTemplate은 SqlSession을 구현하고 코드에서 SqlSession를 대체하는 역할을 하며 여러개의 DAO나 매퍼에서 공유할수 있다. 또한 SqlSessionTemplate은 필요한 시점에 세션을 닫고, 커밋하거나 롤백하는 것을 포함한 세션의 생명주기를 관리한다.
SessionFactory에 DatabaseSource를 주입하여 DB와의 연결통로를 만들고, 각 DAO에서 DB와의 연결을 사용하기 위해 SessionTemplate을 주입한다.
참조
- http://soul0.tistory.com/219
- http://www.careerride.com/Hibernate-what-is-SessionFactory.aspx
- http://www.mybatis.org/spring/ko/sqlsession.html#SqlSessionTemplate
1. pom.xml
<!-- Database Connection -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.4</version>
</dependency>
<!-- Database JDBC -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
일단은 라이브러리부터 설정한다. maven repository에서 DBCP, Mybatis, JDBC를 찾아 pom.xml에 추가한다.
2. root-context.xml
<bean id="dataSourceMySQL" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://Host-Address:3306/DB"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceMySQL"/>
<property name="configLocation" value="/WEB-INF/spring/mybatis/mybatis-config.xml"/>
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceMySQL"/>
</bean>
root-context.xml 파일을 설정한다. 맨 위에서 얘기한 대로 주입관계를 지정한다.
transactionManager는 Spring에서 트랜잭션을 관리하기 위해 사용된다. 라는 것까지 밖에 모르겠다. propagation 옵션 설정도 있는데 일단은 패스.
+)
config파일없이 바로 mapper를 매핑시켜주는 방법도 있다.
참고 - http://addio3305.tistory.com/62
3. mybatis-config.xml
나는 spring폴더 아래다 위치시켰는데 정해진 사항은 아니다.
<?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>
<typeAliases>
<typeAlias alias="userVo" type="spring.sample.model.User"/>
</typeAliases>
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.SqlDateTypeHandler" javaType="java.sql.Date" jdbcType="DATE"/>
</typeHandlers>
<mappers>
<mapper resource="mappers/MemberMapper.xml"/>
<package name="spring.sample.mapper"/>
<mapper class="spring.sample.mapper.MemberMapper"/>
<mapper url="file://mappers/MemberMapper.xml"/>
</mappers>
</configuration>
typeAliases : 말그대로 별칭. mapper에서 패키지명+클래스명까지 쓰면 기니까 짧게 쓰기 위해 설정하는 것.
typeHandlers : 적절한 자바타입을 지정한다.라고 하는데 정확한 쓰임은 잘...
mappers : SQL 구문이 저장된 xml파일 위치를 나타냄. 방법은 4가지가 존재. class 형식은 어노테이션방식을 사용할때 읽는 것 같다.
참조 - http://www.mybatis.org/mybatis-3/ko/configuration.html
4. mapper.xml
mapper파일의 위치는 위와 같이했다. 이것도 정확한 규칙은 없는듯 하다.
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.MemberMapper">
<resultMap id="userInfoMap" type="userVo">
<result column="USERID" property="userId" jdbcType="VARCHAR" javaType="string"/>
<result column="USERNAME" property="userName" jdbcType="VARCHAR" javaType="string"/>
</resultMap>
<resultMap id="commonResultMap" type="hashMap">
</resultMap>
<select id="getAllUser" statementType="STATEMENT" resultMap="userInfoMap">
SELECT
*
FROM
USER
</select>
<select id="getUser" statementType="CALLABLE" parameterType="hashMap" resultType="hashMap">
{call USER.GetUser(
#{userid, jdbcType=VARCHAR, javaType=string, mode=IN},
#{result, jdbcType=CURSOR, javaType=java.sql.ResultSet, resultMap=commonResultMap, mode=OUT}
)}
</select>
</mapper>
RESULTMAP - userInfoMap : 결과를 hasmap에 타입이랑 변수를 지정해서 매핑한다.
RESULTMAP - commonResultMap : 가져오는대로 hashmap에 매핑한다.
SELECT, UPDATE, INSERT : SQL을 입력한다. SQL문도 되고 프로시저도 된다.
상세한 사용법은 다음에..
'Programming > >> Spring' 카테고리의 다른 글
[Spring] Could not write JSON: Object is null (0) | 2016.02.26 |
---|---|
[Spring] Spring Mybatis 설정 2 (3) | 2016.02.23 |
[Spring] Spring Validator (1) | 2015.12.02 |
[Spring] Spring 다국어 지원 (0) | 2015.12.02 |
[Spring] Spring + Hibernate 설정 방법 고찰? (1) | 2015.11.24 |
댓글