230530 SpringBoot 동적쿼리_Transaction

Myung A Lee·2023년 6월 2일
0

SpringBoot

목록 보기
3/8
post-thumbnail

Spring Boot

동적 쿼리 Dynamic_SQL

  • 동적 쿼리란 상황에 따라 SQL 문장이 변경 되는 것을 의미.
  • reference : http://www.mybatis.org/mybatis-3/ko/dynamic-sql.html
  • ex
    1) 특정한 값이 null 로 들어왔을 경우 다른 값으로 대처
    2) 특정한 조건에 따라 조건 절이 변경
    3) 조건에 따라 수정하는 column 변경
  • mapper.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="kr.co.gudi.dao.MemberDAO">
   
   <!-- 경우에 따라서 쿼리문의 일부가 변화해야 할 때 if를 사용한다.  -->
   <!--
   	<insert id="join" parameterType="member">
   		INSERT INTO member(id,pw,name,email) 
   		<if test="email.equals('')">
   			VALUES(#{id},#{pw},#{name},'이메일 없음')
   		</if>
   		<if test="!email.equals('')">
   			VALUES(#{id},#{pw},#{name},#{email})
   		</if>
   		
   	</insert>
   	-->
   	
   	<!-- if else문이 없기 때문에 사용하고 싶다면 choose/otherwise 사용 -->
   	 <insert id="join" parameterType="member">
   		INSERT INTO member(id,pw,name,email) 
   		<choose>
   			<when test="email.equals('')">
   				VALUES(#{id},#{pw},#{name},'이메일 없음')
   			</when>
   			<otherwise>
   				VALUES(#{id},#{pw},#{name},#{email})
   			</otherwise>
   		</choose>
   		
   	</insert>
   
   
   <!-- 변수와 문자열을 합치기 위해서 쓰는 방법은 DB마다 다르다. 
   		ORCLE '%' || #{KEYWORD} || '%'
   		MYSQL CONCAT('%',#{keyword},'%')
   		MS-SQL '%' + #{keyword} + '%'
   		
   
   
   -->
   <select id="list" parameterType="hashmap" resultType="member">
   		SELECT id,pw,name,email FROM member  

	   		 <if test="keyword != null and !keyword.equals('') ">
	   			WHERE ${opt} LIKE CONCAT('%',#{keyword},'%')
	   		</if>

   </select>
	
	<select id="detail" resultType="member">
		SELECT * FROM member WHERE id = #{param1}
	</select>
	
	<update id="update" parameterType="hashmap">
		UPDATE member 
		<set>
			<if test="!pw.equals('')"> pw=#{pw}, </if>
			<if test="!name.equals('')"> name=#{name}, </if>
			<if test="!email.equals('')"> email=#{email} </if>
		</set>
			
		WHERE id=#{id};	
	</update>   
   
   <!-- <select id="multi" parameterType="list" resultType="member">
   
   		SELECT * FROM member 
	   	<where>
		   	<foreach collection="list" item="item" separator="OR">
		   	 	name = #{item}
		   	</foreach>
	   </where>
   </select> -->
   
   <!-- SELECT * FROM member WHERE name IN ('','','',)의 속도가 더 빠름 -->
   <select id="multi" parameterType="list" resultType="member">
   
   		SELECT * FROM member 
	   	<where> 
	   	name IN
		   	<foreach collection="list" item="item" separator="," open="(" close=")">
		   	 	  #{item}
		   	</foreach>
	   </where>
   </select>
   
   
   </mapper>

Transaction

  • @Transactional 을 사용하면 특정 클래스나 메서드, 인터페이스 에서 commit, rollback 등을 수행 한다.
  • Spring 에서는 관련 라이브러리들을 추가 하고 설정도 해야 하지만 boot 에서는 기본으로 제공 한다
  • rollbackFor :모든 예외에 대해서 롤백을 한다. (기본)

isolation

- Isolation.DEFAULT (기본) : 다른 트랜잭션에서 커밋된 데이터만 읽을 수 있다. 
- Isolation.READ_UNCOMMITTED (가장 개방적) : 다른 트랜잭션에서 커밋되지 않은 데이터도 읽을 수 있다. 
- Isolation.REPEATABLE_READ : 조회 중인 데이터를 다른 트랜잭션에서  UPDATE 불가
- Isolation.SERIALIZABLE (가장 폐쇄적): 한 트랜잭션이 commit 될때 까지 다른 트랜잭션은 CRUD 불가

0개의 댓글