WebServer/JSP&Servlet

[Servlet] 서블릿과 DB 연동 (MyBatis 활용)

gangintheremark 2023. 8. 15. 19:44
728x90

※ 구현순서

아래 게시글 참고

 

[MyBatis] MyBatis 실행 순서 정리 ✍️ - SELECT 문

MyBatis는 자바 언어를 기반으로 데이터베이스 프로그래밍을 쉽게 할 수 있게 도와주는 SQL Mapper 프레임 워크로 데이터베이스와 자바 객체들 간의 상호 매핑을 단순화하고 SQL 쿼리를 실행하는데

gangintheremark.tistory.com

 

1. 벤더에서 제공해준 클래스파일(드라이버)MyBatis 기능을 가진 jar 파일을 WEB_INF/lib 에 복사

 

2. XML 파일 작성 (Configration.xml, Mapper.xml)

 

Configuration.xml: Mapper 설정정보 저장

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
    <configuration>
    <!--  DB와 연동하기 위한 4가지 정보를 저장한 jdbc.properties 파일 연결  -->
    <properties resource="com/config/jdbc.properties"></properties>

    <!--  패키지경로를 포함하여 작성하는 것을 간결하게 하기위한 별칭 지정  -->
    <typeAliases>
      <typeAlias alias = "DeptDTO" type = "com.dto.DeptDTO"/>
    </typeAliases>

    <environments default="development">
    <environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">

    <!--  DB와 연동하기 위한 4가지 정보를 해당 ${ }안에 저장 -->
    <property name="driver" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    </dataSource>
    </environment>
    </environments>

    <!-- SQL 쿼리를 저장한 xml을 resource에 매핑 -->
    <mappers>
    <mapper resource="com/config/DeptMapper.xml"/>
    </mappers>
    </configuration>

Mapper.xml: SQL 쿼리 저장

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="DeptMapper">
    <select id="findAll" resultType="DeptDTO">
        select deptno, dname, loc
        from dept
        order by deptno
    </select>
    <select id="findByDeptno" parameterType="int" resultType="DeptDTO">
    select deptno, dname, loc
    from dept
    where deptno = #{deptno}
    </select>
    <insert id="addDept" parameterType="DeptDTO">
        insert into dept(deptno, dname, loc) values (#{deptno}, #{dname}, #{loc})
    </insert>
    <update id="updateDept" parameterType="hashmap">
        update dept set dname = #{dname}, loc = #{loc} where deptno = #{deptno}
    </update>
    <delete id="deleteDept" parameterType="int">
        delete from dept where deptno = #{deptno}
    </delete>
</mapper>

 

3. DTO 작성

 

4. DAO 작성

package com.dao;

import java.util.HashMap;  
import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.dto.DeptDTO;

public class DeptDAO {  
public List findAll(SqlSession session) {  
List list = session.selectList("DeptMapper.findAll");  
return list;  
}

public DeptDTO findByDeptno(SqlSession session, int deptno) {
    DeptDTO dto = session.selectOne("DeptMapper.findByDeptno", deptno);
    return dto;
}

public int addDept(SqlSession session, DeptDTO dto) {
    int n = session.insert("DeptMapper.addDept", dto);
    return n;
}

public int updateDept(SqlSession session, HashMap<String, Object> map) {
    int n = session.update("DeptMapper.updateDept", map);
    return n;
}

public int deleteDept(SqlSession session, int deptno) {
    int n = session.delete("DeptMapper.deleteDept",deptno);
    return n;
}

5. service 클래스 작성

DeptService 인터페이스에 추상클래스를 작성하고 DeptServiceImpl()에서 구현하는 구조이다. service클래스에서는 Configuration.xml을 연결하고 SqlSession를 얻는다.

 

DeptService.java

package com.service;

import java.util.HashMap;  
import java.util.List;

import com.dto.DeptDTO;

public interface DeptService {  
public List findAll();  
public DeptDTO findByDeptno(int deptno);  
public int addDept(DeptDTO dto);  
public int updateDept(HashMap<String, Object> map);  
public int deleteDept(int deptno);  
}

 

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.config.MySqlSessionFactory;  
import com.dao.DeptDAO;  
import com.dto.DeptDTO;

public class DeptServiceImpl implements DeptService {

@Override
public List<DeptDTO> findAll() {
    SqlSession session = MySqlSessionFactory.getSession();
    List<DeptDTO> list = null;
    try {
        DeptDAO dao = new DeptDAO();
        list = dao.findAll(session);
    } finally {
        session.close();        
    }
    return list;
}

@Override
public DeptDTO findByDeptno(int deptno) {
    SqlSession session = MySqlSessionFactory.getSession();
    DeptDTO dto = null;
    try {
        DeptDAO dao = new DeptDAO();
        dto = dao.findByDeptno(session, deptno);
    } finally {
        session.close();        
    }
    return dto;
}

@Override
public int addDept(DeptDTO dto) {
    SqlSession session = MySqlSessionFactory.getSession();
            int n = 0;
            try {
                DeptDAO dao = new DeptDAO();
                n = dao.addDept(session, dto);
                session.commit();
            } finally {
                session.close();        
            }
    return n;
}

@Override
public int updateDept(HashMap<String, Object> map) {
    // MySqlSessionFactory를 이용하여 SqlSession 인스턴스를 생성하는 클래스를 따로 생성 
    SqlSession session = MySqlSessionFactory.getSession();  
    int n = 0;
    try {
        DeptDAO dao = new DeptDAO();
        n = dao.updateDept(session, map);
        session.commit();
    } finally {
        session.close();        
    }
    return n;
}

@Override
public int deleteDept(int deptno) {
    SqlSession session = MySqlSessionFactory.getSession();
    int n = 0;
    try {
        DeptDAO dao = new DeptDAO();
        n = dao.deleteDept(session, deptno);
        session.commit();
    } finally {
        session.close();        
    }
    return n;
}
}

 

MySqlSessionFactory.java

package com.config;

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);
}


// ServiceImpl에 SqlSession 을 반환하는 메서드
// new 없이 사용하기 위해서 static으로 지정한다.
public static SqlSession getSession() {
    SqlSession session = 
            sqlSessionFactory.openSession();
    return session;
}

6. 서블릿 작성

select구문 예시 중 목록 전체를 보여주는 servlet 

package com.servlet;

import java.io.IOException;  
import java.io.PrintWriter;  
import java.util.List;

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 com.dto.DeptDTO;  
import com.service.DeptService;  
import com.service.DeptServiceImpl;

/* 목록을 보여주는 servlet */  
@WebServlet("/list")  
public class DeptListServlet extends HttpServlet {


protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    DeptService service = new DeptServiceImpl(); // 서비스 연결

    // 전체목록 조회 findAll
    List<DeptDTO> list = service.findAll();

    // 응답처리
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    out.print("<html><head>");
    out.print("<meta charset=\"UTF-8\">");
    out.print("<title>Insert title here</title>");
    out.print("</head>");
    out.print("<body>");
    out.print("<h1>Dept 목록</h1>");
    out.print("<table border ='1'>");
    out.print("<tr>");
    out.print("<th>부서번호</th>");
    out.print("<th>부서명</th>");
    out.print("<th>부서위치</th>");
    out.print("</tr>");

    for (DeptDTO dto : list) {
        out.print("<tr>");
        // http://localhost:8090/03_Servlet/retrieve?deptno=값
        out.print("<td><a href='retrieve?deptno=" + dto.getDeptno() + "'>" + dto.getDeptno() + "</a></td>");
        out.print("<td>" + dto.getDname() + "</td>");
        out.print("<td>" + dto.getLoc() + "</td>");
        out.print("</tr>");
    }
    out.print("</table>");

    out.print("<a href='DeptForm.jsp'>부서등록</a>"); 
    out.print("</body></html>");
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    doGet(request, response);
}

실행결과

 

총 정리

1.  2개의 jar 파일을 WEB_INF/lib 에 복사 (build-path)
2.  xml파일 작성 (Configuration.xml, Mapper.xml) + 외부파일 저장(jdbc.properties)
3.  DTO 작성
4.  DAO 작성 
5.  Service 작성 (Service.java, ServiceImpl.java, MySqlSessionFactory.java)
6.  Servlet&JSP 작성 
    -  select : Service 클래스 연동&실행 - 응답처리

    -  insert/update/delete : 쿼리스트링 가져오기(getParameter) - DTO 인스턴스 생성
                                                      - Service 클래스 연동&실행 - 응답처리(if n=1 성공, else 실패)

 

 

728x90