DB - SQL

MyBatis 활용하기 : DB 연결, DB 테이블 값 가져오기

TerianP 2022. 6. 13. 20:32
728x90

MyBatis

  • SQL Mapping Framework
  • mybatis 는 DB 를 보다 쉽게 사용할 수 있게 해주는 일종의 DB 프레임워크이다
    • 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크로서 JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 SQL 쿼리, 저장 프로 시저 및 고급 매핑을 지원하며 모든 JDBC 코드 및 매개 변수의 중복작업을 제거 합니다. Mybatis에서는 프로그램에 있는 SQL쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 장점을 가지고 있습니다.
  • mybatis 의 원래 이름은 ibatis 로 ibatis 가 google 의 지원을 받아 업그레이드! 된게 바로 mybatis이다.
  • 아래 2가지 사이트 아무거나 사용해서 maven 으로 넣던가 아니면 git 에서 jar 를 다운받는다.

MyBatis - 마이바티스 3 | 소개

 

MyBatis – 마이바티스 3 | 소개

마이바티스는 무엇인가? 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와

mybatis.org

Releases · mybatis/mybatis-3

 

Releases · mybatis/mybatis-3

MyBatis SQL mapper framework for Java. Contribute to mybatis/mybatis-3 development by creating an account on GitHub.

github.com

 

Mybatis 설정하기

  • batis 를 이클립스에 넣어서 라이브러리를 import 시킨 후 xml 과 properties 등을 이용해서 DB 와 mybatis 를 맵핑할 필요가 있다.
  • db.properties ⇒ DB 연결 정보
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger

 

테이블, 시퀸스 생성

SQL> create table myproduct(
  2  pno int primary key,
  3  pname varchar2(255),
  4  category varchar2(255),
  5  pdetail varchar2(255)
  6  );

테이블이 생성되었습니다.

SQL> create sequence myproduct_seq
  2  start with 1
  3  increment by 1
  4  nocycle
  5  nocache
  6  ;

 

xml 파일: DB 연결 설정 정보

  • xml 작성 시 아래 내용 - DTD - 를 꼭 넣어주자
  • 중간에 dataSource 의 type 에서는 데이터 풀링 여부를 넣는데 POOLED 를 사용하면 데이터 풀링 방식으로 DB 데이터를 끌어와서 사용함 → 오버헤드를 막음
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC 
"-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
 	<!-- db 속성 정보가 있는 파일의 경로 -->
	<properties resource="config/db.properties" />

	<!-- 환경 -->
	<environments default="dev">
		<environment id="dev">
			<!-- transactionManager 로 JDBC 를 사용함 -->
			<transactionManager type="JDBC" />
				<!-- connection POOL 을 이용해서 db 정보를 받아옴 -->
				<dataSource type="POOLED">

					<!--
						property 에는 DB 접속 정보 => 여기서 ${} 안에 있는 값은
						위에서 properties 에 있는 정보를 그대로 가져온다
					-->
					<property name="driver" value="${driver}"></property>
					<property name="url" value="${url}"></property>
					<property name="username" value="${username}"></property>
					<property name="password" value="${password}"></property>
					
				</dataSource>
		</environment>
	</environments>
	
	<!-- 
	Mappers 는 db 에 접근해서 사용할 모든 sql 을 미리 xml 에 등록해 놓고 
	문장의 별칭으로 호출해서 사용
	-->	
 <mappers>
 	<mapper resource="mapper/MybatisPraMapper.xml" />
 </mappers>
 </configuration>

DB 데이터 풀링이란?

  • 보통 DB 에서 정보를 가져오기 위해서는 특정한 ID/PASSWD 로 로그인 후 해당 계정 정보에 맞는 전용 처리 영역을 만들어 진 후 데이터가 처리된다 ⇒ 이때 전용 처리 영역에서 사용할 수 있는 권한과 정보가 따로 존재함 말 그대로 전용이기 때문에
  • 데이터 풀링이란 이러한 커넥션 정보를 한번만 사용하고 끊는게 아니라 커넥션 정보를 갖고 와서 추후 다시 DB 에 접속해서 데이터 처리를 할때 사용함으로써 DB 오버헤드를 줄이게 된다.

 

mapper 파일 : DB 날릴 sql 문을 모아놓은 xml

  • 역시나 내용 작성시 내용 DOCTYPE 추가가 필수
  • mapper 에서는 반드시!! 반드시!! namespace 의 값이 필수로 포함되어야 한다
    • 꼭!! 필수
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC 
"-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
 	<!-- db 속성 정보가 있는 파일의 경로 -->
	<properties resource="config/db.properties" />

	<!-- 환경 -->
	<environments default="dev">
		<environment id="dev">
			<!-- transactionManager 로 JDBC 를 사용함 -->
			<transactionManager type="JDBC" />
				<!-- connection POOL 을 이용해서 db 정보를 받아옴 -->
				<dataSource type="POOLED">

					<!--
						property 에는 DB 접속 정보 => 여기서 ${} 안에 있는 값은
						위에서 properties 에 있는 정보를 그대로 가져온다
					-->
					<property name="driver" value="${driver}"></property>
					<property name="url" value="${url}"></property>
					<property name="username" value="${username}"></property>
					<property name="password" value="${password}"></property>
					
				</dataSource>
		</environment>
	</environments>
	
	<!-- 
	Mappers 는 db 에 접근해서 사용할 모든 sql 을 미리 xml 에 등록해 놓고 
	문장의 별칭으로 호출해서 사용
	-->	
 <mappers>
 	<mapper resource="mapper/MybatisPraMapper.xml" />
 </mappers>
 </configuration>

 

practice 클래스 : Mybatis 로 데이터 가져오기

  • 전체적인 순서는 Reader 객체 생성 → SqlSessionFactoryBuilder 객체 생성 → SqlSessionFactoryBuilder 의 build 매서드에 reader 를 넣어서 SqlSessionFactory 객체 생성 → factory 의 openSession 매소드를 사용해서 sqlSession 객체 생성 이때 매개변수로는 boolean 타입이 들어감
  • SQL 사용 시 변수 처리는 #{변수명} 을 사용한다
  • 최종적으로 생성된 sqlSession 에는 select, delete, udpate 등 다양한 메소드가 존재한다.
    • selectList 메소드는 List 타입을 return 하고 매개변수로는 mapper xml 에 적어둔 id 값이 들어간다
    • selectOne 메소드는 object 타입을 return 한다.
    • insert, update 는 VO 전체를 전달하고, xml 에서는 이를 받아서 값을 넣어줌
package test;

import java.io.IOException;
import java.io.Reader;
import java.util.List;
import java.util.Scanner;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import vo.MyProductVO;

public class PracticeMain {
	public static void main(String[] args) {
		// 팩토리 패턴??
		Scanner scan = new Scanner(System.in);

		try {
			// 1. Mybatis 설정 xml 파일 읽기 - 레고 조립의 순서도 가져오기
			Reader reader = Resources.getResourceAsReader("config/MybatisPra.xml");
			
			// 2. 레고 조립을 위한 친구 모집 - SqlSessionFactoryBuilder
			SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
			
			// 3. 레고 조립 - SqlSessionFactory
			SqlSessionFactory factory = ssfb.build(reader);
		
			// 4. 레고 조립 완료!
			// - 팩토리에서 세션을 열때 true => autoCommit 를 의미
			// - Connection conn 가 ==> SqlSession sqlSession 라고 생각하면 됨
			SqlSession sqlSession = factory.openSession(true);
			
			System.out.println("SqlSession 확인 : "+sqlSession);
			
			// 5. 레고 조립 순서도 접기 - 일단 필요없다!
			reader.close();
			
			// sql 문장 사용하기
			// 1) SELECT ALL - 매개변수로 mapper 에서 매핑한 id 값
			// list 를 return
			List<MyProductVO> list = sqlSession.selectList("All");
			//System.out.println("list : "+list);
			for(MyProductVO pro : list) {
				System.out.println(pro.getPno()+" : "+pro.getPname()+" : "+pro.getCategory()+ " : "+pro.getPdetail());
			}
			
			// 2) select one
			// Object 를 return
			System.out.println("pno 로 조회하기 : ");
			MyProductVO selectOne = (MyProductVO)sqlSession.selectOne("selectOne", scan.nextInt());
			System.out.println(selectOne.getPno()+" : "+selectOne.getPname()+" : "+selectOne.getCategory()+" : "+selectOne.getPdetail());
		
			// 3) insert one : vo 객체 전체를 넘겨줌
			System.out.print("상품명 : ");
			String pname = scan.next();
			
			System.out.print("상품 카테고리 : ");
			String category = scan.next();
			
			System.out.print("상품 설명 : ");
			String pdetail = scan.next();
			
			MyProductVO insertOne = new MyProductVO(0, pname, category, pdetail);
			sqlSession.insert("insertOne", insertOne);
			
			// 4) update : 여기도 객체 전체를 넘겨줌
			System.out.print("갱신할 상품 번호 : ");
			int pno = scan.nextInt();
			System.out.print("상품명 : ");
			String pname2 = scan.next();
			
			System.out.print("상품 카테고리 : ");
			String category2 = scan.next();
			
			System.out.print("상품 설명 : ");
			String pdetail2 = scan.next();
			
			MyProductVO updateOne = new MyProductVO(pno, pname2, category2, pdetail2);
			
			sqlSession.update("updateOne", updateOne);
			
			
			// 5) delete : 여기는 하나의 값만 전달하면 됨 => 삭제니까!
			System.out.print("삭제할 상품 번호 : ");
			int pno2 = scan.nextInt();
			sqlSession.delete("deleteOne", pno2);
			
			
		
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

		
	}
}

SQL 구문 파리미터/변수 사용법 정리!

 

구문  파라미터 갯수/종류  변수 처리 - 변수명은 vo 안에 있는 변수와 동일하게 처리하는게 좋다
select resultType : 내가 사용할 VO // parameterType= 변수타입 #{변수명}
insert resultType : insert 될 VO #{변수명} ⇒ insert 는 VO 객체 전체를 전달받음 → 따라서 변수명은 vo 의 변수명과 동일해야함
update resultType : update 될 VO #{변수명} ⇒ update 는 VO 객체 전체를 전달받음 → 따라서 변수명은 vo 의 변수명과 동일해야함
delete parameterType= 변수타입 parameterType= 변수타입

Reference

[MyBatis] MyBatis란? 개념 및 데이터구조

 

[MyBatis] MyBatis란? 개념 및 데이터구조

MyBatis란? 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크로서 JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 S

khj93.tistory.com