프로그래밍공부노트

Day 46 - myBatis(환경설정, choose, trim, set) 본문

myBatis

Day 46 - myBatis(환경설정, choose, trim, set)

SANGJIN-YU 2021. 4. 19. 23:14
반응형

iBatis와 거의 유사하다 변경된 부분을 확인하고 차이점만 인지하고 있으면 사용하는데 문제가 없을 것이다.

 

우선 pom.xml부터 확인하고 depedency에 myBatis 추가해준다.

mvnrepository.com/

Repository 와 depedency 사용하려는 버전을 찾아서 추가해주면 사용 가능하다.

이렇게 추가한 다음에 Libraries의 Maven Depedenices에 잘 올라갔는지 확인하면 된다.

 

iBatis때에는 properties파일을 만들어서 사용했는데 myBatis에서는 xml파일을 만들어서 사용하면 된다.

안에 들어가는 내용은 거의 비슷하고 작성 방법이 달라졌다.

 

우선 Configuration.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>

<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:  :  "/>
			<property name="username" value="   "/>
			<property name="password" value="   "/>
		</dataSource>
	</environment>	
</environments>

</configuration>

iBatis와 달라진점은 

<environments> 태그 default="development"

<environment> 태그 id="development"

<transactionManager/> (empty tag)로 바뀜

<dataSource> type ="POOLED"

<property>

db.properties 작성대신 여기에 property로 작성해준다.


계속 사용해왔던 log4j.properties ->  log4j.xml로 변경하는 작업을 해줬다.

환경설정?이기 때문에 Configuration.xml로 만드는 것은 똑같다(config)

하지만 여기서 log4j를 위한 설정을 따로 해줘야하는데 이것은 검색을 통해서 내용을 찾아서 사용하였다.

 

log4j.xml 을 검색하면 쉽게 찾을 수 있다.

<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN"
"http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration 
	xmlns:log4j="http://jakarta.apache.org/log4j/">

찾아서 작성해주면 된다.

 

얘도 root에 작성해야된다.

<root>
	<level value="TRACE"/>
	<appender-ref ref="consoleAppender"/>
	<appender-ref ref="fileAppender"/>
</root>

 

properties에서 작성 했던 console에 출력하기 위한 객체(consoleAppender) 파일로 저장하기 위한 객체(file appender) 그대로 옮겨서 작성하면 된다.

 

sangjinyu.tistory.com/56

여기있는 내용 옮겨서 적으면 된다

<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
	<layout class="org.apache.log4j.PatternLayout">
		<param name="ConversionPattern" value="[%d] [%-5p] %c %x - %m%n"/>
	</layout>
</appender>

<appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender">
	<param name="File" value="c:/log/goodee.log"/>
	<param name="DatePattern" value="'.'yyyy-MM-dd"/>
	<layout class="org.apache.log4j.PatternLayout">
		<param name="ConversionPattern" value="[%d] [%-5p] [%13F\:%L] - %m%n"/>
	</layout>
</appender>

위에서 얘기했던 console 출력과 file저장을 따로 작성한다 

 

consoelAppender

<appender>태그를 사용하여 name을 지정하고 class를 iBatis에서 작성했던 그대로 작성한다.(검색)

console Appedner에 layout이 있었는데 <layout>태그를 사용해서 적어준다.

그 layout 하위에 ConversionPattern이 있었고 그건 <param>에 작성해주면 된다.<param>은 empty tag

 

 

fileAppender

<appender> 태그를 사용하여 name을 지정하고 class를 그대로 작성한다.

file Appender에 똑같이 <layout>도 맞춰서 사용한다. 그리고 똑같이 <param>에 작성한다.

<appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender">
	<param name="File" value="c:/log/goodee.log"/>
	<param name="DatePattern" value="'.'yyyy-MM-dd"/>
	<layout class="org.apache.log4j.PatternLayout">
		<param name="ConversionPattern" value="[%d] [%-5p] [%13F\:%L] - %m%n"/>
	</layout>
</appender>

 

JDBC로그는 <logger> 태그로 작성해주면 된다.

<logger name="java.sql.Connection">
<level value="TRACE"/>
</logger>
<logger name="java.sql.Statement">
<level value="TRACE"/>
</logger>
<logger name="java.sql.PreparedStatement">
<level value="TRACE"/>
</logger>
<logger name="java.sql.ResultSet">
<level value="TRACE"/>
</logger>

level value는 사용할 level을 작성해주면 된다.


SqlSessionFactory

iBatis에서 SqlDaoSupport 사용하던 것 대신

SqlSessionFactory를 사용한다.

생성 방식은 똑같이 single-ton으로 생성하면 된다.

 

public class SqlSessionManager {

	private static SqlSessionFactory factory;
    
    static{
    	String path = "Configuration.xml 위치";
   
    try{
    	Reader reader = Resources.getResourceAsReader(path);
        factory = new SqlSessionFactoryBuilder().build(reader);
        reader.close();
        
        } catch (IOException e){
        	e.printStackTrace();
        }
      }
      public static SqlSessionFactory getFactory(){
      	return factory;
    }
}

 


resultMap 컬럼은 대문자이고 VO안에 있는 getter/setter 호출
get메소드/set메소드의 get과 set을 제거하고 Camel방식(Hungarian)으로 호출
JOB_ID : job_id : setJob_id()

 

myBatis에서는 parameterType을 선언하지 않아도 Object가 자동으로 변환하여 사용한다

iBatis는 반환타입 Object 하지만 Object 는 <selectKey>를 통해서 값을 생성 후 반환 

myBatis에서는 반환타입이 성공한 row의 갯수를 반환, <selectKey> 입력받은 parameterType을 pass by

reference하여 값을 입력

 

	<insert id="setJobs" parameterType="jVo">
		<selectKey order="BEFORE" keyProperty="job_id" resultType="java.lang.String">
			SELECT 'IT_'|| STARMEMBER_SEQ.NEXTVAL AS JOB_ID FROM DUAL
		</selectKey>
		INSERT INTO JOBS_TEMP (JOB_ID,JOB_TITLE,MAX_SALARY,MIN_SALARY) 
			VALUES(#{job_id},#{job_title},#{max_salary},#{min_salary})
	</insert>

IT_ 에 STARMEMBER_SEQ.NEXTVAL을 Concatenation 해서 값을 만들어 JOB_ID라고 ALIAS를 부여하고 

INSERT문 실행


<if>태그

조건을 지정하여 참이라면 <where>아래의 sql문이 동작한다.

	 <select id="getJobsIf" parameterType="java.util.Map" resultMap="mapjVo">
	 SELECT JOB_ID JOB_ID0, JOB_TITLE JOB_TITLE0, MAX_SALARY MAX_SALARY0, MIN_SALARY MIN_SALARY0 FROM JOBS_TEMP
			 <where>
			 	<if test="job_id != 'IT_PROG'">
			 		JOB_ID =#{job_id};
			 	</if>
			 </where>
	 </select>

iBatis에서는 <iterate>라는 반복태그를 활용하여 쿼리를 완성시킬 수 있었다.

myBatis에서는 <foreach>를 통해서 구현하고 있다.

iBatis에서는 JCF만 가능했지만 myBatis에서는 Array까지 가능하다

 

여기서 JCF를 기본 배열로 바꾸는 방법 

List<Integer> list = new ArrayList<Integer>(arrays.asList(list객체));

 

Collections 삿용 하여 collections ="lists" -> JCF의 List를 처리하겠다 / collections = "key값" -> JCF의 Map을 처리

또한 변수를 사용할 수 있다 (기존 사용하던 for문처럼 (var i of list) , for(String s : list) )

item이 사용하는 변수(i 와 s처럼)

	 <select id="getJobsForList" parameterType="java.util.List" resultType="jVo">
	 	<include refid="selAll"/>
	 	WHERE JOB_ID IN
	 	<foreach collection="list" item="job_id" open="(" separator="," close=")">
	 		#{job_id}
	 	</foreach>
	 </select>

collection="list" List를 다루겠다.

open, separator, close 몇번 반복될지 모르기 때문에 시작, 구분, 닫음을 설정해 놓고 들어온 갯수만큼만 반복되도록 만든다.

 


Choose문 : 여러개의 조건중에서 첫 번째에 참이 나오는 조건에 동작이 된다

DB에서는 CASE WHEN THEN ELSE END, java에서는 switch case문과 같다

 

조건 A와 B가 있을 때

A : T / B : F => A를 검색

A : F / B : T => B를 검색

A : T / B : T => A를 검색(둘다 T이지만 A가 첫번째)

A : F / B : F => 전체 검색

 

	 <select id="getJobsChoose" parameterType="jVo" resultType="jVo">
	 	<include refid="selAll"/>
	 		<where>
	 			<choose>
	 				<when test="job_id != null">
	 					JOB_ID =#{job_id}
	 				</when>
	 				<when test="job_title != null">
	 					JOB_TITLE = #{job_title}
	 				</when>
	 			</choose>
	 		</where>
	 </select>

<trim>

IBatis에서 prepend override처럼 연속으로 생성되는 값 중에서 AND를 Override한다

	 <select id="getJobsTrim" parameterType="jVo" resultType="jVo">
	  <include refid="selAll"/>
	  	<trim prefix="WHERE" prefixOverrides="AND">
	  		<if test="job_id != null">
	  		JOB_ID=#{job_id} 
	  		</if>
	  		<if test="job_title != null">
	  		 JOB_TITLE=#{job_title} 
	  		</if>
	  	</trim>
	 </select>

<set>

컬럼 = 값, 컬럼 = 값, ...  만약 입력값의 갯수가 다를 경우 자동으로 ,를 제거해 줌

 

	 <update id="updateJobsSet" parameterType="jVo" >
	 	UPDATE JOBS_TEMP 
	 	<set>
	 		<if test="job_title != null">
	 			JOB_TITLE = #{job_title},
	 		</if>
	 		<if test="min_salary > 0">
	 			MIN_SALARY =#{min_salary},
	 		</if>
          </set>
	 </update>

 

반응형

'myBatis' 카테고리의 다른 글

Day 47, 48 - myBatis,JSP  (0) 2021.04.21