
SqlSession을 이용해서 MyBatis 이용
MyBatis에서 자주 쓰는 음료수 : SqlSession
SqlSessionFactory : SqlSession을 찍어내는 공장
SqlSessionFactoryBuilder : 공장을 건축하는 빌더
Reader : 설계도를 분석하고 읽어주는 것
config.xml : 설계도
src > mybatis 패키지 생성
설계도 만들기 : 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>
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에 있던 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 : 넘겨줘야되는 파라미터 값
}
}

위에 만들었던 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>
<%@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");
}
%>