본문 바로가기

Spring 3.0 - 4.3

MyBatis를 이용한 게시판 만들기

1탄. JDBC - SPRING DAO로 게시판 만들기 (spring dao)
2탄. JDBC - MyBatis로 게시판 만들기 (spring + mybatis)

 

 

(1탄 Spring DAO로 게시판 만든 프로젝트 그대로 copy해와서 사용)

프로젝트 복사해와서 새 프로젝트 작업 시 체크 사항

- tomcat add and remove

- app-context.xml에  base-package 명 바꿔주기

- 프로젝트 우클릭 > properties > web project settings 바꿔주기

 

 

프로젝트명: SpringwebMybatis / 패키지명: com.jdbc.springweb

1. pom.xml 추가

		<!-- mybatis -->
		<dependency>
  			 <groupId>org.mybatis</groupId>
   			 <artifactId>mybatis</artifactId>
    		<version>3.4.6</version>
		</dependency>
		
		<!-- mybatis spring -->
		<dependency>
   			 <groupId>org.mybatis</groupId>
   			 <artifactId>mybatis-spring</artifactId>
   			 <version>1.3.2</version>
		</dependency>	

-> 새로 build 되는게 아니라, 이전의 프로젝트에서 이미 lib들이 .m2 폴더에 다운받아져있기 때문에 저장된 lib들에 mybatis 관련 lib를 추가시키는 형태로 작업이 일어남

 

 

2.  servlet-context.xml

IOC 흐름

dataSource -> sessionFactory -> sessionTemplate -> BoardDAO3 에서 가져다 씀 

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<context:component-scan base-package="com.jdbc.springweb" />
	
	
	<beans:bean id="boardDAO3" class="com.jdbc.dao.BoardDAO3">
		<beans:property name="sessionTemplate" ref="sessionTemplate"/>
	</beans:bean>
	
	<beans:bean id="sessionTemplate"
	class="org.mybatis.spring.SqlSessionTemplate">
		<beans:constructor-arg ref="sessionFactory"/>
	</beans:bean>
	
    <!-- DB(jdbc)정보와 MyBatis환경세팅(mybatis-config.xml)을 가지고와서 Factory 생성 -->
	<beans:bean id="sessionFactory"
	class="org.mybatis.spring.SqlSessionFactoryBean">
		<beans:property name="dataSource" ref="dataSource" />
		<beans:property name="configLocation" value="classpath:/mybatis-config.xml"/>
	</beans:bean>
	<!-- mybatis-config.xml이 특정 패키지 안에 있는게 아니므로 경로 그냥 써줘도 됨 (SpringMyBatis 프로젝트 참고) -->
	
	
	<!-- DB정보 -->
	<beans:bean  id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<beans:property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> 
		<beans:property name="url" value="jdbc:oracle:thin:@192.168.16.14:1521:TestDBB"/>
		<beans:property name="username" value="suzi"/> 
		<beans:property name="password" value="a123"/>
	</beans:bean>
    
    	<!-- thin: 가장최소한의방법으로빠르게접근하는법 port번호,ip,TestDBB로 접근 -->
	<!-- class=~ 이 위치에 db관련 라이브러리가 있음
	그 곳에 p:~~ 를 통해 입력한 내 db값들은 전달해줘서
	dataSource라는 객체를 생성하는 과정 --> 
	
	<!-- db의연결자를알고있어야 DAO가 db한테 접근 가능 
	 ->  DAO에 setter 메소드 만들고 의존성 주입시킬거란걸 예상 가능 -->
	
	<beans:bean id="myUtil" class="com.jdbc.util.MyUtil"/>
	
</beans:beans>

 

3. mybatis-config.xml

mybatis사용하려면 mybatis 환경설정 파일 필요

(참고) SpringMyBatis 프로젝트는 콘솔 프로젝트여서 java파일들과 같은 경로에 넣었지만 

SpringwebMyBaits 프로젝트는 Web MVC 프로젝트 이므로 src/main/java에 떨궈서 모든 패키지에 적용 될 수 있도록 한 것

 

SpringMyBatis 프로젝트의 mybatis-config.xml 위치

 

 


myBatis-config.xml를 새로 추가했기 때문에, servlet-config.xml 의 Factory한테 정보를 넘겨준 것

myBatis부터는 CommonDAO, CommonDAOImpl 같은게 필요 없어짐 -> mapper가 생김

Spring3.0에서는 boardMapper.xml -> 이런 파일을 sqlMapper라고 한다. 여기다가 select, insert, delete문을 넣는 것

 

configuration태그 안에 있는건 사실 Spring3.0 에서는 기재하지 않아도 된다.  (mapper 설정 부분은 3.0에서도 써줘야함)
이미 servlet-context.xml에서 단계에서 myBatis 가져오는건 완료되기 때문
★ myBatis를 다른프레임워크에서 갖다쓸 때, configuration 태그 내용을 꼭 넣어줘야한다 (알아두기!!)
(ex. spring과 struts2를 함께 쓰는경우)

 

 

<?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>
		<property name="driver"	value="oracle.jdbc.driver.OracleDriver"/>
		<property name="url" value="jdbc:oracle:thin:@192.168.16.14:1521:TestDBB"/>
		<property name="username" value="suzi"/>
		<property name="password" value="a123"/>	
	</properties>
	
	<environments default="development">
		<environment id="development">
		<transactionManager type="JDBC"/>
		
		<!-- 위의 db정보를 불러다 쓰는것 -->
		<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>

<!-- spring에서 이걸 가져다 쓸 수 있게 servlet-context.xml 에 등록 -->
<mappers>
	<mapper resource="com/jdbc/mybatis/boardMapper.xml"/>
</mappers>	
	
</configuration>

 

4. boardMapper.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="boardmapper">

<select id="maxNum" resultType="int">
	select nvl(max(num,0) from board
</select>

<insert id="insertData" parameterType="com.jdbc.dto.BoardDTO">
	insert into board(num,name,pwd,email,subject,content,
	ipAddr,hitCount,created) values(#{num},#{name},#{pwd},#{email},
	#{subject},#{content},#{ipAddr},0,sysdate)	
</insert>

<select id="getDataCount" parameterType="map" resultType="int">
	select nvl(max(num,0) from board 
	where ${searchKey} like '%' || #{searchValue} || '%'
</select>

<select id="getLists" parameterType="map" resultType="com.jdbc.dto.BoardDTO">
	select * from (
	select rownum rnum, data.* from(
	select num,name,subject,hitCount,
	to_char(created,'YYYY-MYY-DD') created
	from board where ${searchKey} like '%' || #{searchValue} || '%'	
	order by num desc) data)
<![CDATA[
	where rnum>=#{start} and rnum<=#{end}	
]]>
	))	
</select>

<update id="updateHitCount" parameterType="int">
	update board set hitCount = hitCount+1 where num=#{num}
</update>

<select id="getReadData" parameterType="int" resultType="com.jdbc.dto.BoardDTO">
	select num,name,pwd,email,subject,content,ipAddr,hitCount,created
	from board
	where num=#{num}
</select>

<update id="updateData" parameterType="com.jdbc.dto.BoardDTO">
	update board set name=#{name},pwd=#{pwd},email=#{email},subject=#{subject},
	content=#{content} where num=#{num}
</update>

<delete id="deleteData" parameterType="int">
	delete baord where num=#{num}
</delete>

</mapper>

 

5. BoardDTO

package com.jdbc.dto;

public class BoardDTO {
	
	private int num;
	private String name,pwd,email,subject,content,ipAddr,created;
	private int hitCount;
    
    //getter,setter
    }

 

6. BoardDAO

package com.jdbc.dao;

import java.util.HashMap;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import com.jdbc.dto.BoardDTO;


public class BoardDAO3 {

	private SqlSessionTemplate sessionTemplate;

	public void setSessionTemplate(SqlSessionTemplate sessionTemplate)
			throws Exception {
		this.sessionTemplate = sessionTemplate;


	} 
	public int getMaxNum(){

		int maxNum = 0;
		
		maxNum =
				sessionTemplate.selectOne("boardmapper.maxNum");
		
		return maxNum;

	}

	public void insertData(BoardDTO dto){
		
		sessionTemplate.insert("boardmapper.insertData",dto);

	}


	public List<BoardDTO> getList(int start, int end,
			String searchKey, String searchValue){

		HashMap<String, Object> params = 
				new HashMap<String, Object>();
		
		params.put("start",start);
		params.put("end",end);
		params.put("searchKey",searchKey);
		params.put("searchValue",searchValue);
		
		List<BoardDTO> lists =
				sessionTemplate
				.selectList("boardmapper.getLists",params);
		
		return lists; 

	}


	public int getDataCount(String searchKey,String searchValue){
		

		HashMap<String, Object> params = 
				new HashMap<String, Object>();
		
		params.put("searchKey",searchKey);
		params.put("searchValue",searchValue);
		
		int result = 
				sessionTemplate
				.selectOne("boardmapper.getDataCount", params);
		
		return result;
		
	}

	
	public void updateHitCount(int num){

		sessionTemplate
		.update("boardmapper.updateHitCount",num);
		
		

	}

	public BoardDTO getReadData(int num){
		
		BoardDTO dto =
				sessionTemplate
				.selectOne("boardmapper.getReadData", num);
		
		return dto; 

	}

	
	public void deleteData(int num){
		
		sessionTemplate
			.update("boardmapper.deleteData",num);

	}


	public void updateData(BoardDTO dto){

		sessionTemplate
		.update("boardmapper.updateData",dto);
		
	}

}