MyBatis

개발자가 지정한 SQL, 저장 프로시저 및 고급 매핑을 지원하는 Persistence Framework

 

 

Persistence Framework

데이터 지속성을 위한 데이터 CRUD를 다루는 클래스 및 설정 파일들의 집합

JDBC의 반복되는 코드를 제거해주며 프로그램 코드와 SQL을 분리할 수 있다.

 

 

Persistence Framework 종류

 

SQL Mapper : mybatis

SQL문으로 직접 DB 접근

 

Object Relational Mapper : hibernate

자바 객체를 통해 간접적으로 DB 접근

 


 

 

MyBatisConfig.java

import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;

@Configuration
public class MyBatisConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource datasource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(datasource);

        return (SqlSessionFactory) sqlSessionFactory.getObject();
    }
}

 

mybatis의 환경설정 파일입니다.

DB 연결 대상, 매핑 파일 경로, 작업 설정 등과 같은 세부 설정이 가능합니다.

 

마이바티스를 스프링에서 사용하기 위해서는 SqlSessionFactory 1개 이상의 매퍼 인터페이스가 필요합니다.

 

마이바티스만을 사용하면 SqlSessionFactory를 SqlSessionFactoryBuilder를 사용하여 생성하는데,

대신 스프링에서는 SqlSessionFactoryBean이 사용됩니다.

 

 

SqlSessionFactoryBean

스프링의 FactoryBean 인터페이스를 구현

어플리케이션 시작 시점에 SqlSessionFactory를 빌드하고 sqlSessionFactory 라는 이름으로 저장하는 것입니다.

 

SqlSessionFactoryBean 자체를 생성하는 것이 아니라 팩토리에서 getObject() 메소드를 호출한 결과를 리턴합니다.

SqlSessionFactory가 datasource를 참조하여 mybatis와 db를 연동시킵니다.

 

 

 

 

(참고)

datasource는 application.properties에 선언되어 있습니다.

 

 

 

MemberVO.java

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberVO {
    private String custId;
    private String custName;
    private String ognName;
    private String email;
    private String telNum;
    private String mcomNum;
}

 

환경설정이 끝나면 DB 데이터와 매핑할 자바 객체를 생성합니다.

 

 

MemberMapper.xml

<?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="com.boot.example.mapper.member.MemberMapper">

    <select id="allMembers" resultType="com.boot.example.domain.MemberVO">
         [[ SQL Query ]]
    </select>

</mapper>

 

xml로 쿼리를 깔끔하게 관리할 수 있습니다.

 

 

MemberMapper.java

// Mapper Interface 
@Mapper
public interface MemberMapper {
    public List<MemberVO> allMembers();
}

 

주의할 점

 

MemberMapper Interface 파일과 MemberMapper xml 파일은 반드시 같은 경로에 존재해야합니다.

 

Interface 경로가 java 밑의

com.boot.example.mapper.member 라면

 

xml 경로는 resources 밑의

com.boot.example.mapper.member

로 지정해야 인식이 가능

 

 

 

MemberServiceImpl.java

@Service
public class MemberServiceImpl implements MemberService {

    @Autowired
    private MemberMapper memberMapper;

    @Override
    public List<MemberVO> allMembers() {
        return memberMapper.allMembers();
    }
}

 

allMembers id를 가진 쿼리를 수행합니다.

interface 파일은 생략했습니다.

 

MemberServiceImpl -> MemperMapper.java -> MemperMapper.xml -> 쿼리 수행 -> MemberServiceImpl

 

위와 같은 방식으로 MemberVO 형 객체를 반환받게 됩니다.

 

 

MemberService를 실행할 컨트롤러와 간단한 jsp 파일을 만듭니다.

 

MemberController.java

@Controller
@RequestMapping("/members")
public class MemberController {

    @Autowired
    private MemberService memberService;

    @GetMapping("/")
    public String member(Model mdl) {
        List<MemberVO> members = memberService.allMembers();
        mdl.addAttribute("members", members);

        return "memberList";
    }
}

 

memberList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html lang="ko">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>View Test Page</title>
</head>

<body>
    <h2>${serverTime}</h2>
    <div>Member List Test</div>
    <c:forEach var="item" items="${members}" varStatus="idx"> ${idx.index}, ${item} <br /> </c:forEach>
</body>

</html>

 

 

결과

 

 

복사했습니다!