[홈페이지만들기6] MyBatis(SqlSession) 이용하여 UserDAO의 쿼리문 분리하기

jngyoon·2023년 9월 6일
0

혼공일기

목록 보기
11/24

MyBatis 사용 목적 : SQL쿼리문과 JAVA 분리

SqlSession을 이용해서 MyBatis 이용

MyBatis에서 자주 쓰는 음료수 : SqlSession
SqlSessionFactory : SqlSession을 찍어내는 공장
SqlSessionFactoryBuilder : 공장을 건축하는 빌더
Reader : 설계도를 분석하고 읽어주는 것
config.xml : 설계도

<MyBatis 이용 순서>

  1. src > mybatis 패키지 생성

  2. 설계도 만들기 : mybatis 패키지 > config.xml
    1) XML에서 SqlSessionFactory 빌드하기 복붙
    : [https://mybatis.org/mybatis-3/ko/getting-started.html]
    2) 'driver', 'url', 'username', 'password' value 작성

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <typeAliases>  <!-- 별칭 설정 -->
  	<typeAlias type="dto.UserDTO" alias="userdto"/>
  	<typeAlias type="dto.BoardDTO" alias="boarddto"/>
  </typeAliases>
  <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/gb"/>
        <property name="username" value="root"/>
        <property name="password" value="1234"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <!-- mapper 위치 지정 -->
  	<mapper resource="mapper/UserMapper.xml"/>  
  	<mapper resource="mapper/BoardMapper.xml"/>
  </mappers>
</configuration>
  1. 설계도를 읽어주는 Reader 만들기
    : mybatis 패키지 > SqlMapConfig.java 클래스 생성 => SqlSessionFactory 만들어줌
package mybatis;

import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SqlMapConfig {
	private static SqlSessionFactory factory;		//factory 생성
	
	//클래스 초기화 블럭, static 블럭(클래스가 처음 로딩될 때 한번만 수행)
	static {
		try {
			String resource = "mybatis/config.xml";					//자원의 위치(설계도 위치)
			Reader reader = Resources.getResourceAsReader(resource);//설계도를 공학자에게 읽어주기
			factory = new SqlSessionFactoryBuilder().build(reader); //건축가(builder)와 공학자(reader)의 합심으로 factory 짓기
		} catch (IOException e) {
			System.out.println("초기화 문제 발생 : "+e);
		}
	}
	public static SqlSessionFactory getFactory() {
		return factory;		//factory 리턴
	}
}

쿼리문 분리하기

UserDAO.java

기존에 UserDAO에 있던 SQL쿼리문 삭제하고 sqlsession 객체 생성

package dao;

import java.util.HashMap;
import org.apache.ibatis.session.SqlSession;
import dto.UserDTO;
import mybatis.SqlMapConfig;

public class UserDAO {
	private SqlSession sqlsession;
	
	public UserDAO() {
		sqlsession = SqlMapConfig.getFactory().openSession(true);
	}
	
	public boolean join(UserDTO newUser) {
		return sqlsession.insert("User.join",newUser) == 1; //추가된 행의 개수가 1개인지 아닌지 리턴
	}
	
	public UserDTO login(String userid, String userpw) {
		HashMap<String, String> datas = new HashMap<>();
		datas.put("userid", userid);
		datas.put("userpw", userpw);
		return sqlsession.selectOne("User.login",datas); //행의 개수니까 한 개 => selectOne / 객체 하나만 넘겨줄 수 있으니까 userid와 userpw를 HashMap으로 datas에 put으로 넣어줌 / UserDTO : 데이터를 전송하기 위한 객체
        //작성 후 UserMapper.xml 가서 login select문 작성
        //UserDTO 타입으로 돌리면 login_db.jsp로 돌아감
	}
	
	public boolean checkId(String userid) {
		return (Integer)sqlsession.selectOne("User.checkId",userid) == 0;		//UserMapper.xml에 작성한 쿼리문을 실행하는 방법
        	//mapper namespace = "User" / select문 id = "checkId" => "User.checkId"
            //return 결과가 0이면 중복 없는 것 => true
            //userid : 넘겨줘야되는 파라미터 값
	}
}

mapper 패키지 생성 후 mapper.xml 생성

UserMapper.xml

위에 만들었던 config.xml의 2, 3, 4번 줄 복붙 후 'config' 부분 'mapper'로 변경

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="User"> <!-- namespace : mapper에 인식할 수 있는 name을 주는 것(id가 중복될 수 있으니)  -->
	<insert id="join" parameterType="userdto">	<!-- config.xml에 별칭 설정 (dto.UserDTO => userdto) -->
		insert into t_user values(#{userid},#{userpw},#{username})
	</insert>
	
  	<!-- checkId는 select문 사용, 파라미터는 문자열(string) -->
  	<!-- select 결과는 int타입 => resultType="_int"-->
	<select id="checkId" parameterType="string" resultType="_int">
		select count(*) from t_user where userid = #{userid}
	</select>
  
  	<!-- hashmap으로 넘겼으니 hashmap 타입 -->
	<select id="login" parameterType="hashmap" resultType="userdto">
		select * from t_user where userid=#{userid} and userpw=#{userpw}
	</select>
  	<!--#{}로 넘기는 것은 키 값 
		ex) datas.put("userid", userid);
  					   키 값	   변수명				-->
</mapper>

login_db.jsp

<%@page import="dto.UserDTO"%>
<%@page import="dao.UserDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	UserDAO udao = new UserDAO();
	String userid = request.getParameter("userid");
	String userpw = request.getParameter("userpw");
	
	UserDTO user = udao.login(userid, userpw); //UserDTO 타입으로 변경
	
	if(user != null){
		session.setAttribute("loginUser", userid);
		response.sendRedirect("main.jsp");
	}
	else{
		response.sendRedirect("login_fail.jsp");
	}

%>

0개의 댓글