MyBatis는 자바 언어를 기반으로 데이터베이스 프로그래밍을 쉽게 할 수 있게 도와주는 SQL Mapper 프레임 워크로 데이터베이스와 자바 객체들 간의 상호 매핑을 단순화하고 SQL 쿼리를 실행하는데 도움을 주는 기능들을 제공한다.
JDBC와 다르게 프로그램에 있는 SQL쿼리들을 한 구성파일(.xml)에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 장점이 있다.
[JDBC] JDBC 실행 순서 정리 ✍️ - SELECT문 요청
JDBC(Java Database Connectivity) 는 어떤 환경에서건 자바 언어를 사용하는 경우에 DBMS 종류에 상관없이 데이터베이스에 접근할 수 있는 독립적인 프로그래밍 API이다. 다음은 JDBC를 구현하는 기본적인
gangintheremark.tistory.com
💡 실행환경: Oracle, Eclipse
1. Eclipse 에서 프로젝트 생성
DB와 연동할 자바 프로젝트 하나 생성 후 Build Path
> Configure Build Path
> Add External Jars
2. Oracle 드라이버를 현재 생성한 Eclipse 프로젝트와 연결
벤더에서 제공해준 클래스파일(드라이버) 과 MyBatis 기능을 가진 jar 파일이 필요하다.
- MyBatis jar 파일 다운로드 : https://github.com/mybatis/mybatis-3/releases
- 오라클 드라이버 위치 : C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
3. XML 파일 작성
src 폴더에 저장
- 설정 정보 저장 xml : 한 개 작성 💡
Configuration.xml
- SQL 쿼리 저장 xml : 테이블 당 하나씩 작성 💡 명명법 :
테이블명Mapper.xml
Configuration.xml : Mapper 설정 정보 저장
- Oracle DB를 연동하기 위한 4가지 정보를 해당 ${ } 안에 저장
- SQL 쿼리를 저장한 xml을 resource 에 매핑
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="@.xml"/>
</mappers>
</configuration>
Mapper XML
SqlSession을 호출하는 XML 기반의 매핑 구문이다. SqlSession은 데이터베이스에 대해 SQL 명령어를 실행하기 위해 필요한 모든 메서드를 가지고 있다. 한 개의 Mapper XML 파일에는 여러 개의 매핑 구문을 정의할 수 있다.
namespace
: 전체이름을 가진 구문을 구분하기 위해 필수로 사용id
: 자바 파일에서 호출될 id 값 설정resultType
: 하나의 행(레코드)를 저장할 곳parameterType
: 쿼리문에 파라미터#{ }
가 존재하면 파라미터 타입 설정
<?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="@">
<select id=" " resultType=" " parameterType=" ">
select구문
</select>
</mapper>
4. 자바파일에서 Configuration.xml 읽기
패키지를 생성해 작성했다면 경로 설정 주의! "com.config.Configuration.xml" 처럼 패키지 경로를 작성해야 함.
public static void main(String[] args) throws Exception {
String resource = "Configuration.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
5. SqlSession 얻기
SqlSessionFactory를 이용하여 SqlSession 인스턴스를 만들 수 있다.
SqlSession session = sqlSessionFactory.openSession();
6. Mapper 인터페이스의 메서드 호출
// 단일행 ( DTO 저장 )
session.selectOne("mapper id값");
session seletOne("mapper id값", Object obj); // 파라미터 있을 경우
// 복수행 ( 여러 DTO 저장하고 자동으로 List에 저장 )
session.selectList("mapper id값");
session.selectList("mapper id값", Object obj);
session.selectList("mapper id값", Object obj, Rowbounds bounds); // 일정 개수만큼 검색
7. SqlSession close
session.close()
💻 최종코드 - SELECT문 요청
Oracle 학습용 계정 SCOTT의 dept 테이블 이용
Configuration.xml
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="SCOTT"/>
<property name="password" value="TIGER"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="DeptMapper.xml"/>
</mappers>
</configuration>
DeptMapper.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="DeptMapper">
<select id="findAllPage" resultType="DeptDTO">
select deptno, dname, loc
from dept
order by deptno
</select>
<select id="findByDeptno" parameterType="int" resultType="DeptDTO">
select deptno, dname, loc
from dept
where deptno = #{deptno}
<!-- 파라미터가 존재하면 parameterType 설정 -->
</select>
<select id="findByDeptnoAndDname" parameterType="DeptDTO" resultType="DeptDTO">
select deptno, dname, loc
from dept
where deptno = #{deptno} or dname = #{dname}
<!-- 파라미터가 두 개 이상 존재하면 parameterType 하나에 저장해서 전달 -->
</select>
<select id="findByDeptnoAndDnameMap" parameterType="hashmap" resultType="DeptDTO">
select deptno, dname, loc
from dept
where deptno = #{deptno} or dname = #{dname}
<!-- 파라미터를 값을 hashmap 으로 지정 -->
<!-- #{키 값} -->
</select>
</mapper>
Main.java
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class DeptMain {
public static void main(String[] args) throws Exception {
// Configuration.xml 파일 읽기
String resource = "com/config/Configuration.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
// SqlSession 인스턴스 생성
SqlSession session = sqlSessionFactory.openSession();
// findByDeptno 호출
// session.selectOne("namespace명.id값", 파라미터값);
DeptDTO dto = session.selectOne("DeptMapper.findByDeptno", 10);
System.out.println(dto);
System.out.println("=================================");
// findAll 호출
// session.selectList("namespace명.id값");
List<DeptDTO> list = session.selectList("DeptMapper.findAllPage");
for(DeptDTO x : list) {
System.out.println(x);
}
System.out.println("=================================");
// findByDeptnoAndDname 호출
// session.selectList("namespace명.id값", 파라미터값);
DeptDTO dto2 = new DeptDTO();
dto2.setDeptno(10);
dto2.setDname("인사");
List<DeptDTO> list2 =
session.selectList("DeptMapper.findByDeptnoAndDname", dto2);
for(DeptDTO x : list2) {
System.out.println(x);
}
System.out.println("=================================");
// findByDeptnoAndDnameMap 호출
// session.selectList("namespace명.id값", HashMap 객체);
HashMap<String, Object> map = new HashMap<>();
map.put("deptno", 10);
map.put("dname", "인사");
List<DeptDTO> list3 = session.selectList("DeptMapper.findByDeptnoAndDnameMap",map);
for(DeptDTO x : list3) {
System.out.println(x);
}
System.out.println("=================================");
// session.selectList("namespace명.id값", 파라미터값, Rowbounds 객체);
RowBounds bounds = new RowBounds(0, 3);
List<DeptDTO> list4 = session.selectList("DeptMapper.findAllPage", null, bounds);
for(DeptDTO x : list4) {
System.out.println(x);
}
session.close();
}
}
'Framework & Library > MyBatis' 카테고리의 다른 글
[Oracle/MyBatis] 에러 모음 (0) | 2023.08.07 |
---|---|
[MyBatis] 동적 SQL (Dynamic SQL) 기능 - foreach문 (0) | 2023.08.07 |
[MyBatis] 동적 SQL (Dynamic SQL) 기능 - if, choose/when/otherwise (0) | 2023.08.07 |
[MyBatis] SQL Map XML 파일 (0) | 2023.08.07 |
[MyBatis] INSERT문/UPDATE문/DELETE문 요청 (0) | 2023.08.04 |