본문 바로가기

Archived(Programming)/Spring #2(기초)

Mapper XML 파일

# Mybatis Mapper XML 파일

  • SQL 문을 저장하는 존재를 매핑파일이라고 함
  • JDBC 코드에 비하면 코드가 95% 감소
  • Mybatis는 SQL 작성에 집중할 수 있도록 만들어짐

# XML Mapper 작성

DAO 클래스가 작성되면 이를 사용하는 SQL문 작성이 필요

  1. XML로 작성된 Mapper의 위치 결정
  2. XML Mapper 파일을 작성하고 필요한 DTD 추가(템플릿 팡리 사용)
  3. SQL 작성

# Select

  • Mybatis에서 가장 많이 사용하는 엘레멘트
  • 어플리케이션은 데이털르 수정하는 기능보다 데이터 조회를 주로 함
  • Mybatis는 데이터 조회하는 기능에 집중함
<select id="selectPerson" parameterType="int" resultType="hashmap">
	SELECT * FROM PERSON WHERE ID = #{id}
</select>
  • 위 쿼리 이름은 selectPerson 파라미터는 int이고 결과 데이터는 HashMap에 저장됨
// JDBC 코드와 유사함, 마이바티스 코드는 아님
String selectPerson = "SELECT * FROM PERSON WHERE ID =?";
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);
  • 여러가지 속성들
<select
 id="selectPerson"
 parameterType="int"
 parameterMap="deprecated"
 resultType="hahsmap"
 flushCache="false"
 useCache="true"
 timeout="10000"
 fetchSize="256"
 statementType="PREPARED"
 resultSetType="FORWARD_ONLY">
  • Insert, update, delete 설정 (간단함)
<insert	id="insertAuthor">
	insert into Author (id, username, password, email, bio)
    values (#{id}, #{username}, #{password}, #{email}, #{bio})
</insert>

<update id="updateAuthor"
	update Author
	set usernmae = #{username}
   	   ,password = #{password}
   	   ,email = #{email}
   	   ,bio= #{bio}
	where id= #{id}
</update>

<delete id="deleteAuthor">
	delete from Author
    where id = #{id}
</delete>
  • SQL 문 다른 구문에서 재사용 가능한 SQL 구문을 정의할 수 있음
<sql id="userColumns"> id,username,password </sql>

<select id=..>
	select <include refid="userColumns">
	...
</select>

# Parameters

  • 쿼리의 파라미터
  • 전달되는 객체에 따라 파라미터의 타입이 결정된다.

 

# ResultMap

  • Mybatis에서 가장 중요하고 강력한 요소
  • DB에서 데이터를 가져올 때 작성되는 JDBC 코드의 대부분을 줄여주는 역할
<select id="selectUsers" resultMap="UserMap">
	select user_id, user_name, user_pw
    from users
    where id=#{id}
</select>
<resultMap id="userResultMap" type="User">
	<id property ="id column="user_id"/>
    <result property="username" column=""user_name"/>
    <result property="hashedPassword" column=""user_password"/>
</resultMap>

# Mybatis 로깅:: log4jdbc-log4j2

  • Mybatis의 로그를 보다 자세히 확인 가능하게 해줌(Log4jdbc-log4js 라이브러리 의존성 추가)

  • 데이터 소스 변경(JDBC 드라이버 클래스 변경, url log4jdbc 단어 추가, log4jdbc.log4j2.properties 파일 추가)

# 실습

insert 추가

article-mapper.xml 수정 - hello-web/src/main/resources/mappers

<?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="mappers.article-mapper">
	<insert id="insertArticle"
		parameterType="kr.co.acomp.hello.vo.Article">
		insert into (article_id, author, title, content)
		values (#{articleId}, #{author}, #{title}, #{content})
	</insert>
</mapper>

select 추가

article-mapper.xml 수정 - hello-web/src/main/resources/mappers

<?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="mappers.article-mapper">
	...
	<select id="selectArticle"
		resultType="kr.co.acomp.hello.vo.Article"
		parameterType="string">
		select  article_id as articleId,  
			    author,
			    title,
			    content
		from 	article
		where	article_id = #{articleId}
	</select>
</mapper>

ArticleDAO 수정

package kr.co.acomp.hello.dao;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import kr.co.acomp.hello.vo.Article;

@Repository // Repository Annotation
public class ArticleDAO {
	@Autowired
	SqlSession sqlSession;
	
	public void insertArticle(Article article) {
		// id 이름을 입력하여 insert 실행
		sqlSession.insert(
				"mappers.article-mapper.insertArticle", article);
	}

	public Article selectArticleById(String articleId) {
		return sqlSession.selectOne(
				"mappers.article-mapper.selectArticleById", articleId);
	}
}

'Archived(Programming) > Spring #2(기초)' 카테고리의 다른 글

AOP(Aspect Oriented Programming)  (0) 2020.03.17
Dynamic SQL  (0) 2020.03.17
Spring Mybatis  (0) 2020.03.15
Context 분리와 전략  (0) 2020.03.13
Spring Data Access 기술과 DataSource  (0) 2020.03.13