기록/BACKEND

[WEB] MyBatis 설정

5월._. 2022. 4. 25.
728x90

1. pom.xml

라이브러리를 추가한다.

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.5.9</version>
</dependency>

 

2. src/main/resources/mybatis-config.xml

데이터베이스, 매퍼 등 설정파일이다.

순서를 꼭 지켜야한다.

이 코드에서는 db 아이디나 비밀번호를 properties파일로 따로 저장했다.

properties는 이렇게 만든다.

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/스키마이름?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8
dbid=아이디
dbpwd=비밀번호
<?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>
	<properties resource="dbproperties저장한파일명.properties"/>

	<typeAliases>
		<typeAlias type="DTO자바파일위치" alias="별칭" />
	</typeAliases>
	
	<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="${dbid}"/>
                <property name="password" value="${dbpwd}"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
		<mapper resource="sql작성할mapper명.xml" />
	</mappers>
	
</configuration>

 

3. SqlMapConfig.java

이름은 같지 않아도 된다. 

이 파일에 SqlSession을 반환하는 메서드를 작성한다. 예전에 Connection을 받아오던 DBFactory와 같은 역할을 한다.

1.  Resources객체에서 Resource를 Reader로 바꿔서 가져온다. 이때 인자값은 mybatis config파일폴더명이다.

2.  Reader라는 io객체를 받아오면 그걸 다시 파라미터로 넣고 factory를 설정한다.

3.  getSqlSession() 메서드를 만들어서 factory.openSession()을 반환시킨다.

openSession에서 파라미터로 true를 주면 autoCommit이 된다. 하지만 테스트용 외에는 추천하지 않는다. 너무 위험하기 때문이다.

import java.io.IOException;
import java.io.Reader;

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 SqlMapConfig {
	private static SqlSessionFactory factory;

	static {
		try {
			String resource = "mybatis-config.xml";
			Reader reader = Resources.getResourceAsReader(resource);
			factory = new SqlSessionFactoryBuilder().build(reader);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static SqlSession getSqlSession() {
		return factory.openSession();
	}
}

 

4. src/main/resources/mapper.xml

mapper가 많아지면 resources 밑에 mapper 폴더를 하나 더 만들어서 위치시켜도 된다. 기존 Dao에서 하던 sql 구문이 mapper에 들어간다. 

주의해야할 점

1.  반드시 맨 위에 dtd를 붙인다.

2.  mapper의 namespace는 이 sql문을 사용할 dao의 전체 주소를 붙이는 게 좋다. 유니크해야하기 때문이다. 예를 들면 com.___.____.model.dao.___Dao 이런 식이다.

3.  sql의 id는 Dao의 메서드 이름으로 한다. 구분하기 편하기 때문이다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper 
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="Dao전체주소">
	<insert id="Dao메서드이름" parameterType="위에서정한별칭">
	insert into 테이블명 (db컬럼명,db컬럼명,db컬럼명,db컬럼명,db컬럼명)
	values(#{Dto변수명},#{Dto변수명},#{Dto변수명},#{Dto변수명})
	</insert>

	<select id="Dao메서드이름" resultType="위에서정한별칭" parameterType="map">
	select db컬럼명,db컬럼명 from 테이블명
	where db컬럼명=#{map의Key} and db컬럼명=#{map의Key}
	</select>
</mapper>

 

5. Dao

위의 자바클래스에서 SqlSession을 얻은 뒤 그 객체로 mapper.xml의 sql을 실행한다.

종류는 insert, selectOne 등이 있다. mapper의 sql 아이디를 이 클래스의 메서드명으로 했기 때문에 함수 이름과 같은 sql을 그대로 부르면 된다. parameter가 필요하다면 같이 넣어서 호출한다.

public class ___DaoImpl implements ___Dao {
	private final String NAMESPACE = "namespace명.";

	@Override
	public void insert예시메서드(___Dto dto) throws SQLException {
		try(SqlSession sqlSession = SqlMapConfig.getSqlSession()){
			sqlSession.insert(NAMESPACE+"insert예시메서드",dto);
			sqlSession.commit();
		}
	}

	@Override
	public ___Dto selectOne예시메서드(Map<String, String> map) throws SQLException {
		try(SqlSession sqlSession = SqlMapConfig.getSqlSession()){
			return sqlSession.selectOne(NAMESPACE+"selectOne예시메서드",map);
		}
	}
}

'기록 > BACKEND' 카테고리의 다른 글

[Spring] MyBatis Mapper interface 자동 주입  (0) 2022.04.27
[Spring] MyBatis 설정(feat.Spring)  (0) 2022.04.26
[Spring] Interceptor  (0) 2022.04.24
[Spring] File Download  (0) 2022.04.23
[Spring] File Upload  (0) 2022.04.22

댓글