
객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크
JDBC를 통해 데이터베이스에 액세스하는 작업을 캡슐화하고 일반 SQL 쿼리, 저장 프로 시저 및 고급 매핑을 지원하며 모든 JDBC 코드 및 매개 변수의 중복작업을 제거한다. Mybatis에서는 프로그램에 있는 SQL쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 장점을 가지고 있다.
기존에는 dao파일에 모든 sql쿼리문을 작성하였다. 하지만 마이바티스에서는 xml의 Mapper파일에 sql쿼리문을 입력하고 dao에서 호출하여 사용한다.
<![CDATA[
쿼리 내용
]]>
"문자열"로 인식한다.
코드가 줄어들고 가독성이 좋아짐
mapper파일에 sql코드를 모아놓고 쿼리문을 변경해도 dao에서는 아무런 영향도 받지 않는다. 단지 수정된 코드를 그대로 호출하면 된다.
1) pom.xml -> 마이바티스 라이브러리 다운로드
2) VO 구현
3) Mapper Interface 선언
4) xml로 해당 Mapper Interface 구현
5) 테스트코드로 테스트
<!-- 마이바티스 및 오라클 드라이버 설치-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<!-- JSP를 사용하기 위한 라이브러리 추가-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- logging 위한 라이브러리 추가-->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
</dependencies>
import java.sql.Timestamp;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class BoardVO {
private int bid;
private String bname;
private String btitle;
private String bcontent;
private Timestamp bdate;
private int bhit;
private int bgroup;
private int bstep;
private int bindent;
}
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import edu.global.ex.vo.BoardVO;
@Mapper
public interface BoardMapper {
public List<BoardVO> getList();
}
<?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="edu.global.ex.mapper.BoardMapper">
<select id="getList" resultType="edu.global.ex.vo.BoardVO">
<!-- 여기 들어가는 문구는 xml이 아니라는걸 표현해주는거임. -->
<![CDATA[
select * from mvc_board order by bgroup desc, bstep asc
]]>
</select>
</mapper>
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import edu.global.ex.vo.BoardVO;
@SpringBootTest
class BoardMapperTest {
@Autowired
private BoardMapper boardMapper;
@Test
void test() {
System.out.println(boardMapper);
List<BoardVO> boards = boardMapper.getList();
for(BoardVO board : boards) {
System.out.println(board);
}
}
}
1. 모든 사원의 이름(첫 글자는 대문자로, 나머지 글자는 소문자로 표시) 및 이름 길이를
표시하는 쿼리를 작성하고 컬럼 별칭은 적당히 넣어서 출력하라.
SELECT UPPER(SUBSTR(ENAME,1,1)) || LOWER(SUBSTR(ENAME,2,LENGTH(ENAME))),
LENGTH(ENAME) FROM EMP;
2. 사원의 이름과 커미션을 출력하되, 커미션이 책정되지 않은
사원의 커미션은 'no commission'으로 출력하라.
SELECT ENAME, NVL(TO_CHAR(COMM) , 'NO COMMISSION' ) AS COMM FROM EMP;
3. 모든 사원의 이름,부서번호,부서이름을 표시하는 질의를 작성하라. (DECODE)
SELECT ENAME, DEPTNO, DECODE
(DEPTNO, 10, 'ACCOUNTING', 20, 'RESEARCH', 30, 'SALES', 40, 'OPERATIONS') AS "DNAME" FROM EMP;
4. 30번 부서에 속한 사원의 이름과 부서번호 그리고 부서이름을 출력하라.
SELECT ENAME, E.DEPTNO, DNAME FROM EMP E, DEPT D WHERE D.DEPTNO = 30 AND E.DEPTNO = D.DEPTNO;
DECODE 함수란?는 프로그래밍에서의 if else 와 비슷한 기능을 수행한다.
