경제학도의 개발공간
[20180503]Mybatis WIth Spring 본문
Mybatis는 일반 Web Project에서 사용하는 방법과 Spring에서 사용하는 방법에 차이가 있다. 이번에는 Spring에서 사용하는 방법에 대해 학습한다.
Mybatis Spring을 사용하기 위해 Pom.xml에 다음을 추가한다
1 2 3 4 5 6 7 8 9 10 | <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <repositories> <repository> <id>oracle</id> <name>ORACLE JDBC Repository</name> <url>http://maven.jahia.org/maven2</url> </repository> </repositories> ========================================= <!-- oracle jdbc 기존 dependency는 지우면 된다.--> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>12.1.0.1</version> <scope>runtime</scope> </dependency>Colored by Color Scripter | cs |
root-context설정
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- DB연결 설정 --> <bean id="driverManagerDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE" /> <property name="username" value="springuser" /> <property name="password" value="1004" /> </bean> <!-- Mybatis 설정 기본 자바코드 : SqlMapConfig.xml 에서 설정했던 작업 (DB연결 ,mapper 설정) 파일 없어지고 설명파일안에서 > SqlSessionFactoryBean 기존 java 코드 : builder 사용 > Factory 객체 생성 > sqlsession 생성 > 사용 두개의 클래스가 위 작업 처리 SqlSessionFactoryBean SqlSessionTemplate --> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="driverManagerDataSource"></property> <property name="mapperLocations" value="classpath*:kr/co/mycom/model/mapper/*xml" /> </bean> <!-- DAO단에서 private SqlSessionFactory factory; public GuestDAO(){ factory = SqlSessionFactoryService.getSqlSession(); } public void print(){ session = factory.openSession() } 과 같은 기능을 하는 것이 아래의 코드 이때 가장 큰 차이점은 일반 Web Proeject때와 달리 SqlSession객체를 Singleton(즉, static)으로 관리한다. >> 다시 Ibatis처럼 회귀하였다. --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactoryBean" /> </bean> </beans> | cs |
DTO > DAO > Mapper 순으로 코드를 작성해라. 이때 DAO는 interface로 생성하여 세부적인 내용은 작성하지 않는다.
이후 Mapper를 작성할 때, Mapper의 spacename과 DAO의 이름을 똑같이 설정하고 DAO의 함수 이름과 SQL 태그 Element의 ID를 일치시키면 controller에서 Mapper와 DAO를 자동으로 맵핑하도록 설정함으로써 DAO Interface를 구현하지 않고, 다음과 같이 편하게 사용할 수 있다.
DAO Interface
1 2 3 4 | public interface BoardDAO { //메서드 정의 //CRUD 기반 int insertBoard(BoardDTO dto); | cs |
Mapper
mapper를 위한 xml 설정
1 2 3 | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | cs |
1 2 3 | <mapper namespace="kr.co.mycom.model.BoardDAO"> <!-- insertBoard(글 입력하기) --> <insert id="insertBoard" parameterType="kr.co.mycom.model.BoardDTO"> | cs |
parameterType 은 parameter가 한 개일 경우 생략이 가능하다.
만약 2개 이상일 경우라면 ?
1. DTO Type으로 받으면 된다.
2. HashMap의 형태로 받으면 된다. 혹시 이 과정이 귀찮다면 다른 방법을 활용할 수 있다.
예를들어 다음과 같은 경우를 생각해 보자
getCount(String field, String query)
이때 , String field >> parma1, String query >> param2 가 된다. 순서가 매우 중요하다. 주의할점은 이러한 문법은 Parameter가 두개 이상일 때만 가능하다는 점!! 하나일 때는 적용되지 않는다.
1 2 3 4 5 6 7 | <mapper namespace= "dao.NoticeDao"> <select id ="getCount" resultType="Integer" > SELECT COUNT(*) CNT FROM NOTICES WHERE ${param1} Like'%${param2}%' </select> </mapper> | cs |
만약 parameter를 함수 내부에서 로직처리를 해 값을 변경한 후 쿼리문에 사용하고 싶다면??
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <select id="getNotices" resultType="vo.Notice"> <!-- parameter를 로직처리를 통해 변화시킨 후 쿼리에 적용하는 경우 public List<Notice> getNotices(int page, String field, String query) throws ClassNotFoundException, SQLException { int srow = 1 + (page-1)*5; int erow = 5 + (page-1)*5; return할 값이 한건 이상일 경우 >> List(Notice) 한건일 경우 >> Notice 리턴 --> SELECT * FROM (SELECT ROWNUM NUM, N.* FROM (SELECT * FROM NOTICES WHERE ${param2} LIKE '%${param3}%' ORDER BY REGDATE DESC) N) WHERE NUM BETWEEN 1 + (${param1}-1)*5 AND 5 + (${param1}-1)*5 </select> | cs |
Controller
1 2 3 4 5 6 7 8 9 10 11 | @RequestMapping("/write.htm") public String write(BoardDTO dto) { // 핵심 (KEY POINT) // sqlsession.insert(arg0); BoardDAO boardDao = sqlsession.getMapper(BoardDAO.class); // mapper xml 파일과 DAO interface 동기화 // 인터페이스가 가지는 자원은 실행 : mapper 가 실행 // 전제 : 1. namespace , 2. id=method boardDao.insertBoard(dto); return "redirect:/list.htm"; } | cs |
'BackEnd > Spring' 카테고리의 다른 글
Spring Ajax 배열파라미터 전달 & Mybatis foreach (0) | 2018.06.19 |
---|---|
[20180510]Spring 비동기처리 (0) | 2018.05.10 |
[20180503]Mybatis (0) | 2018.05.03 |
[20180425]AOP(Aspect Oriented Programming) (0) | 2018.05.02 |
[20180501]HandlerInterceptor (0) | 2018.05.01 |