블로그 이미지
드림&T

Rss feed Tistory
개발/java 2012/07/29 09:27

[MyBatis] MySQL 연결하기 - 2. SqlSession 객체로 SQL문 실행하기



[MyBatis] 이클립스(Eclipse Juno)로 MyBatis 예제 프로젝트 만들기 (http://emflant.tistory.com/29)

[MyBatis] MySQL 연결하기 - 1. Config XML 설정파일 (http://emflant.tistory.com/30)

 

앞의 포스팅을 다 따라했다면 이제 실질적 코딩을 해보자.

 

1. com.mybatis.sample.app 패키지에 클래스를 하나 추가한다 클래스명은 SampleSessionFactory 로 정하자. 안의 소스는 다음과 같이 작성한다.

package com.mybatis.sample.app;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;


public class SampleSessionFactory {
	
	public void demo(){
		
		//앞서 정의했던 xml 설정 파일의 위치와 파일명.
		String resource = "com/mybatis/sample/sql/mybatis-config.xml";

		//따로 properties 파일에 정의해도 되지만 귀찮아서 객체로 직접 생성.
		Properties props = new Properties();
		
		props.put("driver"		, "com.mysql.jdbc.Driver");
		props.put("url"			, "jdbc:mysql://localhost/world");
		props.put("username"	, "아이디 넣으세요.");
		props.put("password"	, "비밀번호 넣으세요.");
		
		SqlSession session = null;
		
		try {
			InputStream inputStream = Resources.getResourceAsStream(resource);
			SqlSessionFactory sqlSessionFactory 
				= new SqlSessionFactoryBuilder().build(inputStream, props);

			//false 는 autoCommit 하지 않겠다는 의미.
			session = sqlSessionFactory.openSession(false);
			
		} catch (IOException e) {
			e.printStackTrace();
			return; //에러나면 메소드 종료
		}
		
		//쿼리에 필요한 입력값을 셋팅한다.
		HashMap<String, String> input = new HashMap<String, String>();
		input.put("code", "AIA");
		
		List<HashMap<String, String>> outputs 
			= session.selectList("SqlSampleMapper.selectSample", input);
		
		System.out.println(outputs.get(0));
		
		session.commit();
		session.close();
		
	}

}

우선 MyBatis에서 중심의 역할을 하는 SqlSessionFactory 객체를 만든다. 그 객체로부터 SQL문을 직접 실행 할 수 있는 SqlSession 객체를 받아오고(openSession() 메소드) 그 객체로 Sql 문을 실행해서(selecList 메소드) 결과를 가져오는 아주 간단한 프로그램이다.

 

신경써야 할 곳은.. 23 라인에 url을 셋팅하는 곳이 있다. 나는 MySQL이 기본으로 제공하는 World 스키마를 사용하려고 그렇게 지정한 것이므로 각자 알아서 스키마 이름을 기입하면 된다. openSession은 auto commit 옵션을 줄 수 있는데 false 는 등록/수정/삭제 쿼리를 실행하더라도 commit 되지 않고 있다가 SqlSession 객체의 commit() 메소드를 실행해야 커밋된다. 위 로직에서는 에러시 롤백처리에 대한 고려는 전혀 없으니 잘 생각해서 구조를 잡으시면 된다.

 

근데 이곳에는 쿼리를 작성하는 곳이 없다. 어딜까. 바로 Mapper 파일을 따로 만들어야 한다. MyBatis를 가장 좋아하는 이유가 여기서 나온다. 자바 DAO 로 쿼리 짜보시면 알겠지만 " " 로 묶는 작업이 아주 귀찮고, + 로 하지말고 StringBuffer객체로 append 해야 String 객체의 오남용을 줄이니 쿼리가 조금만 길어도 java 소스로 봐서는 무슨쿼리인지 한눈에 들어오기 힘들다. 하지만 xml 파일이니 < > 문자만 조심해서 붙여 넣어 주기만 하면 되고 변수 선언도 #{ }, ${ } 로 쉽게 해서 직관적이니 귀찮은 작업이 많이 줄게 된다.

com.mybatis.sample.sql 패키지 안에 SampleMapper.xml 파일을 새로 생성하고 아래의 내용을 넣는다.

 

 

Mapper XML 파일마다 namespace 를 정의해서 사용한다. 이 이름은 위의 java 파일에서 보이는 session.selectList("SqlSampleMapper.selectSample", input); 에서 쓰인다. 그리고 입력 형식과 출력 형식 모두 나는 HashMap 으로 정의해서 사용했다. DTO 객체를 정의해서 해도된다. 작성해야 할 파일은 다 한 거 같다. 마지막으로 확인해야 할 것은 전 포스팅에서 작성했던 mybatis-config.xml 파일에 SampleMapper.xml 파일이 정상적으로 셋팅이 되있는지만 확인하자.

 

 

이제 Main 클래스를 만들어서 실행해서 잘나오면 DB와 연결하여 조회하는 것은 이제 성공이다.

 

 

사실 여기서는 DB와 연결해서 쿼리문 날리는 게 목적이라 코딩이 초딩 수준이지만, SqlSessionFactory 를 따로 선언해서 SqlSession 객체를 받아다 쓰는 패턴으로 되야 할 것이고, 트랜젝션 commit 및 rollback 처리에 대한 로직을 구성해야 하므로 대폭적인 수정을 해서 사용해야 문제가 없을 듯 하다.






저작자 표시 비영리 변경 금지
          
http://emflant.tistory.com/trackback/31 관련글 쓰기
  • 질문. 2014/01/29 13:25 ADDR 수정/삭제 답글

    관리자의 승인을 기다리고 있는 댓글입니다

TOTAL 293,314 TODAY 196

티스토리 툴바