12월 9일 - 수업 36일차 (SPRING)

수아레스·2022년 12월 11일
post-thumbnail

1. 마이바티스란?

객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크

JDBC를 통해 데이터베이스에 액세스하는 작업을 캡슐화하고 일반 SQL 쿼리, 저장 프로 시저 및 고급 매핑을 지원하며 모든 JDBC 코드 및 매개 변수의 중복작업을 제거한다. Mybatis에서는 프로그램에 있는 SQL쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 장점을 가지고 있다.

myBatis의 특징

1. SQL문의 코드로부터 완전히 분리.

기존에는 dao파일에 모든 sql쿼리문을 작성하였다. 하지만 마이바티스에서는 xml의 Mapper파일에 sql쿼리문을 입력하고 dao에서 호출하여 사용한다.

<![CDATA[

쿼리 내용

]]>

"문자열"로 인식한다.

2. 생산성

코드가 줄어들고 가독성이 좋아짐

3. 유지보수성 향상

mapper파일에 sql코드를 모아놓고 쿼리문을 변경해도 dao에서는 아무런 영향도 받지 않는다. 단지 수정된 코드를 그대로 호출하면 된다.

2. 아래의 순서대로, 프로젝트를 새로 생성후 mvc_board 리스트를 뽑아 내세요.

1) pom.xml -> 마이바티스 라이브러리 다운로드
2) VO 구현
3) Mapper Interface 선언
4) xml로 해당 Mapper Interface 구현
5) 테스트코드로 테스트

pom.xml

<!-- 마이바티스 및 오라클 드라이버 설치-->
      <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>

VO 구현

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;
}

Mapper interface 선언

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로 해당 mapper interface 구현

<?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);
		}
	}
}

3. 아래를 sql로 작성하시오.

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 함수란?

DECODE 함수란?는 프로그래밍에서의 if else 와 비슷한 기능을 수행한다.

profile
띵호와

0개의 댓글