Programming/Java

[완독정리] 자바웹을 다루는 기술 3(스프링, 마이바티스)- 길벗

armyost 2021. 2. 9. 23:11
728x90

마이바티스란? 

기존 JDBC로 개발할 경우 반복적으로 구현해야 할 SQL문도 많을 뿐만 아니라 SQL문도 복잡합니다. 

기존의 JDBC의 경우 다음 과정을 거쳐야 했습니다. 

connection → Statement 객체 생성 → SQL문 전송  결과반환 → close

이 방식의 단점은 SQL문이 프로그래밍 코드에 섞여 코드를 복잡하게 만든다는 것입니다. 이를 개선해 가독성을 높여 사용하기 편하게 만든 것이 바로 마이바티스 프레임워크 입니다.

- SQL실행결과를 자바 빈즈 또는 Map객체에 매핑해주는 Persistence 솔루션으로 관리합니다. 즉 SQL을 소스코드가 아닌 XML로 분리합니다.

- SQL문과 프로그래밍 코드를 분리해서 구현합니다.

- 데이터소스 기능과 트랜잭션 처리 기능을 제공합니다.

 

마이바티스 데이터 트랜잭션 순서

1. SqlMapConfig.xml 에 각 기능별로 실행할 SQL문을 SqlMap.xml에 미리 작성한 후 등록합니다.

2. 애플리케이션에서 데이터베이스와 연동하는 데 필요한 데이터를 각각의 매개변수에 저장한 후 마이바티스에 전달합니다.

3. 애플리케이션에서 요청한 SQL문을 SqlMap.xml에서 선택합니다.

4. 전달한 매개변수와 선택한 SQL문을 결합합니다.

5. 매개변수와 결합된 SQL문을 DBMS에서 실행합니다.

6. DBMS에서 반환된 데이터를 애플리케이션에서 제공하는 적당한 매개변수에 저장한 후 반환합니다.

 

/src/mybatis/SqlMapConfig.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>
      <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>
   <mapper resource="mybatis/mappers/member.xml"/>
</mappers>
</configuration>

 

/src/mybatis/mappers/ddl기능.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">
	<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> 
	<!-- 
	<resultMap id="memResult" type="java.util.HashMap">
      <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> -->


	<select id="selectAllMemberList" resultMap="memResult">
      <![CDATA[
         select * from t_member	order by joinDate desc	 	
      ]]>
	</select>

	<select id="selectName" resultType="String">
    <![CDATA[
	select name from t_member
	where id = 'hong'			
    ]]>
	</select>
	
	<select id="selectPwd" resultType="int" >
	  <![CDATA[ 
	    select pwd from t_member 
	    where id = 'hong'
	 ]]>
	 </select> 
	 
	<select id="selectMemberById" resultType="memberVO"  parameterType="String" >
      <![CDATA[
         select * from t_member
         where
         id=#{id}			
      ]]>
	 </select>	
	
	<select id="selectMemberByPwd" resultMap="memResult"  parameterType="int" >
      <![CDATA[
         select * from t_member
         where
         pwd = #{pwd}			
      ]]>
    </select>
    
     <insert id="insertMember"  parameterType="memberVO">
		<![CDATA[
		 insert into t_member(id,pwd, name, email)
		 values(#{id}, #{pwd}, #{name}, #{email})
		]]>      
	</insert>
	
	<insert id="insertMember2"  parameterType="java.util.Map">
		<![CDATA[
			 insert into t_member(id,pwd, name, email)
			 values(#{id}, #{pwd}, #{name}, #{email})
		]]>      
   </insert>
   
   <update id="updateMember"  parameterType="memberVO">
     <![CDATA[
	     update t_member
	     set pwd=#{pwd}, name=#{name}, email=#{email}
	     where
	     id=#{id}
      ]]>      
   </update> 
     
   <delete id="deleteMember"  parameterType="String">
	<![CDATA[
	   delete from  t_member
	   where
	   id=#{id}
	]]>      
  </delete>
	
	
	<!-- 동적 SQL문 -->
  <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>
  
 <!--  
   <sql id="a">
    <![CDATA[
      select * from t_member
     ]]> 
   </sql>  -->  
  
<!--    
  <select id="searchMember" parameterType="memberVO" resultMap="memResult">
	     <include refid="a" /> 
	   <![CDATA[
         select * from t_member 
      ]]>
	  
       <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>
       order by joinDate desc
   </select> -->
   
   <select id="foreachSelect" resultMap="memResult" parameterType="java.util.Map">
      <!-- <include refid="a" /> -->
      <![CDATA[
        select * from t_member 
          
      ]]>
      
      where name in
      <foreach item="item" collection="list" open="(" separator="," close=")" >
         #{item}
      </foreach>
      order by joinDate desc
   </select>
   
   <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>
   
   <!-- 
    <select id="selectLike" resultMap="memResult"  parameterType="String" >
      <![CDATA[
         select * from t_member
         where
         name like '%'#{name}'%'		
      ]]>
    </select>
     -->
   <!--  like 검색 -->
   <select id="selectLike" resultMap="memResult"  parameterType="String" >
      <![CDATA[
         select * from t_member
         where
         name like '%' || #{name} || '%'		
      ]]>
    </select>
</mapper>

 

트랜잭션 기능

일반적인 웹 애플리케이션의 Service클래스와 DAO클래스 구조는 아래와 같습니다. 트랜잭션은 각 단위 기능 수행시 이와 관련된 데이터베이스 연동작업을 한꺼번에 묵어서 관리한다는 개념입니다.