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.prop
erties (그냥 파일로 생성임)

 

oracle_url.properties
0.00MB

 

#name = value
local = jdbc:oracle:thin:@localhost:1521:xe
server = jdbc:oracle:thin:@www.itwill.xyz:1521:xe