Backend
home

2024. 8. 9

news 실습 - mybatis 활용

핵심 코드 정리

mybatis-config.xml
<?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> <!-- jdbc.properties 등록 --> <properties resource="com/news/config/jdbc.properties"></properties> <!-- DTO 별명 달아주기 --> <typeAliases> <typeAlias type="com.news.model.NewsDTO" alias="News" /> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <!-- jdbc.properties에 등록된 값을 참조해서 사용 --> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.userId}"/> <property name="password" value="${jdbc.userPw}"/> </dataSource> </environment> </environments> <!-- 매퍼(Mapper) 파일 등록 --> <mappers> <mapper resource="com/news/mapper/NewsMapper.xml" /> </mappers> </configuration>
XML
복사
NewsMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="development"> <select id="selectNewsAll" resultType="News"> SELECT * FROM news </select> <insert id="insertNews" parameterType="News"> INSERT INTO news (title, content, img) VALUES (#{title}, #{content}, #{img}) </insert> <delete id="deleteNews" parameterType="int"> DELETE FROM news WHERE id = #{id} </delete> <select id="selectNews" parameterType="int" resultType="News"> SELECT * FROM news WHERE id = #{id} </select> <update id="updateNews" parameterType="News"> UPDATE news SET title = #{title}, content = #{content}, img = #{img}, date = NOW() WHERE id = #{id} </update> </mapper>
XML
복사
INewsService.java
package com.news.service; import com.news.dao.INewsDAO; import com.news.dao.NewsDAO; import com.news.model.NewsDTO; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Part; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.List; // 21. Service 생성 public class INewsService implements NewsService { // 26. newsDAO 생성 private NewsDAO newsDAO = new INewsDAO(); private String saveImg(HttpServletRequest req, String name) throws IOException, ServletException { // name에 해당하는 파일을 가져와서 헤더가 content-disposition에 해당하는 값 가져오고, 그 값에서 파일명(originImg)을 part에 저장한다. Part part = req.getPart(name); String header = part.getHeader("content-disposition"); int start = header.indexOf("filename="); String originImg = header.substring(start + 10, header.length()-1); // 파일명 (originImg)이 존재하는 경우에는 파일명을 현재 날짜(연월일시분초)로 변경하여 저장시킨다. if (originImg != null && !originImg.isEmpty()) { StringBuilder img = new StringBuilder(); Calendar cal = Calendar.getInstance(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmSS"); String time = dateFormat.format(cal.getTime()); img.append(time).append(originImg.substring(originImg.lastIndexOf("."))); originImg = img.toString(); part.write(originImg); } else { // 파일명이 존재하지 않을 경우 파일명을 "default.jpg"로 하여 DB에 저장한다. originImg = null; } // 파일명을 반환한다. return originImg; } @Override public List<NewsDTO> getAll() throws Exception { // 57. return newsDAO.getAllNewsList(); } @Override public void addNews(HttpServletRequest req) throws Exception { String title = req.getParameter("title"); String content = req.getParameter("content"); String img = saveImg(req, "img"); NewsDTO newsDTO = new NewsDTO(0, title, img, null, content); newsDAO.insertNews(newsDTO); } @Override public NewsDTO getNews(HttpServletRequest req) throws Exception { int id = Integer.parseInt(req.getParameter("id")); return newsDAO.getNewsById(id); } @Override public void removeNews(HttpServletRequest req) throws Exception { int id = Integer.parseInt(req.getParameter("id")); newsDAO.deleteNewsById(id); } @Override public void editNews(HttpServletRequest req) throws Exception { int id = Integer.parseInt(req.getParameter("id")); String title = req.getParameter("title"); String content = req.getParameter("content"); String img = saveImg(req, "img"); NewsDTO news = newsDAO.getNewsById(id); news.setTitle(title); news.setContent(content); if (img != null) { news.setImg(img); } newsDAO.updateNews(news); } }
Java
복사
INewsDAO.java
package com.news.dao; import com.news.config.SQLSessionFactory; import com.news.model.NewsDTO; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import java.util.List; // 33. INewsDAO 생성 public class INewsDAO implements NewsDAO { // 42. sqlsessionfactory의 getssf() 메소드 가져오기 - sql 세션 관리하는 Factory 객체 사용하기 위해 선언 private SqlSessionFactory ssf = SQLSessionFactory.getSsf(); @Override public List<NewsDTO> getAllNewsList() throws Exception { // 52. Sql 세션 오픈하기, openSession(true) 는 자동 커밋을 진행 // openSession() 또는 openSession(false)는 수동 커밋을 진행 - 직접 커밋 SqlSession sqlSession = ssf.openSession(true); // 53. newsList - selectNewsAll (mybatis 위한) List<NewsDTO> newsList = sqlSession.selectList("selectNewsAll"); // 54. 세션 닫기 sqlSession.close(); // 55. List 리턴값 반환 -> 56. List.jsp 만들기 return newsList; } @Override public void insertNews(NewsDTO news) throws Exception { SqlSession sqlSession = ssf.openSession(true); sqlSession.insert("insertNews", news); sqlSession.close(); } @Override public NewsDTO getNewsById(int id) throws Exception { SqlSession sqlSession = ssf.openSession(true); NewsDTO newsDTO = sqlSession.selectOne("selectNews", id); sqlSession.close(); return newsDTO; } @Override public void deleteNewsById(int id) throws Exception { SqlSession sqlSession = ssf.openSession(true);` sqlSession.delete("deleteNews", id); sqlSession.close(); } @Override public void updateNews(NewsDTO news) throws Exception { SqlSession sqlSession = ssf.openSession(true); sqlSession.update("updateNews", news); sqlSession.close(); } }
Java
복사