개발자공부 (2021.11~현재)/JSP
Mybatis를 이용하여 게시판 CRUD 기능 구현하기
purplecloud
2022. 4. 11. 16:14
JSP에서 게시판 구현시 DAO DTO 구조를 만들어서 DAO에 직접 sql문을 작성하여 구현하는 방법도 있지만,
Mybatis를 연결하여 sql만 모아서 관리하는 방법으로 일일이 sql을 여러번 쓰지 않고 활용도를 높일 수 있다.
사용한 서버는 tomcat, db는 mysql을 사용함
mysql이 이미 연결이 되어있다는 상황을 전제로 하단과 같이 mybatis config를 작성함
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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/aiclass"/> // mysql주소와 db이름, mysql에서 확인가능함
<property name="username" value="아이디"/>
<property name="password" value="비밀번호"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/koreait/db/board.xml"/> // 직접 sql문이 들어갈 파일명
</mappers>
</configuration>
mybatis 연결이 되었으면 다음과 같이 sql만 모아서 관리할 파일을 작성함
board.xml
<?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="Board">
<insert id="write" parameterType="map">
insert into test_board(b_userid, b_userpw, b_title, b_content) values (#{b_userid},#{b_userpw},#{b_title},#{b_content})
</insert>
<update id="hit" parameterType="map">
update test_board set b_hit=b_hit+1 where b_idx=#{b_idx}
</update>
<select id="view" parameterType="map" resultType="map">
select * from test_board where b_idx=#{b_idx}
</select>
<select id="edit_check" parameterType="map" resultType="map">
select * from test_board where b_idx=#{b_idx} and b_userid=#{b_userid} and b_userpw=#{b_userpw}
</select>
<update id="edit" parameterType="map">
update test_board set b_userid=#{b_userid}, b_userpw=#{b_userpw}, b_title=#{b_title}, b_content=#{b_content} where b_idx=#{b_idx}
</update>
<update id="del" parameterType="map">
delete from test_board where b_idx=#{b_idx}
</update>
</mapper>
데이터가 들어갈 자리에 #{}를 써서 넘기면 되고 (cf. DAO에서 PreparedStatement을 사용해서 바로 sql문을 입력할때는 데이터 들어갈 자리에 ? 를 사용함 --> sql="insert into test_board(b_userid, b_userpw, b_title, b_content, b_file) values (?,?,?,?,?)";)
이제 앞으로 사용할때 Board.write 형식으로 불러서 사용할 수 있음
예시 >
package com.koreait.board;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.koreait.db.DBconn;
import com.koreait.db.SqlMapConfig;
public class BoardDAO {
SqlSessionFactory ssf=SqlMapConfig.getSqlMapInstance();
SqlSession sqlsession;
public BoardDAO() {
sqlsession= ssf.openSession(true); // 설정시 자동 commit
System.out.println("mybatis 연결했습니다.");
}
public int write(BoardDTO board) {
HashMap<String, String> dataMap= new HashMap();
dataMap.put("b_userid", board.getB_userid());
dataMap.put("b_userpw", board.getB_userpw());
dataMap.put("b_title", board.getB_title());
dataMap.put("b_content", board.getB_content());
dataMap.put("b_hit", String.valueOf(board.getB_hit()));
return sqlsession.insert("Board.write",dataMap);
// HashMap 형태로 데이터를 저장해서 Board.write로 넘겨주는데,
// 이때 sqlsession.insert 는 pstmt.executeUpdate(); 와 같은 역할로 보면 됨
}
public int hit(BoardDTO board) {
HashMap<String, String> dataMap= new HashMap();
dataMap.put("b_idx", String.valueOf(board.getB_idx()));
return sqlsession.update("Board.hit",dataMap);
}
public BoardDTO view(BoardDTO board) {
HashMap<String, String> dataMap= new HashMap();
dataMap.put("b_idx", String.valueOf(board.getB_idx()));
dataMap= sqlsession.selectOne("Board.view", dataMap);
if(dataMap!=null) {
board.setB_userid(dataMap.get("b_userid"));
board.setB_userpw(dataMap.get("b_userpw"));
board.setB_title(dataMap.get("b_title"));
board.setB_content(dataMap.get("b_content"));
board.setB_hit(Integer.parseInt(String.valueOf(dataMap.get("b_hit"))));
board.setB_hit(Integer.parseInt(String.valueOf(dataMap.get("b_hit"))));
return board;
}
return null;
}
public int edit_check(BoardDTO board) {
HashMap<String, String> dataMap= new HashMap();
dataMap.put("b_idx", String.valueOf(board.getB_idx()));
dataMap.put("b_userid", String.valueOf(board.getB_userid()));
dataMap.put("b_userpw", String.valueOf(board.getB_userpw()));
dataMap= sqlsession.selectOne("Board.edit_check", dataMap);
if(dataMap!=null) {
return 1;
}
return 0;
}
public int edit(BoardDTO board) {
HashMap<String, String> dataMap= new HashMap();
dataMap.put("b_idx", String.valueOf(board.getB_idx()));
dataMap.put("b_userid", board.getB_userid());
dataMap.put("b_userpw", board.getB_userpw());
dataMap.put("b_title", board.getB_title());
dataMap.put("b_content", board.getB_content());
return sqlsession.update("Board.edit",dataMap);
}
public int del(BoardDTO board) {
HashMap<String, String> dataMap= new HashMap();
dataMap.put("b_idx", String.valueOf(board.getB_idx()));
return sqlsession.update("Board.del",dataMap);
}
}