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
'WebServer > JSP&Servlet' 카테고리의 다른 글
[JSP&Servlet] 세션 관리 (Session) (0) | 2023.08.17 |
---|---|
[Servlet] 요청 위임 (0) | 2023.08.16 |
[Servlet] Filter API (0) | 2023.08.10 |
[Servlet] 서블릿 스코프 (Scope) (0) | 2023.08.10 |
[Servlet] Servlet 핵심 객체 - ServletConfig , ServletContext (0) | 2023.08.10 |