메모장

MyBatis

lyndaa 2023. 4. 12. 18:23

마이바티스(MyBatis)는 자바 객체와 SQL문 사이의 자동 매핑(mapping)을 지원하는 오픈 소스 프레임워크입니다. 즉, 개발자가 SQL문을 직접 작성하여 데이터베이스와 상호작용할 수 있으면서도, 코드상에서 객체 지향적인 방식으로 데이터를 다룰 수 있습니다.

 

MyBatis에서 지원하는 <transactionManager>의 종류는 다음과 같습니다.

- JDBC: JDBC 트랜잭션 매니저를 사용합니다.
- MANAGED: 외부 컨테이너가 트랜잭션 매니저를 관리합니다.
- JTA: JTA(Java Transaction API)를 사용합니다.

<마이바티스를 사용위해 필요한 것>

1. 데이터베이스: 마이바티스를 사용하여 데이터를 조회하거나 조작할 데이터베이스가 필요합니다.

2. 마이바티스 라이브러리: 마이바티스를 사용하기 위해 필요한 라이브러리 파일들입니다. 이 라이브러리는 Maven 등의 빌드 도구를 통해 다운로드하여 사용할 수 있습니다. link

3. 마이바티스 환경 설정 파일: 마이바티스의 동작 방식을 설정하는 XML 파일입니다. 이 파일에는 데이터베이스 연결 정보, SQL문의 위치 등을 설정할 수 있습니다.

4. SQL문: 마이바티스를 사용하여 데이터베이스에 접근하려면 SQL문을 작성해야 합니다.

<마이바티스를 사용>


1. 마이바티스 환경 설정 파일 작성: 마이바티스를 사용하기 위해 먼저 마이바티스 환경 설정 파일을 작성합니다. 이 파일에는 데이터베이스 연결 정보, SQL문의 위치 등을 설정합니다.

2. SQL문 작성: 데이터베이스와 상호작용하기 위한 SQL문을 작성합니다. 이때 마이바티스의 특수 태그를 사용하여 자바 객체와 SQL문을 매핑(mapping)합니다.

3. DAO 클래스 작성: DAO(Data Access Object) 클래스를 작성합니다. 이 클래스에서는 마이바티스를 사용하여 데이터베이스와 상호작용하는 메서드를 구현합니다.

4. 마이바티스 설정 파일을 로드하고 DAO 클래스를 인스턴스화하여 사용: 마이바티스 환경 설정 파일을 로드하고 DAO 클래스를 인스턴스화하여, 데이터베이스와 상호작용하는 메서드를 호출합니다.

이렇게 마이바티스를 사용하여 자바 언어로 데이터베이스와 상호작용하는 코드를 작성할 수 있다.

 

  • 1. properties 파일 작성

properties 파일은 키-값 쌍으로 구성된 간단한 구성 파일입니다.

마이바티스에서는 properties 파일을 사용하여 다양한 설정 값을 관리할 수 있습니다. 주로 환경 설정 정보나 데이터베이스 연결 정보 등의 민감한 정보를 포함하는 경우가 많습니다.

properties 파일은 일반적으로 *.properties 형식으로 작성되며, 각 줄마다 key=value 형식으로 값을 지정합니다. 이러한 properties 파일은 Java에서 java.util.Properties 클래스를 사용하여 로드할 수 있습니다.

마이바티스에서는 properties 파일을 사용하여 다음과 같은 설정 값을 관리할 수 있습니다.

- 데이터베이스 연결 정보
- 캐시 설정
- SQL 매퍼 파일 위치
- MyBatis 설정

데이터베이스 연결 정보, 캐시 설정, SQL 매퍼 파일 위치, MyBatis 설정 등을 key=value 형식으로 설정하고 있습니다. 이러한 설정 값은 마이바티스의 환경 설정 파일에서 ${key} 형태로 참조할 수 있습니다.

  • 2. 환경설정 파일

마이바티스를 사용하기 위해서는 환경 설정 파일이 필요합니다. 이 파일은 데이터베이스 연결 정보, SQL 매퍼 파일 위치 등을 설정합니다.

마이바티스의 환경 설정 파일은 XML 형식으로 작성되며, 일반적으로 mybatis-config.xml이라는 이름으로 작성됩니다. 이 파일은 마이바티스가 동작할 때 가장 먼저 로드되며, 필요한 설정을 불러오는 역할을 합니다.

아래와 같은 설정 가능

- 데이터베이스 연결 정보 설정
- SQL 매퍼 파일 위치 설정
- 객체 생성 팩토리 설정
- 캐시 설정
- 기타 환경 설정

 

일반적으로 환경 설정 파일은 마이바티스 프로젝트의 루트 디렉토리에 위치합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
 	<!-- db 접속 정보(db.properties) ${key}-->
 	<properties resource="com/my/db/db.properties" />
 	
 	<!-- typeAlias(별칭) 클래스의 별칭  -->
 	<typeAliases>
 		<typeAlias type="com.my.dto.MyBoardDto" alias="MyBoardDto"/>
 	</typeAliases>
 	
 	<!-- db 접속 설정 -->
 	<environments default="development">
 		<environment id="development">
 			<transactionManager type="JDBC"/>
 			<dataSource type="POOLED"> <!-- unpooled 따로 저장안함  -->
 				<property name="driver" value="${driver}"/>
 				<property name="url" value="${url}"/>
 				<property name="username" value="${username}"/>
 				<property name="password" value="${password}"/>
 			</dataSource>
 		</environment>
 	</environments>
 	
 	<!-- Mapper -->
 	<mappers>
 		<mapper resource="com/my/db/Mapper.xml" />
 	</mappers>	
 </configuration>

위 예시에서는 데이터베이스 연결 정보를 설정하고, SQL 매퍼 파일의 위치를 지정하고 있습니다.

 

<mappers> 요소는 SqlSessionFactory가 생성될 때 매퍼 파일을 읽어와서 SQL 매퍼와 매핑 정보를 구성합니다.

 

<configuration> 요소는 MyBatis의 설정 정보를 담는 최상위 요소입니다. MyBatis 설정 파일은 일반적으로 XML 형식으로 작성되며, <configuration> 요소가 파일의 시작점이 됩니다.

<configuration> 요소는 다음과 같은 하위 요소를 포함할 수 있습니다.

- <properties>: 프로퍼티 파일의 경로와 함께 설정을 위한 프로퍼티를 정의합니다.
- <settings>: MyBatis의 전반적인 설정을 지정합니다.
- <typeAliases>: 사용자 정의 타입 별칭을 지정합니다.
- <typeHandlers>: 사용자 정의 타입 핸들러를 등록합니다.
- <objectFactory>: 객체 생성 방식을 지정합니다.
- <plugins>: MyBatis의 플러그인을 등록합니다.
- <environments>: MyBatis가 사용할 환경(데이터베이스 연결 등)을 지정합니다.
- <databaseIdProvider>: 데이터베이스의 종류를 판별하여 SQL 매퍼 파일에서 조건 처리에 사용합니다.
- <mappers>: SQL 매퍼 파일의 위치를 지정합니다.
- <configuration> 요소는 MyBatis 설정 파일에서 단 하나만 존재해야 하며, 모든 MyBatis 설정 정보를 포함합니다.

environments 요소에서는 개발 환경을 설정하고, dataSource 요소에서는 데이터베이스 연결 정보를 설정합니다. mappers 요소에서는 SQL 매퍼 파일의 위치를 지정합니다.

  • 3. 매퍼 파일 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.my.myboard">
 	<resultMap type="com.my.dto.MyBoardDto" id="MyBoardMap">
 		<result property="myno" column="MYNO" />
 		<result property="myname" column="MYNAME" />
 		<result property="mytitle" column="MYTITLE" />
 		<result property="mycontent" column="MYCONTENT" />
 		<result property="mydate" column="MYDATE" />
 	</resultMap>
 	
 	<select id="selectAll" resultType="MyBoardDto">
 		SELECT MYNO, MYNAME, MYTITLE, MYCONTENT, MYDATE
 		FROM MYBOARD
 		ORDER BY MYNO DESC
 	</select>
 	
 	<select id="selectOne" resultMap="MyBoardMap" parameterType="int">
 		SELECT *
 		FROM MYBOARD
 		WHERE MYNO=#{myno}
 	</select>
 	
 	<insert id="myinsert" parameterType="MyBoardDto">
 		INSERT INTO MYBOARD VALUES(NULL,#{myname},#{mytitle},#{mycontent},NOW())
 	</insert>
 	
 	<delete id="muldel" parameterType ="map">
 		DELETE FROM MYBOARD
 		WHERE MYNO IN
 		<foreach collection="seq" item="seq" open="(" separator="," close=")">
 			#{seq}
 		</foreach>
 	</delete>
 	
 	
 	
 	
 	
 </mapper>
  • MyBatis의 SqlSessionFactory 객체를 생성
package com.my.dao;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SqlMapConfig {
	
	private SqlSessionFactory sqlSessionFactory;
	
	// sqlSeessionFactory 객체 생성 후 리턴
	public SqlSessionFactory getSqlSessionFactory() {
		//Config.xml의 경로 
		String resource = "com/my/db/Config.xml";
		
		try {
			//Config.xml의 파일 정보를 읽어온다.
			Reader reader = Resources.getResourceAsReader(resource);
			
			//읽어온 정보를 가지고
			//sqlSessionFactory 객체 생성
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sqlSessionFactory;
	}	
}

SqlSessionFactory는 데이터베이스와의 세션을 생성하고 관리하는 인터페이스입니다.

SqlMapConfig 클래스는 SqlSessionFactory 객체를 생성하기 위해 MyBatis 설정 파일인 Config.xml을 읽어온 후, SqlSessionFactoryBuilder 클래스를 사용하여 SqlSessionFactory 객체를 생성합니다.
getSqlSessionFactory() 메서드는 생성된 SqlSessionFactory 객체를 반환합니다. 이렇게 생성된 SqlSessionFactory 객체는 MyBatis를 사용하여 데이터베이스와의 세션을 관리할 때 사용됩니다. 예를 들어, SqlSession 객체를 생성하기 위해서는 SqlSessionFactory 객체를 사용합니다.

 

SqlSessionFactory는 데이터베이스와의 세션을 생성하고 관리하는 인터페이스입니다. SqlSessionFactory를 생성하면, SqlSession 인터페이스를 사용하여 데이터베이스와 상호작용할 수 있습니다.

SqlSession은 MyBatis에서 SQL 매퍼 파일을 실행하기 위해 사용되는 인터페이스입니다. SqlSession 인터페이스는 데이터베이스와의 트랜잭션을 관리하며, SQL 실행 결과를 반환합니다.

SqlSessionFactory 객체를 생성하고 나면, SqlSession 객체를 생성하여 데이터베이스와 상호작용할 수 있습니다. SqlSession 객체를 생성하려면 SqlSessionFactory 객체에서 openSession() 메서드를 호출합니다. 이렇게 생성된 SqlSession 객체를 사용하여 SQL 매퍼 파일을 실행하고, 데이터베이스와의 세션을 관리합니다.

따라서, SqlSessionFactory는 MyBatis에서 데이터베이스와의 상호작용을 위해 반드시 필요한 객체입니다.

public class MyBoardDao extends SqlMapConfig{
	private String namespace="com.my.myboard.";
	
	//전체 출력
	public List<MyBoardDto> selectAll(){
		List<MyBoardDto> res = new ArrayList<MyBoardDto>();
		
		SqlSession session = getSqlSessionFactory().openSession(true);
		//openSession(true): autoCommit
		
		res = session.selectList("com.my.myboard.selectAll");
		//"com.my.myboard"라는 namespace로 설정된 mapper 파일에서
		//"selectAll"라는 id를 가진 sql 실행
		
		session.close();
		
		return res;
	}
}

 

+ SqlSession 인터페이스를 구현하는 객체의 제공 메서드

- selectOne(String statement, Object parameter) : 단일 결과를 반환하는 쿼리를 실행합니다.
- selectList(String statement, Object parameter) : 다중 결과를 반환하는 쿼리를 실행합니다.
- insert(String statement, Object parameter) : 데이터를 삽입하는 쿼리를 실행합니다.
- update(String statement, Object parameter) : 데이터를 갱신하는 쿼리를 실행합니다.
- delete(String statement, Object parameter) : 데이터를 삭제하는 쿼리를 실행합니다.
- commit() : 현재 세션의 변경사항을 커밋합니다.
- rollback() : 현재 세션의 변경사항을 롤백합니다.
- close() : 현재 세션을 닫습니다.
위 메서드들은 String 타입으로 statement와 Object 타입으로 parameter를 받습니다. statement는 실행할 SQL 쿼리를 정의한 매퍼 파일에서의 SQL ID를 나타내며, parameter는 SQL 쿼리를 실행하는 데 필요한 매개변수입니다.

이외에도 SqlSession 객체는 여러 유용한 메서드들을 제공하고 있으며, Mapper 인터페이스와 연결하여 사용할 수도 있습니다.

'메모장' 카테고리의 다른 글

JSP_MVC #1  (0) 2023.04.05
[Git] Commit 하고 원격 저장소에 올리기 및 수정  (0) 2023.02.15