[Spring Boot] MyBatis

hyunsooSong·2022년 6월 5일
0

Spring Boot

목록 보기
3/3
post-thumbnail

📟 Mybatis

📜 Mybatis 특징

  • 객체와 데이터베이스 사이에 데이터를 이동시킨다.

  • 객체와 데이터베이스가 서로 독립적으로 유지되고 mapper에 대해 서로 독립적이다.


1. Maven Dependency

  • pom.xml
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.1.3</version>
</dependency>
mybatis-spring-boot-starter가 포함하는 라이브러리 의존성
  1. org.springframework.boot:spring-boot-starter
  2. org.springframework.boot:spring-boot-starter-jdbc
  3. org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure
  4. org.mybatis:mybatis
  5. org.mybatis:mybatis-spring

2. MyBatis 설정

📜 기본 설정

  • 💡 mybatis-config.xml (Spring)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" ...>
<configuration>
  <typeAliases>
    <typeAlias type="com.example.model.Comment" alias="Commnet" />
  </typeAliases>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC" />
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost/exampleDB" />
        <property name="username" value="spring" />
        <property name="password" value="spring" />
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="com/example/repository/mapper/CommentMapper.cml" />
  </mappers>
</configuration>
  • 💡 application.properties (Spring Boot)
# Oracle DataSource settings
spring.datasource.url=jdbc:oracle:thin:@202.20.119.24:1521:orcl
spring.datacource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.username=spring
spring.datasource.password=spring

# MyBatis.settings
mybatis.type-aliases-package=[domain 패키지명]
logging.level.[mybatis mapper 패키지명]=DEBUG
spring.devtools.livereload.enabled=true
server.port=8088	(default:8080)

3. MyBatis Mapper 설정

📜 MyBatis Mapper interface 설정

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface OrderMapper {
	List<Order> getOrderList();
    Order getOrder(String orderId);
}

📜 MyBatis Mapper xml 설정

<mapper namespace="com.example.repositry.mapper.CommentMapper">
  <select id="selectCommentByPrimaryKey" parameterType="long"
          resultType="com.example.model.Comment">
    SELECT comment_no AS commentNo, user_id AS userId
    FROM Comments
    WHERE comment_no = #{commentNo}
  </select>
  <insert id="insertProduct" parameterType="com.example.model.Product">
    INSERT INTO Product (prod_id, prod_description)
    VALUES (#{id}, #{description})
  </insert>
</mapper>

4. Sql Session Factory

📜 SqlSessionFactory

: 데이터베이스 연동을 위한 SqlSession 객체를 생성하는 factory class에 대한 interface
(SqlSessionFactoryBuilder 객체로부터 SqlSessionFactory 객체 생성)

-제공하는 Methods

Configuration getConfiguration()
SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(ExecutorType execType)

📜 SqlSession

<T> T selectOne(String statement)
<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement)
<E> List<E> selectList(String statement, Object parameter)
<K,V> Map<K,V> selectMap(String statement, String mapKey)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)

int insert(String statement)
int insert(String statement, Object parameter)
int update(String statement)
int update(String statement, Object parameter)
int delete(String statement)
int delete(String statement, Object parameter)

<T> T getMapper(Class<T> type)

📜 SqlSessionFactory 및 SqlSession 생성

String resource = "mybatis-config.xml";
InputStream inputStream;
try{
	inputStream = Resource.getResourceAsStream(resource);
} catch(IOException e) {
	throw new IllegalArgumentException(e);
}

SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream);

SqlSession sqlSession = sf.OpenSession();

5. DAO 구현

📜 DAO (Repository) class

  • SqlSessionTemplate 사용
@Repository
public class CommentSessionRepository{
	@Autowired
    private SqlSessionTemplate sqlSession;

	private String namespace = "com.example.repository.mapper.CommentMapper";
    private SqlSessionFactory sqlSessionFactory = createSqlSessionFactory();
    private SqlSessionFactory createSqlSessionFactory(){
    	return new SqlSessionFactoryBuilder().build(inputStream);
    }
    
    public Comment selectCommentByPrimaryKey(Long commentNo) {
    	SqlSession sqlSession = sqlSessionFactory.openSession();
        
        try{
        	return (Comment) sqlSession.selectOne(namespace + ".selectCommentByPrimaryKey", commentNo);
        } finally { sqlSession.close(); }
    }
}

  • Mapper interface 구현 객체 직접 주입 받아 사용
@Repository
public class CommentSessionRepository{
	@Autowired
    private CommentMapper commMapper;
    
    public Comment selectCommentByPrimaryKey(Long commentNo) {
    	return commMapper.selectCommentByPrimaryKey(commentNo);
}
profile
🥕 개발 공부 중 🥕

0개의 댓글