PC

블로그 이미지

DAVID

160609: 60회차

Programming 2016. 6. 9. 18:23

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


이제 eclipse에서 ibatis를 사용해봄



이렇게 다시 library를 잡아주면 됩니다.


이제 

join 배움!


이거 fk pk 같은 개념 배우는것입니다

외부키 관계키 외래키 foreign key



N:1 관계를 배웠습니다

1:1 관계도 배웠습니다



<부모 - 자식 인것>

부서 - 사원 - 1개의 부서에 n개의 사원이 관계를 맺고 있음 1: n - 부서 입장에서는 n명과 관계를 맺고 있으니 n인것

사원-사원신체정보 - 1명의 사원이 1개의 사원신체정보 테이블과 관계를 맺고 있음 - 얘의 pk가 쟤의 pk를 fk로 받을 경우



근데 n:n이란 것도 있음 ㅇㅇ

1개의 인터넷쇼핑몰 회원이 n개 종류의 상품을 삼

근데 새우*이라는 상품은 n명의 회원이 구매 가능함

다:다 관계인것


이것도 inner join 할거임





-- 1:1 join emp:emp_body

select e.empno, e.name, e.phone, e.email, e.regdate, e.zipcode, e.address,

e.deptno, b.empno as empno2, b.weight, b.height, b.blood

from emp e, emp_body b

where e.empno = b.empno

and e.empno=1



-- 1:N join dept:emp

select e.empno, e.name, e.phone, e.email, e.regdate, e.zipcode, e.address,

e.deptno,d.deptno as deptno2, d.deptname

from emp e, dept d

where d.deptno = e.deptno

and d.deptno = 1


1:1의 경우에는 결과값이 1개가 나오지만
1:N의 경우에는 조인했을 때 결과값이 n개가 나옴 ㅇㅇ


----------------------------------

그래서 Jointest.xml임

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="jointest">
<!-- 사원에 대한 데이터를 담고있는 DTO -->
<typeAlias alias="empDTO" type="jointest.EmpDTO"/>
<!-- 사원 신체정보에 대한 데이터를 담고있는 DTO -->
<typeAlias alias="ebDTO" type="jointest.Emp_bodyDTO"/>

<!-- 부서에 대한 데이터를 담고있는 DTO -->
<typeAlias alias="deptDTO" type="jointest.DeptDTO"/>
    
    <resultMap class="empDTO" id="oneMap">
    <result property="empno" column="empno"/>
    <result property="name" column="name"/>
    <result property="phone" column="phone"/>
    <result property="email" column="email"/>
    <result property="regdate" column="regdate"/>
    <result property="zipcode" column="zipcode"/>
    <result property="address" column="address"/>
    <result property="deptno" column="deptno"/>
   
    <!-- ebdto가 Emp_bodyDTO 타입으로 생성한 필드명임 -->
    <result property="ebdto.empno" column="empno2"/>
    <result property="ebdto.weight" column="weight"/>
    <result property="ebdto.height" column="height"/>
    <result property="ebdto.blood" column="blood"/>
    </resultMap>
    
    <!-- QueryForObject로 사용함 -->
    <select id="oneToOne" parameterClass="int" resultMap="oneMap">
   select e.empno, e.name, e.phone, e.email, e.regdate, e.zipcode, e.address,
e.deptno, b.empno as empno2, b.weight, b.height, b.blood
from emp e, emp_body b
where e.empno = b.empno<!-- 부모의 pk = 자식의 fk (inner Join) -->
and e.empno=#empno#  
    </select>
    
        
    <!-- QueryForList로 사용함 -->
    <select id="oneToOneList" resultMap="oneMap">
   select e.empno, e.name, e.phone, e.email, e.regdate, e.zipcode, e.address,
e.deptno, b.empno as empno2, b.weight, b.height, b.blood
from emp e, emp_body b
where e.empno = b.empno    
    </select>
    
    
    <resultMap class="deptDTO" id="manyMap">
    <result property="deptno" column="deptno"/>
    <result property="deptname" column="deptname"/>
    <result property="empdtoList" column="deptno" 
    select="jointest.oneToManyEmp"/>
   
    </resultMap>
    <select id="oneToMany" parameterClass="int" resultMap="manyMap">
    select deptno, deptname
    from dept
    where deptno=#deptno# 
    </select> 
    <select id="oneToManyEmp" parameterClass="int" resultClass="empDTO">
    select * from emp
    where deptno=#deptno#
    </select>
    
   
   
   
   
   
   
        
</sqlMap>


-----------------------------------------

[07][MyBatis] MyBatis 특징
[01] MyBatis

아파치(Apache) 소프트웨어 재단의 IBatis 개발자팀이 구글 코드로 이전하기로 결정하고,
구글 코드에서 새로이 만들어지는 이름이 MyBatis로 변경되었습니다.
 
iBatis 라이브러리는 다운로드가 안됩니다.
 
(01) MyBatis Component Flow
 
MyBatis Framework가 Business Layer와 DB Layer사이 가운데서 양쪽을 연결하고 있으며,
하단의 mapper.xml 파일을 이용하여 쿼리문을 별도로 작성합니다.
 
1) 요청을 받는 presentation layer (jsp) 같은 것


2) persistence layer
오 -ㅅ-);;
예전에는 DAO에서 직접 헀는데
이제는 마이바티스 프레임워크가 연결해줌!


3) 마이바티스 프레임워크
아이바티스에서 sqlmapclient가 하던 거른 sqlsession이함!!!
근디 뭐 내용이 많이 다름 ㅡㅡ

그리고 위에 박스에 di라는 거는 오토와이어드임

그리고 sqlsession이 db랑 소통을 하려면 여러가지 요건이 있어야 함 ㅇㅇ 

di는 쟤가 쟤를 멤버변수로 가지고 있다는 뜻

sqlsession의 팩토리가 하는 역은 세션의 클래스를 그냥 쓸 수 없으니까  객체를 만들어주는 역할







3)

 
(02) MyBatis 특성
 
 1) 성능: 구조적 강점-데이터 접근 속도를 높여주는 Join 매핑
    여러가지 방식의 데이터를 가져오기 전략(가져오기 미루기, SQL 줄이기 기법)
 
 2) 관심사의 분리:설계를 향상(유지 보수성 좋음)
    리소스를 관리하여 계층화를 지원(Connection, PreparedStatement,ResultSet)
 
 3) SQL문이 애플리케이션 소스 코드로부터 완전 분리
 
 4) 이식성: 어떤 프로그래밍 언어로도 구현 가능
 
 5) 오픈소스이며 무료임
 
 
 (03) MyBatis의 구성요소
 
 1) Configuration 파일(SqlMapConfig.xml)
 :DB 설정과 트랜잭션등 MyBatis가 동작하는 규칙을 정의
 
  - DB 설정:별도의 properties 파일로 분리
  - mapper 설정: SQL query를 메타데이터 시킨 xml문서로 분리
  
 
 2) 매퍼(Mapper)
 : SQL을 XML에 정의된 매퍼 XML파일과 SQL을 인터페이스 메소드마다 어노테이션으로
  정의한 매퍼 인터페이스를 의미
 
 3) 매핑구문(Mapped Statements)
 : 조회 결과를 자바 객체에 설정하는 규칙을 나내내는 결과매핑과 SQL을 XML에 정의한
   매핑 구문을 의미 매핑 구문을 정의하는 방법은 어노테이션과 XML 방식 두가지 있음



 

ibatis랑 같은데 위에 mapper annotations랑 sqlmapconfig.xml, sqlmap.xml만 변경된 것 :>?

응그리고 결국 마이바티스도 라이부러리니까 그냥 갖다쓰면 됨




[08][MyBatis] SqlSession생성, SQL 문장 실행
(01) MyBatis 
- MyBatis는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 
- MyBatis는 JDBC코드와 수동으로 셋팅하는 파라미터와 결과 매핑을 제거한다.(MemoDAO, BbsDAO, ...DAO)
- MyBatis는 데이터베이스 레코드에 원시타입과 Map인터페이스 그리고 자바 POJO를 설정하고 매핑하기 위해 XML과 
  애노테이션을 사용할 수 있다.
 
(02) MyBatis 시작하기
- 모든 MyBatis 애플리케이션은 SqlSessionFactory 인스턴스를 사용한다.
- SqlSessionFactory 인스턴스는 SqlSessionFactoryBuilder 를 사용하여 만들수 있다. 
- SqlSessionFactoryBuilder 는 XML설정파일에서 SqlSessionFactory 인스턴스를 빌드할 수 있다.
 
(03) XML에서 SqlSessionFactory 빌드하기
- XML파일에서 SqlSessionFactory 인스턴스를 빌드하는 것은 매우 간단한다. 
- 설정을 위해 클래스패스 자원을 사용하는 것을 추천하나, 파일 경로나 file:// URL로부터 만들어진 Reader 인스턴스를 
  사용할 수도 있다. 
- MyBatis는 클래스패스와 다른 위치에서 자원을 로드하는 것으로 좀더 쉽게 해주는 Resources 라는 유틸성 클래스를 
  가지고 있다.
 
public MyAppSqlConfig {
private static final SqlSessionFactory sqlMapper;
static {
try {
String resource = "org/mybatis/example/Configuration.xml";
                        Reader reader = Resources.getResourceAsReader(resource);
                        sqlMapper = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException (“Error initializing MyAppSqlConfig class. Cause: ” + e);
}
}
public static SqlSessionFactory getSqlMapInstance () {
return sqlMapper;
}
}
 
---------------------------------------------------------------------------------------------------
(04) SqlSessionFactory 에서 SqlSession 만들기
 
- SqlSessionFactory 이름에서 보듯이, SqlSession 인스턴스를 만들수 있다. 
- SqlSession 인스턴스를 이용하여 SQL구문 실행하기 (예1,예2)
 
예1)
- SqlSession 은 데이터베이스에 대해 SQL 명령어를 실행하기 위해 필요한 모든 메서드를 가지고 있다. 
  그래서 SqlSession 인스턴스를 통해 직접 SQL구문을 실행할 수 있다. 
 
SqlSession session = sqlMapper.openSession();
try {
        Blog blog = (Blog) session.selectOne(
        "org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
        session.close();
}
-------------------------------------------------------------------------
예2)
- 주어진 SQL구문의 파라미터와 리턴값을 설명하는 인터페이스(예를 들면, BlogMapper.class )를 사용하여, 
  문자열 처리 오류나 타입 캐스팅 오류 없이 좀더 타입에 안전하고 깔끔하게 실행할 수 있다.
 
SqlSession session = sqlMapper.openSession();
try {
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        Blog blog = mapper.selectBlog(101);
} finally {
        session.close();
}
 
 
 
(05) 매핑된 SQL 구문 살펴보기
 
예1)
 - SqlSession 을 호출하는 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="org.mybatis.example.BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog"> //이것도 class->type으로 바꿈
//
★

/*
Query문을 가지고 있는 애가

1) 아이바티스

ㅁㅁㅁ
map 

map 안에 Alias 

2) 마이바티스

ㅁㅁㅁ
mapper

따로 Alias를 전체 옵션으로 뺌



*/







select * from Blog where id = #{id} // 오 이건 좋네
</select>
</mapper>
 
-----------------------------------------------------------------------------
예2)
- 매핑된 구문은 XML에 전혀 매핑될 필요가 없다. 
- 대신 자바 애노테이션을 사용할 수 있다. 
- 위 XML예제는 다음과 같은 형태로 대체될 수 있다.
 
package org.mybatis.example;
public interface BlogMapper {
   @Select("SELECT * FROM blog WHERE id = #{id}")
   Blog selectBlog(int id);
}


 ------------------------------------------

[09][MyBatis] SQL Map XML 설정파일
(01) SQL Map 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>
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
<typeAliases>
<typeAlias alias="Bbs" type="bbs.BbsDTO"/>
<typeAlias alias="BbsCode" type="bbs.BbsCodeDTO"/>
 
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="poolMaximumActiveConnections" value="2"/>
<property name="poolMaximumIdleConnections" value="1"/>
<property name="poolMaximumCheckoutTime" value="20000"/>
<property name="poolPingEnabled" value="true"/>
<property name="poolPingQuery" value="select 1"/>
<property name="poolPingConnectionsNotUsedFor" value="10000"/>
<property name="poolTimeToWait" value="15000"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/bbs.xml"/>
<mapper resource="mybatis/bbscode.xml"/>
</mappers>
 
</configuration>
---------------------------------------------------------------------------------------------
 
01) <properties>
 
이 설정은 외부에 옮길 수 있다. 
자바 프로퍼티 파일 인스턴스에 설정할 수도 있고, properties 요소의 하위 요소에 둘수도 있다. 
 
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
 
속성들은 파일 도처에 둘수도 있다. 
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
 
 username과 password는 properties 요소의 설정된 값으로 대체될 수 있다.
 driver와 url속성은 config.properties 파일에 포함된 값으로 대체될 수도 있다.
 
 02)settings
 
런타임시 MyBatis의 행위를 조정하기 위한 중요한 값들이다. 
다음표는 셋팅과 그 의미 그리고 디폴트 값을 설명한다.

 
위 설정을 모두 사용한 setting 요소의 예제이다:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="enhancementEnabled" value="false"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
 
 
 03) typeAliases
 
타입 별칭은 자바 타입에 대한 좀더 짧은 이름이다. 
오직 XML 설정에서만 사용되며, 타이핑을 줄이기 위해 존재한다. 
 
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
 
이 설정에서, “Blog” 는 도처에서 “domain.blog.Blog” 대신 사용될 수 있다.
 
 
 04) environments
 
- 개발, 테스트, 리얼 환경을 위해 별도의 설정을 가지거나, 같은 스키마를 여러개의 DBMS제품을 사용할 
  경우들이다.
- 다중 환경을 설정할 수는 있지만, SqlSessionFactory 인스턴스마다 한개만 사용할 수 있다는 것이다.
//선언은 여러개 가능

- 두개의 데이터베이스에 연결하고 싶다면, SqlSessionFactory 인스턴스를 두개 만들 필요가 있다. 
- 기억하기 쉽게 데이터베이스별로 하나의 SqlSessionFactory 환경을 명시하기 위해, SqlSessionFactoryBuilder 에
  옵션으로 추가 파라미터를 주면 된다. 
 
- 환경을 선택하는 두가지 시그니처는
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);
 
- environment 파라미터가 없으면, 디폴트 환경이 로드된다.
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);
 
- environments 요소는 환경을 설정하는 방법을 정의한다.
---------------------------------------------------------------------------
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>


 
- 디폴트 환경(Environment) ID (예를 들면. default=”development”).
- 각각의 환경을 정의한 환경(Environment) ID (예를 들면. id=”development”).

//이거를 여러 개 만들고 default 값만 바꿔주면 됨 ㅇㅇ
------------------------------------------------------------------------------
 
 
05) transactionManager
 
- MyBatis는 두가지 타입의 TransactionManager 를 제공한다.
. JDBC – 이 설정은 간단하게 JDBC 커밋과 롤백을 처리하기 위해 사용된다. 
          트랜잭션의 스코프를 관리하기 위해 dataSource로 부터 커넥션을 가져온다.
.MANAGED – 이 설정은 어떤것도 하지 않는다. 결코 커밋이나 롤백을 하지 않는다. 
             대신 컨테이너가 트랜잭션의 모든 생명주기를 관리한다.
    디플트로 커넥션을 닫긴 한다. 
    하지만 몇몇 컨테이너는 커넥션을 닫는 것 또한 기대하지 않기 때문에, 커넥션 닫는 것으로 멈추고자 
    한다면, “closeConnection” 프로퍼티를 false로 설정하라.
----------------------------------------------------------------------------
  <transactionManager type="MANAGED"> 
   <property name="closeConnection" value="false"/>
  </transactionManager>
---------------------------------------------------------------------------
 
06) dataSource
   
 - UNPOOLED – 이 구현체는 매번 요청에 대해 커넥션을 열고 닫는 간단한 DataSource이다. 
         조금 늦긴 하지만 성능을 크게 필요로 하지 않는 간단한 애플리케이션을 위해서는 괜찮은 선택이다. 
UNPOOLED DataSource 는 5개의 프로퍼티만으로 설정된다.
 
. driver – JDBC 드라이버의 패키지 경로를 포함한 결제 자바 클래스명
. url – 데이터베이스 인스턴스에 대한 JDBC URL.
. username – 데이터베이스에 로그인 할 때 사용할 사용자명
. password - 데이터베이스에 로그인 할 때 사용할 패스워드
. defaultTransactionIsolationLevel – 커넥션에 대한 디폴트 트랜잭션 격리 레벨
 
   필수는 아니지만 선택적으로 데이터베이스 드라이버에 프로퍼티를 전달할 수 도 있다. 
   그러기 위해서는 다음 예제처럼 “driver.” 로 시작하는 접두어로 프로퍼티를 명시하면 된다.
? driver.encoding=UTF8
   이 설정은 “encoding” 프로퍼티를 “UTF8”로 설정하게 된다. 
 
 
 - POOLED – DataSource에 풀링이 적용된 JDBC 커넥션을 위한 구현체이다. 
   이는 새로운 Connection 인스턴스를 생성하기 위해 매번 초기화하는 것을 피하게 해준다. 
   그래서 빠른 응답을 요구하는 웹 애플리케이션에서는 가장 흔히 사용되고 있다.
   UNPOOLED DataSource에 비해, 많은 프로퍼티를 설정할 수 있다.
 
. poolMaximumActiveConnections – 주어진 시간에 존재할 수 있는 활성화된(사용중인) 커넥션의 수. 디폴트는 10이다.
. poolMaximumIdleConnections – 주어진 시간에 존재할 수 있는 유휴 커넥션의 수
. poolMaximumCheckoutTime – 강제로 리턴되기 전에 풀에서 “체크아웃” 될 수 있는 커넥션의 시간. 디폴트는 20000ms(20초)
. poolTimeToWait – 풀이 로그 상태를 출력하고 비정상적으로 긴 경우 커넥션을 다시 얻을려고 시도하는 로우 레벨 셋팅.
                    디폴트는 20000ms(20초)
. poolPingQuery – 커넥션이 작업하기 좋은 상태이고 요청을 받아서 처리할 준비가 되었는지 체크하기 위해 데이터베이스에
                   던지는 핑쿼리(Ping Query).
  디폴트는 “핑 쿼리가 없음” 이다. 
. poolPingEnabled – 핑쿼리를 사용할지 말지를 결정. 사용한다면, 오류가 없는(그리고 빠른) SQL 을 사용하여 poolPingQuery 
                   프로퍼티를 셋팅해야 한다. 디폴트는 false이다.
. poolPingConnectionsNotUsedFor – poolPingQuery 가 얼마나 자주 사용될지 설정한다. 필요이상의 핑을 피하기 위해 
                  데이터베이스의 타임아웃 값과 같을 수 있다. 디폴트는 0이다.
 디폴트 값은 poolPingEnabled 가 true일 경우에만, 모든 커넥션이 매번 핑을 던지는 값이다.
 
 - JNDI – 이 DataSource 구현체는 컨테이너에 따라 설정이 변경되며, JNDI 컨텍스트를 참조한다. 
          이 DataSource는 오직 두개의 프로퍼티만을 요구한다.
. initial_context – 이 프로퍼티는 InitialContext 에서 컨텍스트를 찾기(예를 들어, initialContext.lookup(initial_context)) 
                     위해 사용된다. 이 프로퍼티는 선택적인 값이다. 이 설정을 생략하면, data_source 프로퍼티가 
    InitialContext 에서 직접 찾을 것이다.
. data_source – DataSource 인스턴스의 참조를 찾을 수 있는 컨텍스트 경로이다. initial_context 룩업을 통해 리턴된 
                 컨텍스트에서 찾을 것이다. initial_context 가 지원되지 않는다면, InitialContext 에서 직접 찾을 것이다.
                
   다른 DataSource 설정과 유사하게, 아래처럼 “env.” 를 접두어로 프로퍼티를 전달할 수 있다.
. env.encoding=UTF8
   이 설정은 인스턴스화할 때 InitialContext 생성자에 “encoding” 프로퍼티를 “UTF8” 로 전달한다.
 
 
 07) mappers★
 - 설정을 어디에 둘지 결정해야 한다. 자바는 자동으로 리소스를 찾기 위한 좋은 방법을 제공하지 않는다. 
   그래서 가장 좋은 건 어디서 찾으라고 지정하는 것이다. 
 - 클래스패스에 상대적으로 리소스를 지정할 수도 있고, url 을 통해서 지정할 수 도 있다. 
// Using classpath relative resources
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
// Using url fully qualified paths
<mappers>
<mapper url="file:///var/sqlmaps/AuthorMapper.xml"/>
<mapper url="file:///var/sqlmaps/BlogMapper.xml"/>
<mapper url="file:///var/sqlmaps/PostMapper.xml"/>
</mappers>
 

-------------------------------------------------


[10][MyBatis] SQL Map XML 파일
(01) SQL Map XML 파일
 
01) SELECT
 
<select id=”selectPerson” parameterType=”int” resultType=”hashmap”>
SELECT * FROM PERSON WHERE ID = #{id}
</select>
----------------------------------------------------------------------
<select
id=”selectPerson”
parameterType=”int”
parameterMap=”deprecated”
resultType=”hashmap”
resultMap=”personResultMap”
flushCache=”false”
useCache=”true”
timeout=”10000”
fetchSize=”256”
statementType=”PREPARED”
resultSetType=”FORWARD_ONLY”
>
 
 
 
02)insert, update, delete
- 데이터를 변경하는 구문인 insert, update, delete 는 매우 간단하다.
 
<insert id="insertAuthor" parameterType="domain.blog.Author">
insert into Author (id,username,password,email,bio)
values (#{id},#{username},#{password},#{email},#{bio})
</insert>
 
<update id="updateAuthor" parameterType="domain.blog.Author">
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
</update>
 
<delete id="deleteAuthor” parameterType="int">
delete from Author where id = #{id}
</delete>
 
------------------------------------------------------------------
<insert
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20000">
 
<update
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20000">
 
<delete
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20000">
 



 
03) selectKey
MyBatis 는 자동생성키 칼럼을 지원하지 않는 다른 데이터베이스를 위해 다른 방법 또한 제공한다.
이 예제는 랜덤 ID를 생성하고 있다.
 
<insert id="insertAuthor" parameterType="domain.blog.Author">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
</selectKey>
insert into Author
(id, username, password, email,bio, favourite_section)
values
(#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR}
)
</insert>
 
-----------------------------------------------------------------------------------------
 
<selectKey
keyProperty="id"
resultType="int"
order="BEFORE"
statementType="PREPARED">
 


 
 
04) sql
 
- 이 요소는 다른 구문에서 재사용가능한 SQL구문을 정의할 때 사용된다.
 
<sql id=”userColumns”> id,username,password </sql>
 
SQL 조각은 다른 구문에 포함시킬수 있다.
 
<select id=”selectUsers” parameterType=”int” resultType=”hashmap”>
select <include refid=”userColumns”/>
from some_table
where id = #{id}
</select>
 
 
05)동적 SQL
- 동적 SQL 요소들은 JSTL 이나 XML 기반의 텍스트 프로세서를 사용해 본 사람에게는 친숙할 것이다. 
- MyBatis 의 이전 버전에서는, 알고 이해해야 할 요소가 많았다.
- MyBatis 3 에서는 이를 크게 개선했고 실제 사용해야 할 요소가 반 이하로 줄었다. 
- MyBatis 다른 요소의 사용을 최대한 제거하기 위해 OGNL 기반의 표현식을 가져왔다.
 
- if
동적 SQL 에서 가장 공통적으로 사용되는 것으로 where 의 일부로 포함될 수 있다.
--------------------------------------------------------------------------------
<select id=”findActiveBlogWithTitleLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test=”title != null”>
AND title like #{title}
</if>
</select>
 
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND author_name like #{author.name}
</if>
</select>
----------------------------------------------------------------------------------
- choose, when, otherwise
 
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test=”title != null”>
AND title like #{title}
</when>
<when test=”author != null and author.name != null”>
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
 
---------------------------------------------------------------------------------
- trim, where, set
 
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
WHERE
<if test=”state != null”>
state = #{state}
</if>
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND author_name like #{author.name}
 
</if>
</select>
 
어떤 조건에도 해당되지 않는다면 다음과 같은 SQL 이 만들어질 것이다.
(오류)
SELECT * FROM BLOG
WHERE
 
(오류)
SELECT * FROM BLOG
WHERE
AND title like ‘someTitle’
 
(수정된 코드)
<select id=”findActiveBlogLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
<where>
<if test=”state != null”>
state = #{state}
</if>
<if test=”title != null”>
AND title like #{title}
</if>
<if test=”author != null and author.name != null”>
AND author_name like #{author.name}
</if>
</where>
</select>
 
where 요소는 태그에 의해 컨텐츠가 리턴되면 단순히 “WHERE” 만을 추가한다. 
게다가, 컨텐츠가 “AND” 나 “OR” 로 시작한다면, 그 “AND” 나 “OR”를 지워버린다.
 
 
다음 예제는 동적인 update 구문의 유사한 경우이다.
set 요소는 update 하고자 하는 칼럼을 동적으로 포함시키기 위해 사용될 수 있다.
 
<update id="updateAuthorIfNecessary"
parameterType="domain.blog.Author">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>
 
여기서 set 요소는 동적으로 SET 키워드를 붙히고, 필요없는 콤마를 제거한다.
 
 
-----------------------------------------------------------------------------------
 
- foreach
동적 SQL 에서 공통적으로 필요한 것은 collection 에 대해 반복처리를 하는 것이다.
종종 IN 조건을 사용하게 된다. 
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
foreach 요소는 매우 강력하고 collection 을 명시하는 것을 허용한다. 
요소 내부에서 사용할 수 있는 item, index 두가지 변수를 선언한다.
이 요소는 또한 열고 닫는 문자열로 명시할 수 있고 반복간에 둘 수 있는 구분자도 추가할 수 있다.
 



































5. 수업

진도: 

hw: 


6. 할것


( ㅅ )

(  ㅅ  )

( ㅅ )


시험문젱네 콜바이밸류 콜바이 레퍼런스 나오나 -_-?

콜바이 밸류랑

콜바이 레퍼런스 뭔지 개수 찾기

'Programming' 카테고리의 다른 글

160613: 62회차  (0) 2016.06.13
160610: 61회차  (0) 2016.06.10
160608: 59회차  (0) 2016.06.08
160607: 58회차  (0) 2016.06.07
160603: 57회차  (0) 2016.06.03
Posted by DAVID
블로그 이미지

by DAVID

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • 더 보기

태그

글 보관함

«   2025/05   »
일 월 화 수 목 금 토
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

링크

카테고리

PC (112)
Programming (109)

카운터

Total
Today
Yesterday
방명록 : 관리자 : 글쓰기
DAVID's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

PC

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • PC (112)
    • Programming (109)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바