Creative Wrong Answer

myBatis 시작하기 +1

저번 포스팅에서 iBatis 에서 myBatis로 넘어오면서 바뀐점들에 대해 적었었다.
2010/11/05 - [Java & iBatis] - iBatis에서 myBatis로 개요 및 변경점

이 포스트에서는 이전에 바뀐 것들을 바탕으로 기본 환경 설정을 확인 해본다.

프로젝트 환경 설정은 그림과 같다.


플렉스쪽이 더 있기는 하지만 그건 여기서는 중요한건 아니므로 패스 하고. Java, MyBatis 만 확인 해보자.

Configration.xml


<configuration>


<typealiases>
<typealias type="vo.UserVO" alias="User">
</typealias></typealiases>
<environments default="development">
<environment id="development">
<transactionmanager type="JDBC">
<datasource type="POOLED">
<property value="oracle.jdbc.driver.OracleDriver" name="driver"></property>
<property value="db_url" name="url"></property>
<property value="user" name="username"></property>
<property value="passwd" name="password"></property>
</datasource>
</transactionmanager></environment>
</environments>
<mappers>
<mapper resource="myBatis/mappers/UserMapper.xml">
</mapper></mappers>
</configuration>





빈즈(여기서는 플렉스와 맞추기위해서 VO로 작업했다)의 typeAlias 가 먼저 나오고 환경설정 그다음에 mapper가 나온다.  이 순서대로 넣지 않고 typeAlias를 environments 다음에 넣거나 하면 에러가 발생한다.
에러내용에 보면 순서 정의가 되어있고 그 순서에 맞춰서 넣어야 한다고 되어있다.

Description Resource Path Location Type
The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,mappers?)". Configuration.xml taskManager/WebContent/WEB-INF/classes/myBatis line 6 XML Problem

properties 에서 시작해서 mapper 까지 순서가 정해져 있는데 xml을 위에서 부터 읽어서 뒤에정의된 내용은 덮어 쓰게 되므로 설정파일에서는 미리정의 해놓은것 같다. (이전포스트에서 속성을 덮어쓰는 순서에 대해서 이야기 한적이 있다)

MyBatisManager.java

public class MyBatisManager {
	
	public static SqlSessionFactory sqlMapper = null;
	
	public static SqlSessionFactory getInstance(){
		if(sqlMapper == null) {
			try {
				String resource = "myBatis/Configuration.xml";
				Reader reader = Resources.getResourceAsReader(resource);
				sqlMapper = new SqlSessionFactoryBuilder().build(reader);
				reader.close();
				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return sqlMapper;
	}
}


SqlSessionFactory는 어플리케이션과 같은 라이프사이클을 가지게 되므로 싱글톤으로 간단하게 구현해놓는다.
이후에 getInstance()를 호출해서 클래스의 참조를 받아오게 된다.
매니저로 구현하지 않고 그냥 java 파일의 상단에서 생성시켜도 별 상관은없다.

UserDao.java

public class UserDao {
	
	public static SqlSessionFactory sqlMapper = MyBatisManager.getInstance();
	
	public List getUserList() {
		
		List list = new ArrayList();
		
		SqlSession session = sqlMapper.openSession();
		try {
			list = session.selectList("myBatis.mappers.UserMapper.getUserList");
			
		} catch (Exception e){
			e.printStackTrace();
		} finally {
			session.close();
		}
		
		return list;
	}
}


상단에서 SqlSessionFactory 객체를 가져오고 SqlSession을 오픈하고 mapper의 네임스페이스를 호출해서 쿼리를 실행시킨다.

UserMapper.xml


<mapper namespace="myBatis.mapper.UserMapper">

<select id="getUserList" resulttype="User"> SELECT userID, name, phone, email, TO_CHAR(regdate,'YYYY-MM-DD HH24:MI') regdate, isuse, auth FROM TR_USER ORDER BY REGDATE DESC</select>
</mapper>

nameSpace가 풀 경로인것을 확인한다.  resultType에는 Configure.xml 에서 typeAlias에서 지정해놓은 shortName 으로 설정한다. 네임스페이스와 실행시킬 쿼리아이디를 합해서 UserDao.java에서 호출하게 된다.


순서를 살펴 보면..

UserDao가 실행되면서 MyBatisManager 에서 Configure.xml 파일의 설정을 참조해서 SqlSessionFactory를 생성하고 Factory에서 session을 열고 UserMapper의 쿼리를 실행시킨다.

플렉스에서 받아들이는쪽은 기존의 iBatis 설정과 같으니 패스 하기로 하고 마무리~
첨부된 소스는 위에서 설명된 파일들이다.

 src.zip


저작자 표시 비영리 동일 조건 변경 허락
신고

Comment 1