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
복사