본문 바로가기

개발/Spring

마이바티스(Mybatis)

728x90
반응형
마이바티스

 

SQL 문이 프로그래밍 코드에 섞여 코드를 복잡하게 만든다는 문제점을 개선해 SQL 문의 가독성을 높여 사용하기 편하게 만든 것이 마이바티스 프레임워크입니다.
마이바티스를 사용하면 복잡한 SQL 문이라도 SQL Developer 같은 도구에서 SQL 문을 사용하는 것처럼 표준화 된 방법으로 사용할 수 있습니다.

마이바티스 프레임워크의 특징은 다음과 같습니다.
- SQL 실행 결과를 자바 빈즈 또는 Map 객체에 매핑해주는 Persistense 솔루션으로 관리합니다. SQL 을 코드가 아닌 XML 로 분리합니다.
- SQL 문과 프로그래밍 코드를 분리해서 구현합니다.
- 데이터소스(DataSource) 기능과 트랜잭션 처리 기능을 제공합니다.

 

마이바티스 각 설정 파일은 src 아래에 위치해야 합니다.

 

[ /src/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>
	<typeAliases>
		<!-- DAO 로 전달할 때 사용할 빈을 생성 -->
		<typeAlias type="com.spring.ex01.MemberVO" alias="memberVO" />
	</typeAliases>

	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<!-- 데이터베이스 연결 설정 -->
			<dataSource type="POOLED">
				<property name="driver"
					value="oracle.jdbc.driver.OracleDriver" />
				<property name="url"
					value="JDBC:oracle:thin:@localhost:1521:XE" />
				<property name="username" value="scott" />
				<property name="password" value="tiger" />
			</dataSource>
		</environment>
	</environments>

	<mappers>
		<!-- SQL 문에 설정되어 있는 xml 을 읽어들임 -->
		<mapper resource="mybatis/mappers/member.xml" />
	</mappers>
</configuration>

 

 

[ /src/mybatis/mapper/member.xml ]

 

<?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="mapper.member">
	<!-- 반환값을 앞에 typeAlias 에 지정한 빈으로 설정 -->
	<resultMap id="memResult" type="memberVO">
    	<!-- 레코드 설정 -->
		<result property="id" column="id" />
		<result property="pwd" column="pwd" />
		<result property="name" column="name" />
		<result property="email" column="email" />
		<result property="joinDate" column="joinDate" />
	</resultMap>
	
	<!-- SQL 메서드의 반환되는 레코드를 설정 -->
	<select id="selectAllMemberList" resultMap="memResult">
      <![CDATA[
         select * from t_member	order by joinDate desc	 	
      ]]>
	</select>
</mapper>

 

 

[ DAO ]

 

...
	private static SqlSessionFactory getInstance() {
		if (sqlMapper == null) {
			try {
				// config 설정을 읽은 후 데이터베이스와 연동
				String resource = "mybatis/SqlMapConfig.xml";
				Reader reader = Resources.getResourceAsReader(resource);
				// 마이바티스를 이용하는 sqlMapper 할당
				sqlMapper = new SqlSessionFactoryBuilder().build(reader);
				reader.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return sqlMapper;

	}

	public List<MemberVO> selectAllMemberList() {
		sqlMapper = getInstance();
		// SQL 문을 호출하는데 사용될 SqlSession 객체를 가져옴
		SqlSession session = sqlMapper.openSession();
		List<MemberVO> memlist = null;
		// mapper 에 정의되어 있는 SQL 문의 ID 를 인자로 할당
		memlist = session.selectList("mapper.member.selectAllMemberList");
		return memlist;
	}
...

 

이후에는 Service 등 에서 DAO 에 정의된 함수를 사용하시면 되겠죠? 

 

 

 

마이바티스 CRUD

 

CRUD 는 다들 아시겠지만 Create(생성), Read(읽기), Update(갱신), Delete(삭제) 기능을 CRUD 라고 합니다.

위의 session.selectList 와 같은 메서드를 사용할 수 있습니다.

 

SqlSession 클래스에서 제공하는 메서드

 

메서드 기능
List selectList(query id) id 에 대한 select 문을 실행한 후 레코드들을 List 로 반환합니다.
List selectList(query id, condition) id 에 대한 select 문을 실행하면서 사용되는 조건도 전달합니다.
T selectOne(query id) id 에 대한 select 문을 실행한 후 지정한 타입으로 하나의 레코드를 반환합니다.
T selectOne(query id, condition) id 에 대한 select 문을 실행하면서 사용되는 조건도 전달합니다.
Map<A, B> selectMap(query id, condition) id 에 대한 select 문을 실행하면서 사용되는 조건도 전달합니다.(반환타입 Map)
int insert(query id, Object obj) id 에 대한 insert 문을 실행하면서 obj 객체의 값을 테이블에 추가합니다.
int update(query id, Object obj) obj 객체의 값을 조건문의 수정 값으로 사용해 id 에 대한 update 문을 실행합니다.
int delete(query id, Object obj) obj 객체의 값을 조건문의 조건 값으로 사용해 id 에 대한 delete 문을 실행합니다.

 

 

 

동적 SQL 문

 

동적 SQL 문은 주로 where 절을 동적으로 추가합니다. 

공통 SQL 문에 대해 조건 값의 유무에 따라 동적으로 공통 SQL 문에 조건절을 추가하는 것입니다.

if, choose, foreach 를 사용하여 SQL 문을 동적으로 사용할 수 있게 정의할 수 있습니다.

 

// if
  <select id="searchMember" parameterType="memberVO" resultMap="memResult">
      <![CDATA[
          select * from t_member
      ]]>
      <where>
         <if test=" name != ''  and  name != null">
            name=#{name}
         </if>
         <if test="email != ''  and email != null ">
           and email = #{email}
         </if>
      </where>
      order by joinDate desc
  </select>
  
  
  // choose
  ...
       <where>
		  <choose>
		      <when test="name != '' and name != null and  email != '' and email != null">
			     name=#{name} and email=#{email}
		      </when>
		      <when test="name != '' and name != null">
			     name = #{name}
		      </when>
		      <when test="email !='' and email != null">
			    email = #{email}
		      </when>
	      </choose>
       </where>
...


// foreach
... 
      where name in
      <foreach item="item" collection="list" open="(" separator="," close=")" >
         #{item}
      </foreach>
...


// foreach - list 로 다수의 정보를 받아서 insert
...
<insert id="foreachInsert"  parameterType="java.util.Map">
      <foreach item="item"  collection="list"   open="INSERT ALL" separator=" " close="SELECT * FROM DUAL" >
          INTO  t_member(id, pwd, name, email)
          VALUES  (#{item.id},
                    #{item.pwd},
                    #{item.name},
                    #{item.email})
      </foreach>
</insert>

 

 

 

SQL 문 중복 제거

 

<sql> 태그와 <include> 태그를 이용하면 SQL 문을 재사용할 수 있습니다.

 

...
   <sql id="a">
    <![CDATA[
      select * from t_member
     ]]> 
   </sql>
   
   <select id="searchMember" parameterType="memberVO" resultMap="memResult">
	   <include refid="a" />  
       <where> 
       ...
...

 

<sql> 태그의 id 를 a 로 설정해서 <include> 태그로 설정된 a 의 구문을 사용할 수 있습니다.

 

 

여기까지 임미다.

728x90