병갈이 블록

코드로배우는 - (초기설정)DB관련 설정들 본문

IT(Old)/Spring 공부 기록

코드로배우는 - (초기설정)DB관련 설정들

woojang 2017. 8. 7. 23:33

1. DB와 관련된 모듈을 모두 받는다. 

* mybatis-spring

* mybatis

* spring-jdbc

* log4jdbc-log4j2-jdbc4

* mysql-connector-java(MySql)

* ojdbc6(Oracle)

* commons-dbcp(Oracle)


2. root-context.xml파일 설정

** 필요한 namespace 추가.(context, jdbc, mybatis-spring)

1. Namespaces탭을 통해서 추가. - 간단히 클릭.

2. 직접 추가. 아래 코드를 <beans>태그의 속성으로 입력한다.

xmlns:context="http://www.springframework.org/schema/context"

xmlns:jdbc="http://www.springframework.org/schema/jdbc"

xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"

위 속성, 값을 등록 후 xsi:schemaLocation속성에 아래 경로 추가.

http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd

http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd


** dataSourcesqlSessionFactorysqlSession빈을 등록한다.

** 이때 sqlSessionFactory빈의 프로퍼티 값으로 mybatis 설정파일Mapper파일의 경로를 등록한다.

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"

p:driverClassName="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"    --MySql

p:url="jdbc:log4jdbc:mysql://localhost:3306/book_ex?useSSL=false&amp;serverTimezone=Asia/Seoul"    --Mysql

p:driverClassName="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"    --Oracle

p:url="jjdbc:log4jdbc:oracle:thin:@localhost:1521:SID"    --Oracle

p:username="hilu0318" p:password="hilu0318"

/>


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"

p:dataSource-ref="dataSource

p:configLocation="classpath:/mybatis-config.xml"               // mybatis 설정파일 경로

p:mapperLocations="classpath:/mappers/**/*Mapper.xml"    // Mapper파일들의 경로

/>


<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache"

c:sqlSessionFactory-ref="sqlSessionFactory"

/>


<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"

p:dataSource-ref="dataSource"

/>


3. 위에서 지정한 위치에 파일이름이 Mapper.xml로 끝나는 Mapper파일을 만든다.

* Mapper파일의 XML설정정보는 아래와 같다. 즉, 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">


** http://www.mybatis.org/mybatis-3/getting-started.html 이곳에서 모듈추가 및 설정정보를 얻을 수 있다.

* <mapper></mapper>태그 내부에 쿼리문을 작성한다.

- namaespace 속성을 가진다. 이 값은 DAO에서 이 Mapper를 지칭하는 이름이 된다. 패키지 형식으로 정한다.

(ex> namespace="org.hilu0318.mapper.BoardMapper" )

* 내부에는 insert, update, select 등의 쿼리문 명령어로 이루어진 태그들이 사용된다.

기본 속성으로 id를 가지고 반환데이터가 있는 경우 resultType속성도 작성한다.

*** 해당하는 쿼리문을 사용하려면 DAO에서 namespace.id 형태로 사용된다. 

*** 예> session.selectOne(namespace+".create", vo)

*** resultType의 경우 풀 클래스이름이 원칙이다. 

*** , mybatis-config.xml에 <configuration><typeAliases><package>태그의 name속성에 패키지 이름을 등록하면, 

패키지명은 생략가능하다. (등록된 패키지 내에 있는 클래스는 클래스이름만 사용할 수 있게 된다.)


4. Mapper의 사용.

- Mapper의 경로를 설정한 sqlSessionFactory의 빈을 받아 생성된 sqlSession빈을 이용한다.

- SqlSession클래스를 통해서 생성된 빈을 주입받는다.

- SqlSession객체에 query명령문으로 이루어진 메서드가 존재한다.

: 메서드의 이름과 실제 사용되는 Mapper내부의 query문은 동일한 명령문이어야 한다.

: 메서드의 매개변수는 ( namespace.id, 데이터 ) 이렇게 두가지다.

** namespace와 id

- 보통, namespace는 private final로 미리 선언 후 사용한다. id는 문자열로 직접 입력해주어야 한다. 

즉, 형태가 namespace.id형태가 되어야 하기에 namespace+".id" 형태로 입력한다.

** data

- data는 단일데이터사용이 가능하다.(기본자료형 및, 하나의 데이터객체)

두개 이상의 데이터를 사용하기 위해선 Map<String, Object>를 이용한다.

* String - Mapper에서 사용될 이름

* Object - 전달한 데이터 객체


- Mapper내부에서 사용되는 데이터 표현 언어. #{객체이름}

** EL식은 $로 시작하고 이건 #으로 시작한다.


5. MyBatis의 동적 SQL

아래의 표현식이 가능하다. 태그형태로 사용한다.( <if test.....> )

* if

* choose, when, otherwise

* trim, where, set

* foreach 

*** IF ***

<if test="title != null">

AND title like #{title}

</if>


*** choose, when, otherwise ***

<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>

// switch문과 비슷한 역할.

// when == case 

//  otherwise == default


*** trim, where, set ***    // 사용법이 살짝 이해가 안됨..영어로 되어있음;;

이 문법이 생긴 이유.

where까지 입력 후, 검색조건을 if문으로 결정한다고 했을때 검색조건에 부합하는 데이터가 없으면

Query문은 where로 끝이난다. 이것은 에러.

중간에 and로 시작하는 if문만 선택되었다면? where and로 이어져 에러 발생. 이러한 일을 막고자...

1. where문이 필요할 때. prefixOverrides속성을 사용.

<trim prefix="WHERE" prefixOverrides="AND |OR ">

  ...

</trim>

2. set문이 필요할 때. suffixOverrides속성을 사용.

<trim prefix="SET" suffixOverrides=",">

  ...

</trim>


*** foreach *** 

<foreach item="item" index="index" collection="list" open="(" separator="," close=")">

#{item}

</foreach>

- 동적 SQL의 별도 관리.

* <sql id=""></sql>반복되는 구문을 하나의 묶음으로 만들 수 있다.

* 사용하려면 sql태그 내부에서 <include refid=" i"></include>로 사용 가능하다.

Comments