일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- jquery
- 정규화표현식
- JavaScript
- mybatis
- 환경설정
- 개선
- interface
- regex
- extends
- 자바스크립트
- html
- for문
- jsp
- 참조타입
- Selector
- controller
- jar
- 알고리즘
- String
- SQL
- jdbc
- iBATIS
- scope
- 자료구조
- 자바
- JCF
- Set
- DB
- java
- 형변환
- Today
- Total
프로그래밍공부노트
Day 46 - myBatis(환경설정, choose, trim, set) 본문
iBatis와 거의 유사하다 변경된 부분을 확인하고 차이점만 인지하고 있으면 사용하는데 문제가 없을 것이다.
우선 pom.xml부터 확인하고 depedency에 myBatis 추가해준다.
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) 그대로 옮겨서 작성하면 된다.
여기있는 내용 옮겨서 적으면 된다
<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 |
---|