5월 ~ 7월) 웹/mybatis
71 ~ 72Day) [mybatis] 1
첼로그
2023. 7. 18. 12:41
71Day
mybatis
java Resonurces> src/main/java)
log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p - %m%n"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="console"/>
</root>
</log4j:configuration>
mybatis-config .xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- mybatis 환경설정파일 : SqlSessionFactory 객체를 생성하기 위해 필요한 정보를 제공하는 파일 -->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- properties : property 엘리먼트를 등록하기 위한 상위 엘리먼트 -->
<!-- resource 속성 : Properties 파일의 경로를 속성값으로 설정 - 생략 가능 -->
<!-- => property 엘리먼트 대신 Properties 파일의 등록된 정보를 이용하여 이름으로 값을 제공받아 사용 -->
<properties resource="oracle_url.properties">
<!-- property : mybatis 환경설정파일에 필요한 값을 제공하기 위한 엘리먼트 -->
<!-- => 다른 엘리먼트에서 ${이름} 형식으로 property 엘리먼트로 제공되는 값을 사용 -->
<!-- => 다수의 엘리먼트에서 공통적으로 사용되는 값을 제공하기 위해 설정 - 유지보수의 효율성 증가 -->
<property name="oracleDriver" value="oracle.jdbc.driver.OracleDriver"/>
</properties>
<!-- settings : setting 엘리먼트를 등록하기 위한 상위 엘리먼트 -->
<settings>
<!-- setting : mybatis 실행시 필요한 정보를 제공하기 위한 엘리먼트 -->
<!-- => setting 엘리먼트를 사용하지 않아도 실행에 필요한 값은 기본값으로 제공받아 사용 -->
<!-- => mybatis 실행을 기본값을 제외한 값으로 제공받아 사용할 경우에만 setting 엘리먼트 설정 -->
<!-- callSettersOnNulls 기능을 [true]로 설정하면 UPDATE 명령 실행시 컬럼값을 [NULL]로
변경하는 기능을 허용 -->
<setting name="callSettersOnNulls" value="true"/>
</settings>
<!-- typeAliases : typeAlias 엘리먼트를 등록하기 위한 상위 엘리먼트 -->
<typeAliases>
<!-- typeAlias : XML 기반의 매퍼 파일에서 Java 자료형에 대신 사용할 수 있는 별칭
(AliasName)을 설정하기 위한 엘리먼트 -->
<!-- => mybatis 프레임워크는 내부적으로 Java 자료형에 대신 사용할 별칭 제공 -->
<!-- type 속성 : Java 자료형을 속성값으로 설정 -->
<!-- alias 속성 : Java 자료형 대신 사용될 별칭을 속성값으로 설정 -->
<typeAlias type="xyz.itwill.dto.Student" alias="Student"/>
<typeAlias type="xyz.itwill.dto.MyMember" alias="MyMember"/>
</typeAliases>
<!-- environments : environment 엘리먼트를 등록하기 위한 상위 엘리먼트 -->
<!-- default 속성 : environment 엘리먼트의 식별자(id 속성값)을 속성값으로 설정 -->
<!-- => mybatis 프레임워크가 기본적으로 사용하기 위한 DBMS 서버 지정 -->
<environments default="development">
<!-- environment : DBMS 서버 접속에 필요한 정보를 설정하기 위한 엘리먼트 -->
<!-- => Connection 객체를 생성하기 위한 정보를 제공 -->
<!-- id 속성 : environment 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 -->
<environment id="development">
<!-- transactionManager : 트렌젝션 관리자(커밋 또는 롤백 처리)를 설정하기 위한 엘리먼트 -->
<!-- type 속성 : [JDBC] 또는 [MANAGED] 중 하나를 속성값으로 설정 -->
<!-- => JDBC 속성값 : JDBC 기능을 사용하여 직접 트렌젝션 관리 - Connection 객체의 메소드 호출 -->
<!-- => MANAGED 속성값 : 트렌젝션 관리 프로그램을 사용하여 트렌젝션 관리 -->
<transactionManager type="JDBC"/>
<!-- dataSource : Connection 객체를 생성하기 위한 정보를 제공하는 엘리먼트 -->
<!-- type 속성 : [UNPOOLED], [POOLED], [JNDI] 중 하나를 속성값으로 설정 -->
<!-- => type 속성값에 따라 하위 엘리먼트 설정 변경 -->
<!-- => UNPOOLED 속성값 : Connection 객체를 미리 생성하지 않고 실행시 생성하여 제공 -->
<!-- => POOLED 속성값 : Connection 객체를 미리 생성하여 실행시 제공 - DBCP -->
<!-- => JNDI 속성값 : WAS 프로그램에 등록된 자원을 이용하여 Connection 객체를 실행시 제공 -->
<dataSource type="POOLED">
<!-- property : Connection 객체 생성에 필요한 값을 제공하는 엘리먼트 -->
<!-- name 속성 : Connection 객체 생성에 필요한 값이 저장될 이름을 속성값으로 설정 -->
<!-- value 속성 : Connection 객체 생성에 필요한 값을 속성값으로 설정 -->
<!-- <property name="driver" value="oracle.jdbc.driver.OracleDriver"/> -->
<property name="driver" value="${oracleDriver}"/>
<!-- <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/> -->
<property name="url" value="${local}"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<!-- mappers : mapper 엘리먼트를 등록하기 위한 상위 엘리먼트 -->
<mappers>
<!-- mapper : 매퍼 파일(Mapper File)을 매퍼(Mapper)로 등록하기 위한 엘리먼트 -->
<!-- 매퍼(Mapper) : SQL 명령에 필요한 값을 전달받아 SQL 명령을 등록하고 실행결과를
Java 객체(원시형)으로 매핑하기 위한 정보를 제공 -->
<!-- => mybatis 프레임워크에서는 XML 기반의 매퍼 파일과 Interface 기반의 매퍼 파일을
이용하여 매퍼 등록 가능 -->
<!-- => ibatis 프레임워크에서는 XML 기반의 매퍼 파일로만 매퍼 등록 가능 -->
<!-- resource 속성 : XML 기반의 매퍼 파일 경로를 속성값으로 설정 -->
<!-- => XML 기반의 매퍼 파일 경로는 파일 시스템 경로로 표현하여 작성 -->
<mapper resource="xyz/itwill/mapper/StudentMapper.xml"/>
<mapper resource="xyz/itwill/mapper/MyMemberXMLMapper.xml"/>
<!-- class 속성 : Interface 기반의 매퍼 파일의 경로를 속성값으로 설정 -->
<!-- => Interface 기반의 매퍼 파일의 경로는 Java 자료형(인터페이스)으로 표현하여 작성 -->
<mapper class="xyz.itwill.mapper.MyMemberInterfaceMapper"/>
</mappers>
</configuration>
7월 17일 (72Day)
~오전 ~
mybatis > Java Resources > src/main/java > xyz.itwill.mapper)
StudentMapper .xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- XML 기반의 매퍼 파일 : 엘리먼트를 사용하여 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 자료형을 설정하여 Java 객체로 매핑 처리 -->
<!--
<select id="selectStudentList" resultType="xyz.itwill.dto.Student">
select no, name, phone, address, birthday from student order by no
</select>
-->
<!-- resultType 속성값으로 Java 자료형 대신 별칭(AliasName) 사용 가능 -->
<!-- => Java 자료형을 쉽게 표현하기 위한 별칭 사용 - 유지보수의 효율성 증가 -->
<select id="selectStudentList" resultType="Student">
select * from student order by no
</select>
</mapper>
mybatis > Java Resources > src/main/java > xyz.itwill.dto)
Student .java
package xyz.itwill.dto;
// 이미만들어져있어서 따로 안만들어도 됨!!
/*
이름 널? 유형
-------- -------- -------------
NO NOT NULL NUMBER(4)
NAME VARCHAR2(50)
PHONE VARCHAR2(20)
ADDRESS VARCHAR2(100)
BIRTHDAY DATE
*/
//테이블의 컬럼명과 같은 이름으로 필드명을 작성하여 클래스 선언하는 것을 권장
// => mybatis 프레임워크의 SqlSession 객체는 검색행의 컬럼값을 같은 이름의 필드에 자동 매핑되어 저장
public class Student {
private int no;
private String name;
private String phone;
private String address;
private String birthday;
public Student() {
// TODO Auto-generated constructor stub
}
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;
}
}
mybatis > Java Resources > src/main/java > xyz.itwill.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;
public class StudentDAO {
private static StudentDAO _dao;
private StudentDAO() {
// TODO Auto-generated constructor stub
}
static {
_dao=new StudentDAO();
}
public static StudentDAO getDAO() {
return _dao;
}
//SqlSessionFactory 객체를 생성하여 반환하는 메소드
// => SqlSessionFactory 객체 : SqlSession 객체를 생성하여 제공하기 위한 객체
// => SqlSessionFactory 객체를 생성하기 위해 mybatis 환경설정파일(mybatis-config.xml) 필요
private SqlSessionFactory getSqlSessionFactory() {
//mybatis 환경설정파일을 패키지에 작성한 경우 파일 시스템 경로로 표현
//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) {//mybatis 환경설정파일이 없는 경우 예외 발생
throw new IllegalArgumentException(e);
}
//SqlSessionFactoryBuilder.build(InputStream inputStream) : 매개변수로 mybatis 환경
//설정파일의 입력스트림을 전달받아 SqlSessionFactory 객체를 생성하여 반환하는 메소드
return new SqlSessionFactoryBuilder().build(inputStream);
}
//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 List 객체로 반환하는 메소드
// => SqlSession 객체의 메소드를 호출하여 매퍼에 등록된 정보를 이용하여 SQL 명령을 전달하여
//실행하고 결과를 Java 객체로 반환받아 사용
public List<Student> selectStudentList() {
//SqlSessionFactory.openSession() : SqlSession 객체를 생성하여 반환하는 메소드
// => SqlSession 객체 : 매퍼에 등록된 정보를 이용하여 SQL 명령을 제공받아 실행하고
//실행결과를 Java 객체로 매핑 처리하여 반환하는 기능을 제공하는 객체
SqlSession sqlSession=getSqlSessionFactory().openSession();
try {
//SqlSession.selectList(String elementId) : 매퍼에 등록된 SELECT 명령을 제공받아
//DBMS 서버에 전달하여 실행하고 실행결과를 List 객체로 반환하는 메소드
// => elementId 매개변수에는 매퍼 식별자(mapper 엘리먼트의 namespace 속성값)와
//select 엘리먼트의 식별자(id 속성값)을 이용한 문자열을 전달받아 매퍼에 등록된 SQL
//명령을 DBMS 서버에 전달하여 실행하고 실행결과를 Java 객체로 매핑 처리하여 반환
return sqlSession.selectList("xyz.itwill.mapper.StudentMapper.selectStudentList");
} finally {
//SqlSession.close() : SqlSession 객체가 사용한 JDBC 관련 객체를 제거하는 메소드
sqlSession.close();
}
}
}
mybatis > src > main > webapp )
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>
mybatis > Java Resources > src/main/java )
oracle_url.properties (그냥 파일로 생성임)
#name = value
local = jdbc:oracle:thin:@localhost:1521:xe
server = jdbc:oracle:thin:@www.itwill.xyz:1521:xe