SQL 매퍼(Mapper) 프레임워크이다.SQL을 XML 파일에 작성하기 때문에, SQL의 변환이 자유롭고 가독성도 좋다.1. pom.xml
- 스프링 버전, 자바 버전 설정
- <java-version>1.11</java-version>
- <org.springframework-version>5.0.7.RELEASE</org.springframework-version>
- <version>3.5.1</version>
- <source>1.11</source>
- <target>1.11</target>
- Project Facets > Java > 11
2. 파일 생성하기
- com.test.spring > "MyBatisController.java"
> "MyBatisService.java" (I)
> "MyBatisServiceImpl.java"
> "MyBatisDAO.java" (I)
> "MyBatisDAOImpl.java"
> "MyBatisDTO.java"
- "com.test.spring.mapper" > "test.xml"
- views > "result.jsp"
- WEB-INF > "mybatis.xml"
3. script.sql
- tblMyBatis
4. WEB-INF > spring > root-context.xml
pom.xml 추가<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.lazyluke/log4jdbc-remix -->
<dependency>
<groupId>org.lazyluke</groupId>
<artifactId>log4jdbc-remix</artifactId>
<version>0.2.7</version>
</dependency>
💬 pom.xml
- 메이븐 설정 파일
- <dependency> 관리 : 프로젝트를 구현하는데 반드시 필요한 *.jar(클래스들) , 의존 객체
- <dependency> 1개당 : 1개 이상의 *.jar를 관리한다.
💬 Maven Repository
- https://mvnrepository.com/
- 여러 *.jar 관리하고 있는 온라인 저장소
- Maven pom.xml의 내용을 바탕으로 Maven Repository에서 필요한 *.jar를 다운로드한다.

root-context.xml 추가 <!-- 프로젝트 전반에 걸친 환경 설정 -->
<!-- DB 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
<property name="username" value="hr"></property>
<property name="password" value="java1234"></property>
</bean>
<bean id="log4j" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
<constructor-arg ref="dataSource"></constructor-arg>
<property name="logFormatter">
<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
<property name="loggingType" value="MULTI_LINE"></property>
<property name="sqlPrefix" value="[SQL] "></property>
</bean>
</property>
</bean>
<bean id="sessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="log4j"></property><!-- 객체 의존 주입 -->
<property name="mapperLocations" value="classpath*:com/test/spring/mapper/*.xml"></property>
<property name="configLocation" value="/WEB-INF/mybatis.xml"></property>
</bean>
<!-- 최종적으로 사용하는 아이 -->
<bean class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sessionfactory"></constructor-arg>
</bean>
💬 모든 라이브러리 관리는 pom.xml
외부 연동 관련 정보는(DB접속하기 위한 정보를 설정) root-context.xml
tblMyBatis 테이블생성create table tblMyBatis (
seq number primary key,
item varchar2(100) not null,
price number not null,
regdate date default sysdate not null
);
create sequence seqMyBatis;
insert into tblMyBatis (seq, item, price, regdate) values (seqMyBatis.nextVal, '마우스', 35000, default);
insert into tblMyBatis (seq, item, price, regdate) values (seqMyBatis.nextVal, '키보드', 50000, default);
insert into tblMyBatis (seq, item, price, regdate) values (seqMyBatis.nextVal, '모니터', 230000, default);
commit;
package com.test.spring;
import lombok.Data;
@Data
public class MyBatisDTO {
private String seq;
private String item;
private String price;
private String regdate;
}
💬 Spring MVC 전체 구조
1) MyBatisController.java
@Autowired@Controller
public class MyBatisController {
@Autowired
private MyBatisService service;
@GetMapping(value="/m1")
public String m1(Model model) {
//정적 쿼리 > 인자값X, 반환값X
service.m1();
return "result";
}
2) MyBatisService.java
public interface MyBatisService {
void m1();
}
3) MyBatisServiceImpl.java
@Service @Service
public class MyBatisServiceImpl implements MyBatisService {
@Autowired
private MyBatisDAO dao;
@Override
public void m1() {
dao.m1();
}
}
4) MyBatisDAO.java
public interface MyBatisDAO {
void m1();
}
5) MyBatisDAOImpl.java
@Repository
MyBatis > XML 기반의 Query 작업
@Repository
public class MyBatisDAOImpl implements MyBatisDAO {
@Autowired
private SqlSessionTemplate template; // 기존의 JDBC : Statement + ResultSet + Mapping
@Override
public void m1() {
template.insert("test.m1");
}
}
6) test.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="test">
<insert id="m1">
insert into tblMyBatis (seq, item, price, regdate)
values (seqMyBatis.nextVal, '본체', 50000, default)
</insert>
</mapper>
DTO 넣어서 만들기 (Model model, MyBatisDTO dto)1) MyBatisController.java
@GetMapping(value="/m4")
public String m4(Model model, MyBatisDTO dto) {
int result = service.m4(dto);
model.addAttribute("result", result);
return "result";
}
2) MyBatisService.java
int m4(MyBatisDTO dto);
3) MyBatisServiceImpl.java
@Override
public int m4(MyBatisDTO dto) {
return dao.m4(dto);
}
4) MyBatisDAO.java
int m4(MyBatisDTO dto);
5) MyBatisDAOImpl.java
public int m4(MyBatisDTO dto) {
return template.insert("test.m4", dto);
}
6) test.xml ⭐
<insert id="m4" parameterType="dto">
insert into tblMyBatis (seq, item, price, regdate)
values (seqMyBatis.nextVal, #{item}, #{price}, default)
</insert>
mybatis.xml를 수정하면 됨✔ mybatis.xml
<typeAliases>
<typeAlias type="com.test.spring.MyBatisDTO" alias="dto"/>
</typeAliases>


1) MyBatisController.java
@GetMapping(value="/m2")
public String m2(Model model, String seq) {
// > seq 전달 > 가격 인상
//http://localhost:8090/spring/m2?seq=1
int result = service.m2(seq);
model.addAttribute("result", result);
return "result";
}
2) MyBatisService.java
int m2(String seq);
3) MyBatisServiceImpl.java
@Override
public int m2(String seq) {
return dao.m2(seq);
}
4) MyBatisDAO.java
int m2(String seq);
5) MyBatisDAOImpl.java
public int m2(String seq) {
return template.update("test.m2", seq);
}
6) test.xml
<update id="m2" parameterType="String">
update tblMyBatis set price = price * 1.2
where seq = #{seq}
</update>
1) MyBatisController.java
@GetMapping(value="/m3")
public String m3(Model model, String seq) {
int result = service.m3(seq);
model.addAttribute("result", result);
return "result";
}
2) MyBatisService.java
int m3(String seq);
3) MyBatisServiceImpl.java
@Override
public int m3(String seq) {
return dao.m3(seq);
}
4) MyBatisDAO.java
int m3(String seq);
5) MyBatisDAOImpl.java
@Override
public int m3(String seq) {
return template.delete("test.m3", seq);
}
6) test.xml
<delete id="m3" parameterType="String">
delete from tblMyBatis where seq = #{seq}
</delete>