[Mybatis 프레임워크]
1) Java코드의 개입을 축소시키기 위해 사용한다.
2) SQL명령어를 Java코드에서 분리시킨다.
-> 분리된 SQL명령어는 XML파일에서 관리한다
-> 결합도가 낮아지고, 응집도가 높아졌다.
3) "실행 결과를 VO 자바 객체로 매핑"하는 설정이 필요하다.
==설정이 있다면 자동으로 매핑
==매핑이 안되면 설정부분에서 에러가 날 확률이 높다.
-mapping.xml의
resultType과 sql-map-config alias를 일치 시킨다(매핑)
[mybatis설치]
marketplace-> mybatis-> 참새 두개다 설치 -> pom.xml 에 설정추가
[pom.xml]
<!-- Mybatis기본 설정 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-core</artifactId>
<version>3.0</version>
</dependency>
<!- -Spring연동을 위한 설정 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.4</version>
</dependency>
실습에서는 Spring에서 사용하기 때문에 밑의 설정을 사용한다.
-board테이블을 사용하여 설정해보자
MyBatis XML Mapper -> board-mapping.xml
MyBatis Generator Configuration File -> sql-map-config.xml
[board-mapping.xml]
- <mapper namespace="BoardDAO"></mapper> -> BoardDAO와 mapping하기 위한 설정
- <select id="getBoard">
SQL명령어
</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">
<!-- BoardDAO와 mapping됨 -->
<mapper namespace="BoardDAO">
<!--1. resultMap-->
<resultMap type="board" id="boardResult">
<id property="bid" column="bid" />
<result property="title" column="title" />
<result property="writer" column="writer" />
<result property="content" column="content" />
<result property="filename" column="filename" />
</resultMap>
<select id="getBoard" resultMap="boardResult">
<!-- 2.CDATA Section -->
<![CDATA[
<!-- 기존의 ?는 #{bid}로 바꿈 -->
SELECT * FROM BOARD WHERE BID=#{bid}
]]>
</select>
<!-- 3. resultType -->
<select id="getBoardList" resultType="board">
SELECT *
FROM BOARD
WHERE 1=1
<!-- 4.if -->
<if test="searchCondition == 'title'">
AND TITLE LIKE '%'||#{searchKeyword}||'%'
</if>
<if test="searchCondition == 'writer'">
AND WRITER LIKE '%'||#{searchKeyword}||'%'
</if>
<if test="searchCondition == 'content'">
AND CONTENT LIKE '%'||#{searchKeyword}||'%'
</if>
ORDER BY BID DESC
</select>
<insert id="insertBoard">
INSERT INTO BOARD VALUES((SELECT NVL(MAX(BID),0)+1
FROM
BOARD),#{title},#{writer},#{content},#{filename})
</insert>
<update id="updateBoard">
UPDATE BOARD SET TITLE=#{title},CONTENT=#{content}
WHERE BID=#{bid}
</update>
<delete id="deleteBoard">
DELETE BOARD WHERE BID=#{bid}
</delete>
</mapper>
3. resultType: sql-map-config.xml설정파일에서 BoardVO를 alias값과 매핑
1. resultMap: resultType으로 받을수 없는 값들을 설정한다.
2. CDATA Section
SQL구문내부에 '<' or '>' 을 쓸 수 없다. XML 파서가 <류를 태그로 인식하여 처리하기 때문이다.
따라서 '<![CDATA[ select * from board where bid=#{bid} ]]>'형태로 사용
4. 조건에 따른 분기처리
조건에 따라 WHERE조건을 하려하는데 WHERE뒤에 비워둘 수 없다. 항상 true인 값을 사용 ex)1=1
-> Dynamic SQL
<if test="searchCondition == 'title'">
AND TITLE LIKE '%'||#{searchKeyword}||'%'
</if>
[sql-map-config.xml]
-Mybatis 프레임 워크를 위한 설정파일
이번 Spring프로젝트 때 사용할 설정
<?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>
<?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>
<!-- 별칭,별명,Alias 설정 -->
<typeAliases>
<typeAlias type="com.test.app.board.BoardVO" alias="board" />
<!-- sql-map-config의 alias를 board-mapping.xml의 resultType과 일치 시킨다 -->
</typeAliases>
<!-- Sql Mapper 연결 -->
<!-- mapping파일을 보기 위한 설정 -->
<mappers>
<mapper resource="mappings/board-mapping.xml"/>
</mappers>
</configuration>
[applicationContext.xml]
-Mybatis 프레임워크: SqlSession 객체를 활용한다.
"팩토리 패턴" >> 팩토리 == 객체생성하여 반환하는 주체
-> 객체생성해서 반환하는 로직을 "캡슐화"
:SqlSessionFactory가 sqlSession 객체를 생성하여 반환한다
☆ 싱글톤 패턴
메모리에 동일한 객체를 하나만 생성하여 재사용
☆ 팩토리 패턴(my batis)
객체를 반환하는 로직이 캡슐화된, 그래서 해당객체를 별도 설정없이 바로 반환가능
<!-- DataSource 설정 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="kim" />
<property name="password" value="1234" />
</bean>
<!-- Mybatis 설정 -->
<bean id="sqlSession"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation"
value="classpath:sql-map-config.xml" />
</bean>
<bean class="org.mybatis.spring.SqlSessionTemplate">
<!-- autowired가 타입만 보므로 id필요없음 -->
<!--생성자 INJECTION-->
<constructor-arg ref="sqlSession" />
</bean>
SqlSessionFactoryBean의 역할
package com.test.app.common;
import java.io.Reader;
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 SqlSessionFactoryBean {
private static SqlSessionFactory sessionFactory=null;
//필요없다우
static {
try {
if(sessionFactory==null) {
Reader reader=Resources.getResourceAsReader("sql-map-config.xml");
//입력스트림을 통해 설정을 전달받는다.
sessionFactory=new SqlSessionFactoryBuilder().build(reader);
}
} catch(Exception e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSessionInstance() {
return sessionFactory.openSession();
}
}
[BoardDAO3]
package com.test.app.board.impl;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import com.test.app.board.BoardVO;
public class BoardDAO3 {
@Autowired
private SqlSessionTemplate mybatis;
public void insertBoard(BoardVO vo) {
System.out.println("insertBoard() 호출됨");
mybatis.insert("BoardDAO.insertBoard",vo);
}
public BoardVO getBoard(BoardVO vo) {
System.out.println("getBoard() 호출됨");
return (BoardVO)mybatis.selectOne("BoardDAO.getBoard",vo);
}
public List<BoardVO> getBoardList(BoardVO vo) {
System.out.println("getBoardList() 호출됨");
return mybatis.selectList("BoardDAO.getBoardList", vo);
}
public void updateBoard(BoardVO vo) {
mybatis.update("BoardDAO.updateBoard",vo);
}
public void deleteBoard(BoardVO vo) {
mybatis.delete("BoardDAO.deleteBoard",vo);
}
}
'Spring > Spring' 카테고리의 다른 글
Spring) 알림기능 개선(1) - HTTP, SSE, WebSocket (0) | 2022.12.05 |
---|---|
day79) JPA로 DAO4변경하기 (0) | 2022.04.22 |
day73) 다국어 처리(국제화) (0) | 2022.04.13 |
day72) 파일 업로드 (0) | 2022.04.12 |
day72) 에러페이지 처리 (0) | 2022.04.12 |
댓글