[JSP] MyBatis

보람·2023년 3월 26일
0

JSP

목록 보기
13/17

MyBatis

(1) MyBatis란?

  • 개발 프레임워크
  • 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와줌

1) 사용원리

① JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화
② 일반 SQL쿼리, 저장 프로시저 및 고급 매핑을 지원
③ 모든 JDBC코드 및 매개변수의 중복작업을 제거

2) 장점

① 프로그램 코드와 SQL 분리 가능

  • 프로그램에 있는 SQL쿼리들을 모두 한 구성파일로 구성

② 수정의 편리함

  • 기존 JDBC방식과 달리 SQL문을 XML파일에 작성 -> 코드가 줄어듦
  • SQL문만 따로 관리 = 수정이 편리

③ 작업효율과 가독성 상승

  • DBCP를 사용하기 때문에 JDBC만 사용하는 것보다 더 좋음

(2) MyBatis 이용하기

1) 다운받아 압축풀기

MyBatis

2) build path 잡기

  • 압축을 푼 MyBatis 폴더 > mybatis-3.5.13.jar 복사
  • 다이나믹 프로젝트 폴더 > src > main > webapp > WEB-INF > lib에 붙여넣기
  • 마우스 우측클릭 > properties > build path 잡기

3) guide의 사용법 그대로 사용하기

  • 프레임워크 : 프레임워크 가이드라인 그대로 사용하면 됨
  • MyBatis 폴더 > pdf 파일 = 가이드라인 => 그대로 따라 사용하기

(3) MyBatis 적용하기

1) 패키지 생성 > config.xml 생성

  • pdf 파일 getting started로 시작
<?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>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="org/mybatis/example/BlogMapper.xml" />
	</mappers>
</configuration>
  • 변경하기
    • driver => oracle.jdbc.driver.OracleDriver
    • url => jdbc:oracle:thin:@localhost:1521:xe
    • username => jsp
    • password => jsp
    • mapper resource => "com/codingbox/sql/member.xml"

👀 확인

ctrl + shift + f : 자동 들여쓰기
ctrl + shift + c : 주석

2) 같은 패키지 내 SqlMapConfig.java 생성

  • config.xml 파일을 읽어들여 SqlSessionFactory 객체를 생성
    • SqlSessionFactory 객체 :
      • MyBatis의 핵심 객체
      • 데이터베이스와의 SqlSession을 생성하고 SQL문을 실행, 결과를 반환
      • 데이터베이스와의 세션 생성 : 데이터베이스와의 커넥션을 맺는 것
      • 세션을 통해 SQL 문장을 실행하고 결과를 처리할 수 있는 환경을 제공
public class SqlMapConfig {
	private static SqlSessionFactory factory;
	
	// 클래스 초기화 블럭 : 클래스가 처음 로딩될 때 한번만 수행
	static {
		try {
			//config.xml이 읽히지 않았을 때의 try~catch
			String resource = "./com/codingbox/mybatis/config.xml";
			// xml 파일 읽기
			Reader reader = Resources.getResourceAsReader(resource);
			// 주소를 읽어와서  MyBatis 프레임워크를 사용할 수 있는 SqlSessionFactory 객체를 얻음
			factory = new SqlSessionFactoryBuilder().build(reader);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static SqlSessionFactory getFactory() {
		return factory;
	}
	
}

(4) SQL 작성 및 사용

1) 패키지 내 .xml 파일 생성

  • 가이드라인 => 2.1.5 Exploring Mapped SQL Statements 참고
<?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="org.mybatis.example.BlogMapper">
	<select id="selectBlog" resultType="Blog">
		select * from Blog where id = #{id}
	</select>
</mapper>
  • 변경하기
    • mapper namespace => xml 파일 이름 ex. member.xml => Member
    • <select => select, insert, update, delete 사용 가능
    • id => sql 호출 시 사용되는 값 주로 sql 사용할 메소드 이름 ex. "join"
    • resultType => 리턴할 결과값. select문에만 적용
    • parameterType => 예시문에는 ❌ -> 추가, #{}에 전달할 내용의 파라미터 type

💡 예시

<?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="Member">
	<select id="checkId" parameterType="string" resultType="_int">
		SELECT
		count(*) FROM TBL_MEMBER tm WHERE USERID = #{userid}
	</select>
	<!-- 멤버빈 객체를 통으로 받아와서 파라미터 타입으로 -->
	<insert id="join" parameterType="com.codingbox.vo.MemberBean">
		INSERT INTO TBL_MEMBER VALUES
		(#{userid}, #{userpw}, #{username}, #{userphone},
		#{zipcode}, #{addr}, #{addrdetail}, #{addrdetc})
	</insert>

	<select id="login" parameterType="hashmap"
		resultType="com.codingbox.vo.MemberBean">
		SELECT * FROM TBL_MEMBER tm WHERE USERID = #{userid} AND
		USERPW = #{userpw}
	</select>

</mapper>

(2) 메서드에서 sql 호출

① config.xml랑 연결

  • 다른 패키지에서 새로운 xml 파일 만들기
  • 새로운 xml파일과 config.xml 파일 연결
public class MemberDao {
	// 전역변수로 SqlSessionFactory, SqlSession 선언
	SqlSessionFactory factory = SqlMapConfig.getFactory();
	SqlSession sqlSession;
	// 기본 생성자로 factory에서 세션 열어주기 = 커넥션 만들기
	public MemberDao() {
		sqlSession = factory.openSession(true);
	}
}    

② sql 호출 -> 클래스 내부에서 메소드 만들기

  • sqlSession.sql타입("namespace값.id값", 파라미터)
sqlSession.insert("namespace값.id값", 파라미터);
sqlSession.selectOne("namespace값.id값", 파라미터);
sqlSession.update("namespace값.id값", 파라미터);
sqlSession.delete("namespace값.id값", 파라미터);

💡 예시

package com.codingbox.dao;

import java.util.HashMap;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import com.codingbox.mybatis.SqlMapConfig;
import com.codingbox.vo.MemberBean;

public class MemberDao {
	SqlSessionFactory factory = SqlMapConfig.getFactory();
	SqlSession sqlSession;
	
	public MemberDao() {
		sqlSession = factory.openSession(true);
	}
	
	public boolean checkId(String userid) {
		System.out.println(userid);
		boolean result = false;
		
		int cnt = 0;

		cnt = sqlSession.selectOne("Member.checkId", userid);
		
		if( cnt == 1) {
				result = true;
		}
		
		System.out.println(cnt);
		return result;
	}
	
	public boolean join(MemberBean member) {
    
		boolean result = false;
		
		if(sqlSession.insert("Member.join", member)==1) {
			result = true;
		}
		
		return true;
	}
	
	public MemberBean login(String userid, String userpw){
		HashMap<String, String> dates = new HashMap<>();
		dates.put("userid", userid);
		dates.put("userpw", userpw);
		// 키값에 사용자가 입력했던 id와 pw가 각각 이름에 입력 (이름 - 내용)
		// if. arrayList로 하면 0에 id와 pw, 1에 id와 pw
		
		MemberBean member = sqlSession.selectOne("Member.login", dates);
		return member;
    }    
}

🙆‍♀️ 알아두기

- parameterType, resultType은 별칭 사용

  • 가이드에서 확인

- sql 타입별 리턴 결과

select : select문에 해당하는 결과
insert : 1 (다중 insert문도 마찬가지)
update : update된 행의 개수 반환 (없으면 0)
delete : delete된 행의 개수 반환 (없으면 0)

📖 참고하기

api 활용하기

① 사용할 api 검색

ex. 우편번호 api
다음 우편번호 api

② 코드 확인

💡 예시

<input type="text" id="sample6_postcode" placeholder="우편번호">

<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script>
	function sample6_execDaumPostcode() { 
    		... 메소드 블라블라 ...
    }        
</script>   

③ 알맞은 곳에 끼워넣기

💡 예시

1. join_view.jsp 파일에 붙여넣기 

<input type="text" id="sample6_postcode" placeholder="우편번호"> 

2. join_view.jsp 파일 => </body>후에 붙여넣기 

<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script src="user.js"></script>

3. user.js 파일에 붙여넣기 

	function sample6_execDaumPostcode() { 
    		... 메소드 블라블라 ...
    } 

     // js파일 이므로 script 제거 

👍 결과

profile
안녕하세요, 한보람입니다.

0개의 댓글