Spring, Mybatis

2-2. 0902_ MyBatis

55yudi 2021. 9. 2. 16:26

myspringmybatis 프로젝트 생성

 

 

 

- 실습하기(과제) : 

메서드 시그니처(Method Signature) 작성하기

- 사번을 전달받아서 그 사번에 해당하는 사원정보를 리턴한다.

- 급여를 전달받아서 그 급여를 받는 사원들의 목록을 리턴한다.

- 사원정보를 전달받아서 그 사원의 정보를 수정한다.
- 사번을 전달받아서 그 사원을 삭제한다.
- 이메일을 전달받아서 그 이메일을 사용하는 사원의 정보를 리턴한다.
- 부서번호를 전달받아서 그 부서원들의 정보를 리턴한다.

<EmpDAO2.java>

package myspringmybatis;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.List;

import org.springframework.stereotype.Component;

@Component
public class EmpDAO {
	// CRUD관련 메서드를 정의할 수 있어야 한다.
	
	// 입사년도를 전달받아서 그 년도에 입사한 직원의 목록(여러개니까 List로)을 리턴한다.
	// 메서드명, 매개변수, 리턴타입
	public List<EmpVO> getEmpListByHireYear(int year) throws Exception {
		return null;
	}
	
	// 직원의 정보(이름, 입사일자, 급여, 이메일 등)를 전달받아서 등록하고 결과를 리턴한다.
	// 메서드명, 매개변수(VO객체에 여러개를 싣어서 저장하면 됨), 리턴타입
	public int register(EmpVO vo) throws Exception {
		return 0;
	}
	
	// - 사번을 전달받아서 그 사번에 해당하는 사원정보를 리턴한다.
	public EmpVO getEmpById(int empId) throws Exception {
		return null;
	}
	
//	// - 급여를 전달받아서 그 급여를 받는 사원들의 목록을 리턴한다.
//	public List<EmpVO> getEmpListBySalary(int salary) throws Exception {
//		return null;
//	}
	
	// - 사원정보를 전달받아서 그 사원의 정보를 수정한다.
	public int updateEmp(EmpVO vo) throws Exception {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = DriverManager.getConnection(
				"jdbc:oracle:thin:@localhost:1521:xe","hr","hr");
							
		String sql = "update table employees set email = ? where employee_id = ?";
		PreparedStatement stmt = con.prepareStatement(sql);
		stmt.setString(1, vo.lastName);
		int result = stmt.executeUpdate();
		return result;
	}
	
	// - 사번을 전달받아서 그 사원을 삭제한다.
	public int deleteEmpById(int empId) throws Exception {
		//
		return 0;
	}
	
	
//	// - 이메일을 전달받아서 그 이메일을 사용하는 사원의 정보를 리턴한다.
//	public EmpVO getEmpByEmail(String email) throws Exception {
//		return null;
//	}
	
//	// - 부서번호를 전달받아서 그 부서원들의 정보를 리턴한다.
//	public List<EmpVO> getEmpListByDeptId(int deptId) throws Exception {
//		return null;
//	}
}

MyBatis

- <EmpDAO.java> -- MyBatis를 사용해서 오라클에 커넥션 한 것 등등의 아래코드를 축약할 것임

package myspringmybatis;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Component;

@Component
public class EmpDAO {

	   public List<EmpVO> getEmpListByDeptId(int deptId) throws Exception  {
	      
		  ArrayList<EmpVO> result = new ArrayList<EmpVO>();
	      Class.forName("oracle.jdbc.driver.OracleDriver");
	      Connection con = DriverManager.getConnection(
	            "jdbc:oracle:thin:@localhost:1521:xe","hr","hr");
	      String sql = "select * from employees where department_id = ?";
	      PreparedStatement stmt = con.prepareStatement(sql);
	      stmt.setInt(1, deptId);
	      ResultSet rs = stmt.executeQuery();
	      
	      while(rs.next()) {
	         //EmpVO객체를 만들고 객체변수에 데이터베이스의 데이터로 설정하고
	         EmpVO vo = new EmpVO();
	         vo.employeeId = rs.getInt("employee_id");
	         vo.lastName = rs.getString("last_name");
	         result.add(vo);
	         
	      }
	      
	      return result;
	   }
}

- <porm.xml>에 dependency 코드 추가 --> Spring을 사용할 준비 완료

 

DataSource 사용하기

- 데이터베이스에 대한 연결을 제공한다.

- Spring DataSource, DBCP DataSource, C3P0 DataSource, HiKariCP(가장 빠르고 안정적임) 등

 

- 그 중에 DBCP DataSource 를 사용할 것임

   * CP : Connection Pool

- 그 전에 Maven 먼저 해줘야 함

  <porm.xml>에 코드 추가

<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>

  그러면 commons-dbcp 관련 jar파일이 생성됨을 볼 수 있다.

 

- <context-spring-annotation.java>에 Apache dbcp 코드 추가

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
         <property name="driverClassName" value="${jdbc.driverClassName}" />
         <property name="url" value="${jdbc.url}" />
         <property name="username" value="${jdbc.username}" />
         <property name="password" value="${jdbc.password}" />
   </bean>

- property의 value값을 오라클 상황에 맞게 수정하기

  --> 전체코드

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
   <bean id="dataSource"
      class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
      <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
      <property name="username" value="hr" />
      <property name="password" value="hr" />
   </bean>
   <context:annotation-config></context:annotation-config> <!-- xml파일이 아니고 어노테이션으로 되어 있다고 인식 -->
   <!-- myspring이라는 패키지내부에 어노테이션으로 표기된 클래스를 스프링 빈으로 생성해서 가지고 있게된다. -->
   <!-- @component가 2개인 이유 -> @가 있는 클래스가 2개있기때문에 -->
   <context:component-scan
      base-package="myspringmybatis"></context:component-scan> <!-- 베이스패키지 설정 -->
</beans>