JSP day 7 ← MyBatis 여기 있음

유요한·2022년 11월 23일
1

JSP

목록 보기
9/14
post-thumbnail

MyBatis

● 모델 DB의 매개체 역할의 프레임워크	- ORM(Object Relational Mapping)
  
  	Java 소스코드 안에 SQL문을 작성하면 코드가 길어지고 섞여 있어서 유지보수
  	및 분업이 쉽지 않아진다. MyBatis는 기존 JDBC 방식과는 달리
  	SQL문을 XML 파일에 작성함으로써 코드가 줄어들고 SQL문 수정이 편해진다.
  	또한 DBCP를 사용하여 커넥션을 여러개 생성하기 때문에 JDBC만 사용하는 것보다 
  	작업 효율과 가독성이 좋아진다.
  
      
  	iBatis(jdk 1.4 이상부터 지원) → MyBatis(jdk 1.5 이상부터 지원)
  	iBatis와 MyBatis의 차이점은 몇 개의 문법 및 사용용어(명칭,단어) 변경 등이다.
  

MyBatis의 설치
https://blog.mybatis.org

products

MyBatis3 Download 클릭

3.5.9버전 다운로드

mybatis 설명서 번역된 곳
https://mybatis.org/mybatis-3/ko/getting-started.html

MyBatis 작동원리

1. SqlSessionFactoryBuilder는 SqlSessionFactory를 생성하기 위한
   MyBatis 구성파일을 읽는다. 
2. 클라이언트(개발자)가 응용 프로그램에 대한 프로세스를 요청한다.
3. Application은 SqlSessionFactoryBuilder를 사용하여 빌드된(build)
   SqlSessionFactory 에서 SqlSession을 가져온다.(openSession)
4. Application이 SqlSession에서 Mapper 인터페이스 구현 개체를 가져온다.
5. Application이 Mapper 인터페이스의 메소드를 호출한다.
6. Mapper 인터페이스의 구현 객체가 SqlSession 메소드를 호출하고 SQL문 실행을 요청한다.
7. SqlSession은 Mapping 파일에서 실행할 SQL문을 가져와서 실행한다.

 java Resources 안에 src에 com.koreait.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>
  <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/jsp"/>
        <property name="username" value="root"/>
        <property name="password" value="1234"/>
      </dataSource>
    </environment>
  </environments>
  
</configuration>
●  SqlMapConfig.java 생성
	package com.koreait.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;
	
	// 클래스 초기화 블럭, static 블럭(클래스가 처음 로딩될 때 한번만 수행)
	static {
		// 현재폴더는 src다.
		String resource = "./com/koreait/mybatis/config.xml";
		try {
			Reader reader = Resources.getResourceAsReader(resource);
			factory = new SqlSessionFactoryBuilder().build(reader);
			
		} catch (IOException ioe) {
			System.out.println("초기화 문제 발생 : " + ioe);
		}
	}
	
	public static SqlSessionFactory getFactory() {
		
		return factory;
	}
}
● FactoryTest.java 생성
	package com.koreait.mybatis;

public class FactoryTest {
	public static void main(String[] args) {
		System.out.println(SqlMapConfig.getFactory());
	}
}

→ 이렇게 뜨면 제대로 연결된 것이다.

● mapper 위치를 알려주기 위해서 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/jsp"/>
        <property name="username" value="root"/>
        <property name="password" value="1234"/>
      </dataSource>
    </environment>
  </environments>
  
  <mappers >
  		<!-- resource를 통해서 mapper 위치를 알려주는 것이다. -->
  		<!-- "com/koreait/mapper/user.xml" : /는 폴더를 가르킨다.  -->
  		<mapper resource ="com/koreait/mapper/user.xml"/>
  </mappers>
</configuration>
●  UserDTO
	package com.koreait.dto;

public class UserDTO {
	private String  userid;
	private String userpw;
	private String username;
	private String usergender;
	private String zipcode;
	private String addr;
	private String addrdetail;
	private String addretc;
	private String[] userhobby;
	
	
	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}
	public String getUserpw() {
		return userpw;
	}
	public void setUserpw(String userpw) {
		this.userpw = userpw;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getUsergender() {
		return usergender;
	}
	public void setUsergender(String usergender) {
		this.usergender = usergender;
	}
	public String getZipcode() {
		return zipcode;
	}
	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public String getAddrdetail() {
		return addrdetail;
	}
	public void setAddrdetail(String addrdetail) {
		this.addrdetail = addrdetail;
	}
	public String getAddretc() {
		return addretc;
	}
	public void setAddretc(String addretc) {
		this.addretc = addretc;
	}
	public String[] getUserhobby() {
		return userhobby;
	}
	public void setUserhobby(String[] userhobby) {
		this.userhobby = userhobby;
	}
	public String getHobbystr() {
//		MyBatis				실제로 찾는것
//		#{userid}			getUserid()
// 		#{hobbystr}			getHobbystr()		
		
		String hobbyStr = userhobby[0];
		for (int i = 0; i < userhobby.length; i++) {
			hobbyStr += ","+userhobby[i];
		}
		return hobbyStr;
	}
	
}
● UserDAO
	package com.koreait.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;

import com.koreait.dto.UserDTO;
import com.koreait.mybatis.SqlMapConfig;

public class UserDAO {
	SqlSession sqlsession;
	
	public UserDAO() {
		sqlsession = SqlMapConfig.getFactory().openSession(true);	// true로 설정시 오토커밋
	}
	
	public boolean join(UserDTO newUser) {
		return sqlsession.insert("User.join",newUser) == 1;
	}
	public boolean checkId(String userid) {
		// 이게(userid) 0개면 성공
		int result = sqlsession.selectOne("User.checkId",userid);
		return result == 0;
	}
	public boolean login(String userid,String userpw) {
		// 관련이 없는 DTO로 묶일 수 없는 여러개의 값을 보낼 때는 HashMap을 사용한다.
		HashMap<String, String> datas = new HashMap<>();
		datas.put("userid", userid);
		datas.put("userpw", userpw);
		
		// 한개만 검색하니까 selectOne
		int result = sqlsession.selectOne("User.login",datas);
		// 행의 갯수를 돌려주기 때문에 int result안에 담아두고
		// 담아둔게 1이면 성공
		return result == 1;
	}
}
● Java Resource → src → com.koreait.mapper
● user.xml 생성

	→ user 쿼리문을 담아주는 곳
    
<?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은 User라는 공간이고 그 안에는 checkId라는 쿼리문이 있는 것이다.  -->
  <mapper namespace="User">
  	<!--"com.koreait.UserDTO" : .으로 이야기할 때는 페키지  -->
  	<insert id = "join" parameterType="com.koreait.UserDTO">
  		insert into test_user values(#{userid},#{userpw},#{username},#{usergender},
  		#{zipcode},#{addr},#{addrdetail},#{addretc},#{hobbystr})
  	</insert>
  
  	<!-- 파마미터타입으로 문자열으로 날라오고 resultType은 검색결과가 int로 나온다.
  		 기본형 앞에는 _를 붙인다.
  		 checkId는 문자열을 받고 인트형으로 결과값을 돌려주는  쿼리문이다. -->
  	<select id="checkId" parameterType="string" resultType="_int">
  		select count(*) from test_user where userid = #{userid}
  	</select>
  	<select id="login" parameterType="hashmap" resultType="_int">
  		select count(*) from test_user where userid= #{userid} and userpw= #{userpw}
  	</select>
  </mapper>

profile
발전하기 위한 공부

0개의 댓글