[JSP] :: MYBATIS

[JSP] :: MYBATIS

# SAWON.XML

select * from sawon select * from sawon where deptno = #{ deptno }

# MYBATISCONNECTOR.JAVA

package service; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisConnector { /* MABATIS DB에 접근하는 클래스로 MYBATIS 사용전에는 DBSERVICE라는 클래스로 대체했다. DB에 연결하기위해서는 MYBATISCONNECTOR가 어떤 DB로 접근하는지 경로를 잡아야한다. 여기 예제에서는 TEST_ORACLE이라는 DB에 접근할 것이므로 해당 경로를 참조하고있는 SQLMAPCONFIG를 찾아야한다. */ // SINGLE-TON PATTERN static MybatisConnector single = null; public static MybatisConnector getInstance() { if (single == null) single = new MybatisConnector(); return single; } // SQLSESSIONFACTORY를 생성하여 SQLMAPCONFIG.XML을 읽기위한 준비를 한다. SqlSessionFactory factory = null; // MYBATISCONNECTOR의 생성자 // (MYBATISCONNECTOR.GETINSTANCE으로 호출하는 생성자) public MybatisConnector() { /* 어떤 DB에 연결하는지, 어떤 MAPPER(DB를 사용할 수 있게해주는 참조 파일)를 사용할 것인지에대한 정보가 담겨있는 SQLMAPCONFIG.XML의 내용을 읽어와야한다. 이 내용을 읽어오는데 사용하는 클래스가 RESOURCEASREADER이다. RESOURCEASREADER (IBATIS.IO) 기본적으로 이미지나 XML파일등처럼 참조해서 가져와 사용할 수 있는 파일을 리소스(참조)파일이라고 한다. 해당 클래스는 이러한 참조파일을 읽어오는 역할을 하는데 CHAR타입의 데이터를 읽어오는 경우 사용하기 좋다. 서버에 연결하기위해서 SQLMAPCONFIG.XML를 읽는다. */ // XML이 없는 경우를 대비한 TRY-CATCH try { // READER 객체로 읽는다. Reader reader = Resources.getResourceAsReader("config/mybatis/sqlMapConfig.xml"); // READER객체에따라 SQLMAPCONFIG.XML의 내용을 텍스트 내용으로 가져온다. // 이 경우 읽어온 내용이 XML 파일이므로 해석이 있어야한다. // 읽어온 SQLMAPCONFIG.XML 처럼 여러 속성(태그)이 자식의 자식들로 모여있는 형태를 군집(FACTORY)이라고 하는데 이 군집 형태를 해석하기위해서 SQLSESSIONFACTORY의 BUILD메소드가 필요하다. // BUILD를 통해서 군집 (FACTORY)을 해석한다. factory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); } } // 군집을 해석한 결과를 DAO에 제공해야 DAO에서 맵퍼로 접근이 가능하므로 DAO에서 FACTORY를 받을 수 있는 GETFACTORY(GETTER) 메소드 생성 public SqlSessionFactory getFactory() { return factory; } }

# SAWONDAO.JAVA

package dao; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import service.MybatisConnector; import vo.SawonVO; public class SawonDAO { // SINGLE-TON PATTERN static SawonDAO single = null; public static SawonDAO getInstance() { if (single == null) single = new SawonDAO(); return single; } // SQLSESSION 객체를 생성하기위한 FACTROY // 맵퍼 (XML)를 읽기위해서 필요한 FACTORY가 DAO클래스에서 어떤식으로 접근할지 알기위해서 FACTORY객체 생성 SqlSessionFactory factory; // SAWON DAO 생성자로 바로 접근하도록 설정 public SawonDAO() { /* DAO.GETINSTANCE에서 바로 FACTORY의 정보를 받아올 수 있도록 생성자 안에서 FACTORY를 받는다. DAO 생성자 실행시, MYBATIS CONNECTOR의 GETINSTANCE를 SINGLETON으로 생성하면서 MYBATISCONNECTOR의 생성자가 호출이 된다. MYBATISCONNECTOR에서는 MYBATISCONNECTOR의 생성자가 호출이 되었으니 READER를 통해서 SQLMAPCONFIG.XML의 데이터를 읽고 SQLSESSIONFACTORYBUILDER를 통해서 구조를 해석한 뒤 그 정보를 DAO에게 GETFACTORY로 전달하게 된다. */ // FACTORY가 접속하려는 계정 ORACLE_TEST의 정보를 받은 상태 (접근 준비 완료) factory = MybatisConnector.getInstance().getFactory(); } // 사원 리스트 public List select(){ List list = null; /* SQLSESSION SQL처리 객체 (SQL쿼리 문장을 사용할 수 있게하는 객체) 맵퍼로 접근하는 권한을 가지고있는 FACTORY가 OPENSESSION이라는 메소드를 통해서 SQLSESSION에게 맵퍼 접근 권한을 부여한다. */ SqlSession sqlSession = factory.openSession(); /* SQLSESSION에는 CRUD, SELECTONE(한 정보만 검색)등의 쿼리문 동작을 수행하는 메소드가 존재한다. SQLSESSION의 메소드인 SELECTLIST를 통해서 LIST변수로 SQL문장의 결과값을 받도록 한다. */ /* NAMESPACE.SQL문장 ID SQLSESSION을 통해서 SQL쿼리문을 동작하게되면 SQLSESSION은 맵퍼의 XML파일중 SAWON이라는 식별자(NAMESPACE)를 가진 XML파일을 찾는다. 만약 XML파일 중에 NAMESPACE가 SAWON이 없다면 오류가 난다. SAWON이라는 XML을 찾은 뒤 그 안에 있는 SQL문장중 SAWON_LIST라는 명칭의 ID를 가진 SQL코드를 실행하게 된다. */ list = sqlSession.selectList("sawon.sawon_list"); // SQLSESSION 역시 DB작업이 완료되면 CLOSE로 종료해줘야한다. sqlSession.close(); // 메소드를 사용한 SERVLET으로 LIST결과를 리턴한다. return list; } // 부서 번호에따라서 사원 리스트 출력 (오버로딩) public List select(int deptno){ List list = null; SqlSession sqlSession = factory.openSession(); // 파라미터로 값을 넘기는 경우 (실행할 XML페이지, 넘기는 파라미터)로 값을 넘긴다고 명시해야한다. // 단, 단일로 보내는 값은 반드시 하나만 가능하다. (해결 방안으로는 MAP등에 여러 값을 넣어 전송하는 방식이 있다.) list = sqlSession.selectList("sawon.sawon_list_no", deptno); sqlSession.close(); return list; } }

# SAWONVO.JAVA package vo; // MYBATIS 사용시 변수명과 DB의 컬럼명이 무조건 같아야한다. // (SETTER, GETTER을 사용하지 않으므로) public class SawonVO { private int sabun, samgr, deptno, sapay; private String saname, sagen, sajob, sahire; public int getSapay() { return sapay; } public void setSapay(int sapay) { this.sapay = sapay; } public int getDeptno() { return deptno; } public void setDeptno(int deptno) { this.deptno = deptno; } public int getSabun() { return sabun; } public void setSabun(int sabun) { this.sabun = sabun; } public String getSaname() { return saname; } public void setSaname(String saname) { this.saname = saname; } public String getSagen() { return sagen; } public void setSagen(String sagen) { this.sagen = sagen; } public String getSajob() { return sajob; } public void setSajob(String sajob) { this.sajob = sajob; } public String getSahire() { return sahire; } public void setSahire(String sahire) { this.sahire = sahire; } public int getSamgr() { return samgr; } public void setSamgr(int samgr) { this.samgr = samgr; } } [참고] :: MYBATIS 사용시 VO의 멤버 변수값은 반드시 DB 컬럼의 값과 같아야한다. (GETTER, SETTER로 가져오는 방식이 아니므로)

# SAWONLISTACTION.JAVA

package action; import java.io.IOException; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dao.SawonDAO; import vo.SawonVO; /** * Servlet implementation class SawonListAction */ @WebServlet("/sawon/sawonlist.do") public class SawonListAction extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response) */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* 페이지에서 리스트의 부서명을 클릭하여 부서 번호를 파라미터로 받는 상황 첫 실행이나 부서를 클릭하지 않은 경우도 있을 수 있으니 그런 상황에는 전체 목록이 나오도록 DEPTNO는 0으로 기본값을 지정한다. */ int deptno = 0; // 첫 실행에서는 SAWONLIST.DO 형태로 파라미터가 없이 받게 될 것이다. // STR_DEPTNO의 STRING으로 받는 이유는 클래스 타입으로 받아서만 NULL 체크를 통해서 첫실행인지 아닌지를 파악할 수 있기 때문이다. String str_deptno = request.getParameter("deptno"); // 첫실행이거나 (SAWONLIST.DO의 형태) // 부서 번호를 받지 못한 (SAWONLIST.DO?STR_DEPTNO=의 형태) 상황이 아닌 경우 DEPTNO를 숫자값으로 받는다. if(str_deptno!=null && !str_deptno.isEmpty()) { deptno = Integer.parseInt(str_deptno); } // SELECT 메소드가 오버 로딩으로 두가지이므로 NULL로 먼저 선언만 한다. List list = null; if(deptno==0) { // DEPTNO가 0이라는 뜻은 첫실행이라는 뜻이므로 전체 사원 리스트 출력 list = SawonDAO.getInstance().select(); }else { // DEPTNO가 값이 있으니 해당 부서 번호의 부서를 출력 list = SawonDAO.getInstance().select(deptno); } // 정보가 담긴 LIST를 SAWON_LIST.JSP에 보낼 수 있도록 FORWARDING, BINDING 동작 request.setAttribute("list", list); RequestDispatcher disp = request.getRequestDispatcher("sawonlist.jsp"); disp.forward(request, response); } }

from http://hikr90.tistory.com/141 by ccl(A) rewrite - 2021-12-29 22:27:43