반응형
1) [DTO] Student.java
package xyz.itwill.dto;
/*
이름 널? 유형
-------- -------- -------------
NO NOT NULL NUMBER(4)
NAME VARCHAR2(50)
PHONE VARCHAR2(50)
ADDRESS VARCHAR2(100)
BIRTHDAY DATE
*/
//"테이블의 컬럼명"과 "같은 이름의 필드명"으로 클래스를 작성하는 것을 권장 - 컬럼명 = 필드명
// => [검색행의 컬럼값]은 [같은 이름의 필드에 자동으로 매핑]되어 저장
//=> 만약 규칙을 지키지않으면, Student객체가 만들어지지 않음!!!!
public class Student {
private int no;
private String name;
private String phone;
private String address;
private String birthday;
public Student() { }
public int getNo() {return no; }
public void setNo(int no) {this.no = no;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getPhone() {return phone;}
public void setPhone(String phone) {this.phone = phone;}
public String getAddress() {return address;}
public void setAddress(String address) {this.address = address;}
public String getBirthday() {return birthday;}
public void setBirthday(String birthday) {this.birthday = birthday;}
}
2) [Mapper] StudentMapper.xml
<!-- DOCTYPE 에서 제공해주는 루트 엘리먼트 : mapper -->
<!-- [mybatis-3-mapper.dtd] 파일에서 제공해주는 엘리먼트만 사용 가능 -->
<?xml version="1.0" encoding="UTF-8"?>
<!-- Mapper 파일 : SQL 명령을 등록하기 위한 파일 -->
<!-- => mybatis 환경설정 파일에서 mapper 엘리먼트를 사용하여 매퍼 파일로 등록해야만 사용 가능 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper : SQL 명령을 등록하기 위한 상위 엘리먼트 -->
<!-- namespace속성 : 매퍼를 구분하기 위한 식별자를 속성값으로 설정 -->
<!-- => SqlSession 객체가 원하는 매퍼의 SQL 명령을 제공받아 사용하기 위해 설정 -->
<!-- => mybatis 프레임워크에서는 namespace 속성값을 Java 자료형의 형식으로 표현하여 작성하는 것을 권장 -->
<!-- => ibatis 프레임워크에서는 namespace 속성 생략 가능 단점) 다 찾아야 하므로 속도 느림, 구분하기어려움-->
<mapper namespace="xyz.itwill.mapper.StudentMapper">
<!-- select : SELECT 명령을 등록하기 위한 엘리먼트 -->
<!-- id속성 : 매퍼에 등록된 SQL 명령을 구분하기 위한 식별자를 속성값으로 설정 : 메소드명과 동일한 효과 -->
<!-- resultType속성 : SQL 명령에 실행 결과를 객체로 매핑하여 제공하기 위한 Java 자료형을 속성값으로 설정 -->
<!-- => 주의) SELECT 명령으로 실행된 "하나의 검색행"에 대한 Java 자료형을 설정하여 매핑 처리 -->
<!-- 검색행을 Student객체로 만들어주세요! -->
<!--
<select id="selectStudentList" resultType="xyz.itwill.dto.Student">
select * from student order by no
</select>
-->
<!-- resultType속성값으로 Java 자료형 대신 mybatis 환경설정 파일의 typeAlias 엘리먼트로 설정된 별칭 사용 가능 -->
<!-- 컬럼명과 자바의 필드명이 같아야만 자동 매핑 처리 됨!!! -->
<select id="selectStudentList" resultType="Student">
select * from student order by no
</select>
</mapper>
3) [DAO] StudentDAO.java
package xyz.itwill.dao;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 xyz.itwill.dto.Student;
//JdbcDAO 상속받을 필요 없음
public class StudentDAO {
private static StudentDAO _dao;
private StudentDAO() {
// TODO Auto-generated constructor stub
}
static {
_dao = new StudentDAO();
}
public static StudentDAO getDAO() {
return _dao;
}
- SQLSession객체가 있어야 DAO클래스의 메소드 호출 가능
- 실제 명령을 이용해 작성해야하는 것을 SQLSession객체가 알아서 다 해줄 것임
//SqlSession 객체를 생성하여 반환하는 메소드
//=> SqlSession 객체를 생성하기 위해서는
//=> 반드시 mybatis 환경설정 파일(mybatis-config.xml) 필요
//SqlSessionFactory 객체 : SqlSession 객체를 생성하여 제공하기 위한 객체
private SqlSessionFactory getSqlSessionFactory() {
//mybatis 환경설정 파일이 특정 패키지에 작성된 경우 파일 시스템 경로로 표현
//=> 주의) 만약 패키지 안에 있다면 패키지를 [/]으로 표현
//자바가 아닌 XML파일이므로 [.]사용 불가능
//String resource = "xyz/itwill/config/mybatis-config.xml";
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
//mybatis 환경설정 파일을 읽기 위한 입력스트림을 반환받아 저장
//Resources.getResourceAsStream(String resource) :
//=> 서버에 저장된 mybatis 환경설정 파일의 경로를 제공받아
//파일 입력스트림을 생성하여 반환하는 메소드
inputStream=Resources.getResourceAsStream(resource);
}catch (IOException e) {
throw new IllegalArgumentException(e);
}
//SqlSessionFactoryBuilder.build(InputStream inputStream) :
//=> mybatis 환경설정 파일을 입력스트림을 이용하여 제공받아
//SqlSessionFactory 객체를 생성하여 반환하는 메소드
return new SqlSessionFactoryBuilder().build(inputStream);
}
- SqlSession 객체의 메소드만 잘 호출하면~
- SqlSession이 알아서 Connection객체도 가져오고,
- PreparedSatatement객체도 가져오고,
- resultSet객체 이용해 자바 객체로 만들어주고,
- List로 만들어 매핑처리도 해주고 그동안 DAO클래스의 메소드에 작성했던 모든 것을 이 객체가 다 해줌!!
//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 반환하는 메소드
// => SqlSession 객체의 메소드를 호출하여 메소드 작성
public List<Student> selectStudentList() {
//SqlSessionFactory.openSession() : SqlSession 객체를 생성하여 반환하는 메소드
//=> 💖SqlSession 객체 : 매퍼에 등록된 정보를 이용하여 SQL 명령을 전달하여 실행하고
//실행결과를 Java 객체로 반환하는 기능을 제공하는 객체
SqlSession sqlSession = getSqlSessionFactory().openSession();
try {
//SqlSession.selectList(String elementId) : 매퍼에 등록된 SELECT 명령을 제공받아
//전달하여 실행하고 처리 결과를 List 객체로 생성하여 반환하는 메소드
// => elementId 매개변수에는 매퍼의 식별자(namespace 속성값)와 select 엘리먼트의
//식별자(id 속성값)를 이용하여 매퍼에 등록된 SQL 명령을 구분하여 사용
return sqlSession.selectList("xyz.itwill.mapper.StudentMapper.selectStudentList");
} finally {
//SqlSession.close() : SqlSession 객체가 사용한 JDBC 관련 객체를 제거하는 메소드
sqlSession.close(); //반드시해줌(안하면 Connection이 계속 늘어남)
}
}
}
4) [JSP] student.jsp
<%@page import="xyz.itwill.dao.StudentDAO"%>
<%@page import="xyz.itwill.dto.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
List<Student> studentList = StudentDAO.getDAO().selectStudentList();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
<style type="text/css">
table{
border: 1px solid black;
border-collapse: collapse;
}
td{
border: 1px solid black;
text-align: center;
padding: 10px;
}
</style>
</head>
<body>
<h1>학생목록</h1>
<hr />
<table>
<tr>
<td>학번</td>
<td>이름</td>
<td>전화번호</td>
<td>주소</td>
<td>생년월일</td>
</tr>
<% for(Student student:studentList){ %>
<tr>
<td><%=student.getNo() %></td>
<td><%=student.getName() %></td>
<td><%=student.getPhone() %></td>
<td><%=student.getAddress()%></td>
<td><%=student.getBirthday().substring(0,10) %></td>
</tr>
<%} %>
</table>
</body>
</html>
🖤출력결과
🖤콘솔에 출력된 로깅정보
<!--log4j 이용해 로그 구현-->
DEBUG - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
DEBUG - PooledDataSource forcefully closed/removed all connections.
<!-- Connection객체 오픈-->
DEBUG - Opening JDBC Connection
<!-- Connection객체 생성-->
DEBUG - Created connection 1799110916.
<!-- autocommit기능 false로 세팅 (mybatis의 원래 기본값임) -->
DEBUG - Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@6b3c4104]
<!-- 명령 실행 -->
DEBUG - ==> Preparing: select * from student order by no
<!-- 매개변수는 없음 -->
DEBUG - ==> Parameters:
<!-- 5개의 행 제공받음 -->
DEBUG - <== Total: 5
<!-- Connection으로부터 autocommit 기능을 true로 만들어줌 -->
DEBUG - Resetting autocommit to true on JDBC Connection [oracle.jdbc.driver.T4CConnection@6b3c4104]
<!-- Connection 다 썼으니 닫음 -->
DEBUG - Closing JDBC Connection [oracle.jdbc.driver.T4CConnection@6b3c4104]
<!-- 빌렸던 Connection 돌려줌 -->
DEBUG - Returned connection 1799110916 to pool.
<!-- Connection 제거 -->
DEBUG - PooledDataSource forcefully closed/removed all connections.
반응형
'framework > mybatis' 카테고리의 다른 글
[mybatis] 6. XML + 인터페이스 기반의 매퍼파일 (MyMember 출력 프로그램) (1) | 2024.07.21 |
---|---|
[mybatis] 5. 인터페이스 기반의 매퍼파일 (MyMember 출력 프로그램) (1) | 2024.07.20 |
[mybatis] 4. XML기반의 매퍼파일 (MyMember 출력 프로그램) (0) | 2024.07.20 |
[mybatis] 2. MYBATIS 환경설정 (0) | 2024.07.19 |
[mybatis] 1. MYBATIS 개념 (0) | 2024.07.19 |