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