✅ Framework
- 종류
SQL Mapper
의 한 종류로 MyBatis
는 JDBC를 편리하게 사용할 수 있도록 도와주는 기술객체
로 편리하게 변환해준다단점
(1) : 개발자가 SQL을 직접 작성해야한다
SQL Mapper 대표기술
(1) MyBatis
, JdbcTemplate
(1) 워크 스페이스 새로 만들기
(2) 서버 다시 설정
(2) Preferences -> General -> Editors -> Text Editors -> Spelling 에서 UTF-8로 바꿔줌
(3) WorkSpace 에서도 UTF-8로 바꿔주기
(4) Web 에서도 css, jsp, html 부분 다 UTF-8로 변경
(5) lib에 [OJDBC와 MyBatis] 라이브러리 넣어줌
(6) MyBatis 라이브러리 설치방법
https://mybatis.org/mybatis-3/ -> 좌측메뉴 시작하기 -> jar파일다운 ->
(7) : mybatis-config 파일 설정 (프로젝트당 하나만 있으면 됨)
-> xml파일을 열때, 파일우클릭 -> open with -> XML Editor 로 하는것이 편함
<?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> <!-- configuration -> 루트태그임 -->
<!-- 연결할 DB에 대한 정보를 설정하는 태그
1개이상의 DB연결정보를 설정할 수 있다.
environment태그를 이용한다.
-->
<properties resource="driver.properties">
<!-- properties의 resource 속성으로 해당 프로펄티파일안의 값을 가져옴 -->
</properties>
<settings>
<setting name="jdbcTypeForNull" value="NULL"/>
<!-- null값 에러처리하는 방법(setting)에 적음 = 에러값이 없으면 오류 발생 -->
</settings>
<typeAliases>
<typeAlias type="com.employee.model.vo.Employee" alias="emp"/>
<!-- 해당 타입을 별명으로 지어서 mapper에서 편하게 사용 가능 -->
</typeAliases>
<environments default="mybatis"> <!-- 기본연결이 mybatis임 -->
<environment id="mybatis">
<transactionManager type="JDBC"/> <!-- 트렌젝션을 처리하는 방법설정 -->
<dataSource type="POOLED">
<!-- DB 연결에 필요한 정보를 등록하는 태그
1. 드라이버, 2.DB서버 주소, 3.사용계정 4.계정비밀번호
-->
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="mybatis"/>
<property name="password" value="mybatis"/>
</dataSource>
</environment>
</environments>
<!-- 실행할 sql문을 설정한 mapper를 등록 -->
<mappers>
<mapper resource="/mappers/student-mapper.xml"/>
</mappers>
</configuration>
(8) : SqlSession
객체 생성
package com.mybatis.common;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SessionTemplate {
// mybatis가 제공하는 SqlSession객체를 생성해주는 공용메소드를 선언 -> static
public static SqlSession getSession() { // service 에서 getSession으로 받을 수 있음
SqlSession session = null;
String file="mybatis-config.xml"; // 파일 명은 변경해도됨
try {
InputStream is=Resources.getResourceAsStream(file);
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory =builder.build(is);
session=factory.openSession(false);
}catch(IOException e) {
e.printStackTrace();
}
return session;
}
}
(9) : Dao
에서 사용하는 메소드
SqlSession
이 제공하는 메소드를 호출함selectOne()
selectList()
insert()
update()
delete()
public class StudentDao {
public int insertStudent(SqlSession session) {
// selectOne() -> (하나의 로우)
// selectList() -> (다수의 로우)
// sql문을 실행할 때 session이 제공하는 메소드를 호출하면됨
// selectOne(), selectList(), insert(), update(), delete()
// statement인수는 "mapper태그 namespace값.sql태그id값"
int result = session.insert("student.insertStudent");
return result;
}
}
(10) mapper.xml 파일 생성
namespace
속성을 설정namespace
-> session 객체가 sql문을 메소드에 의해 실행할 때 사용하는 mapper구분 값parameterType
-> 매개변수가 있는 경우 타입 설정 (INSERT,UPDATE,DELETE,SELECT 다 사용)#{매개변수명}
으로 전달받는다<?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="student">
<!--
실행할 sql문에 맞는 태그를 선언하면됨.
<select>,<insert>,<update>,<delete>
sql문은 시작태그와 끝태그 사이에 작성, ;를 작성하지 않는다.
-->
<insert id="insertStudent">
INSERT INTO STUDENT VALUES(SEQ_STUDENT.NEXTVAL,'유병승','0102341234','YOO@YOO.COM','경기도 시흥시',DEFAULT)
</insert>
<insert id="insertStudentByName" parameterType="string">
<!-- 메소드 실행시 매개변수가 있는 경우에 sql태그에 parameterType 속성을 이용해서 매개변수 타입을 설정
파라미터값은 #{매개변수명}로 전달받을 수 있다. -->
INSERT INTO STUDENT VALUES(SEQ_STUDENT.NEXTVAL,#{name},'0102341234','YOO@YOO.COM','경기도 시흥시',DEFAULT)
</insert>
<insert id="insertStudentAll" parameterType="com.mybatis.model.vo.Student">
<!-- type을 작성할 때 클래스를 작성하려면 패키지명까지 작성을 해야한다 -->
INSERT INTO STUDENT VALUES(SEQ_STUDENT.NEXTVAL,#{studentName},#{studentTel},#{studentEmail},#{studentAddress},default)
</insert>
<update id="updateStudent" parameterType="com.mybatis.model.vo.Student">
UPDATE STUDENT SET STUDENT_NAME=#{studentName},STUDENT_TEL=#{studentTel},STUDENT_EMAIL=#{studentEmail},STUDENT_ADDR=#{studentAddress} WHERE STUDENT_NO=#{studentNo}
</update>
<delete id="deleteStudent" parameterType="_int"> // 매개변수가 int형임
DELETE FROM STUDENT WHERE STUDENT_NO=#{n}
</delete>
<!--
<select> 태그를 이용하고
resultType || resultMap -> 쿼리문의 실행결과를 반환할 타입을 지정
resultType : java코드로 작성되어있는 타입(기본, 클래스타입)
resultMap : mybatis에서 <resultMap>을 이용해서 만든 타입
* 컬럼명과 매핑할 java클래스 필드명이 같으면 resultType 다르면 resultMap 만들어서 직접 매핑해줌
* 클래스간의 연관관계를 설정했을때(has a) 사용
* 반드시 resultMap이나 resultType 둘 중 하나 있어야함
-->
<select id="selectStudentCount" resultType="_int"> <!-- 개수는 반환형이 정수로 반환하므로 -->
SELECT COUNT(*) FROM STUDENT
</select>
<!-- vo객체와 resultset의 컬럼명 불일치할때 resultMap을 이용해서 맵핑시켜줄수있다.
<resultMap id="구분" type="">
<id property="type에 설정된 객체의 필드명" column="resultset컬럼명"> id pk값
<result > 나머지 필드값들
<associtation> has a 관계
<collection> 리스트로 객체를 가질 때
-->
<!-- resultMap 예시 -->
<resultMap id="studentMap" type="com.mybatis.model.vo.Student">
<id property="studentNo" column="student_no"/>
<result property="studentName" column="student_name"/>
<result property="studentTel" column="student_tel"/>
<result property="studentEmail" column="student_email"/>
<result property="studentAddress" column="student_addr"/>
</resultMap>
<!--<select id="selectStudent" resultType="com.mybatis.model.vo.Student" parameterType="_int"> -->
<select id="selectStudent" resultMap="studentMap" parameterType="_int">
<!-- SELECT STUDENT_NO AS STUDENTNO,
STUDENT_NAME AS STUDENTNAME,
STUDENT_TEL AS STUDENTTEL,
STUDENT_EMAIL AS STUDENTEMAIL,
STUDENT_ADDR AS STUDENTADDRESS,
REG_DATE
FROM STUDENT WHERE STUDENT_NO=#{no} -->
SELECT * FROM STUDENT WHERE STUDENT_NO=#{NO}
</select>
<select id="selectStudentByName" resultMap="studentMap" parameterType="string">
SELECT * FROM STUDENT WHERE STUDENT_NAME LIKE '%'||#{name}||'%' <!-- 문자열끼리 합쳐준거임 -->
</select>
<select id="selectStudentMap" resultType="map" parameterType="_int"> <!-- 맵 자료형 반환 -->
SELECT * FROM STUDENT WHERE STUDENT_NO=#{no}
</select>
</mapper>