이 개념을 몰랐으면 아주 번거롭게 코드를 짰을거란 생각이...이래서 기초개념을 탄탄하게 다져야하는구나 싶다!
📌오늘의 키워드
🔔 MyBatis ( 과거 ibatis ⇒ 에러 메시지에 출력될 수 있음) jar ⇒ mybatis-3.5.13.jar & ojdbc6_g.jar ⇒ 이클립스 build path 필수!! xml(Configuration, Mapper - 이름 대소문자 구분함!!) java-xml 읽기 (import 주의! , 경로는 패키지나 이름에 따라 다를 수 있음) SqlSession 객체 (메서드 호출 / 값 반환) typeAlias(별칭 적용) [session].commit() 호출 또는 openSession(true) 설정 DAO Service 인터페이스
SqlSessionFactory 주요 메서드 .openSession() ⇒ SqlSession 반환 SqlSession 주요 메서드 .selectOne() .selectList() .insert() .update() .delete() .commit() .close()
✅ 이 부분을 분리하기 위해 클래스를 새로 만든다.
1️⃣클래스 생성
2️⃣ DeptServiceImple에 있는 부분을 잘라서 새로운 클래스에 붙여넣는다.
3️⃣ MySqlSessionFactory 클래스에서 session을 리턴해주는 작업이 필요한데 new 없이 메서드를 사용하기 위해 static으로 수정해준다.
💡 Static을 안쓴다면? 객체 생성을 해주고 써야 하는 번거로운 점이 생김
4️⃣ Static으로 변경해주었기 때문에 MySqlSessionFactory.getSession();으로 다 변경해준다.
✅ MySqlSessionFactory.java
package com.comfig;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MySqlSessionFactory {
static SqlSessionFactory sqlSessionFactory = null;
static {
String resource = "com/config/Configuration.xml";
InputStream inputStream=null; // 초기화
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
}// end static
// ServiceImpl에 SqlSession 반환하는 메서드
// 객체 생성하지않고 (new 없이) 메서드를 사용하기 위해 static으로 설정
public static SqlSession getSession() {
SqlSession session = sqlSessionFactory.openSession();
return session;
}
}
✅DeptServiceImpl.java
package com.service;
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.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.comfig.MySqlSessionFactory;
import com.dao.DeptDAO;
import com.dto.DeptDTO;
public class DeptServiceImpl implements DeptService {
@Override // 1. findAll
public List<DeptDTO> findAll() {
List<DeptDTO> list = null;
// SqlSession 얻기
SqlSession session = MySqlSessionFactory.getSession();
try {
///////////////////////////////
// DAO 연동
DeptDAO dao = new DeptDAO();
list = dao.findAll(session);
//////////////////////////////
}finally {
// close
session.close();
}
return list;
}
@Override // 2. findByDeptno
public DeptDTO findByDeptno(int deptno) {
DeptDTO dto = null;
SqlSession session = MySqlSessionFactory.getSession();
try {
//DAO 연동
DeptDAO dao = new DeptDAO();
dto = dao.findByDeptno(session, deptno);
}finally {
session.close();
}
return dto;
}
@Override // 3. insert
public int addDept(DeptDTO dto) {
int n = 0;
SqlSession session = MySqlSessionFactory.getSession();
try {
// DAO 연동
DeptDAO dao = new DeptDAO();
n = dao.addDept(session, dto);
session.commit(); // 명시적 commit
}finally {
session.close();
}
return n;
}
@Override // 4.update
public int updateDept(HashMap<String, Object> map) {
int n = 0;
SqlSession session = MySqlSessionFactory.getSession();
try {
//DAO 연동
DeptDAO dao = new DeptDAO();
n = dao.updateDept(session, map);
session.commit();
}finally {
session.close();
}
return n;
}
@Override
public int deleteDept(int deptno) {
int n = 0;
SqlSession session = MySqlSessionFactory.getSession();
try {
//DAO 연동
DeptDAO dao = new DeptDAO();
n = dao.deleteDept(session, deptno);
session.commit();
}finally {
session.close();
}
return n;
}
}