아무튼 개발
article thumbnail
반응형

 

MyBatis

 

지난 스프링 JDBC에 이어 오늘은 스프링에 MyBatis를 연동하는 방법을 알아보겠다.

 

전통적인 JDBC에 비해 마이바티스는 비효율적인 반복을 줄일 수 있다.

마이바티스는 DAO 객체와 SQL문을 맵핑해주는 프레임워크이다.

 

먼저 마이바티스를 연동하기 위해 라이브러리를 추가한다.

 

pom.xml

	   <!-- mybatis -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis</artifactId>
		    <version>3.5.9</version>
		</dependency>
				   
		<!-- mybatis-spring -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>1.3.3</version>
		</dependency>

 

지난 스프링 JDBC 라이브러리 입력에 이어서

pom.xml에 Mybatis와 스프링을 연동할 수 있도록 라이브러리를 추가해주었다.

 

 

servlet-context

<beans:beans>
	<beans:bean id="boardDAO2" class="com.jdbc.dao.BoardDAO2">
		<beans:property name="sessionTemplate" ref="sessionTemplate"/>
	</beans:bean>
	
	<beans:bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<beans:constructor-arg ref="sessionFactory"/>
	</beans:bean>
	
	<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>	
	
	<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:@IP주소:포트번호:xe"/>
		<beans:property name="username" value="유저이름"/>
		<beans:property name="password" value="비밀번호"/>
	</beans:bean>
	 
</beans:beans>

 

소스를 밑에서부터 살펴보겠다.

dataSource는 DB의 위치 정보를 입력해주는 곳이다. 이전에도 계속 설명했으므로 생략하겠다.

 

SqlSessionFactoryBean은 dataSource와 configLocation을 합쳐서 데이터 생성하는 것이다.

또한 SqlSessionTemplate은 SqlSessionFactoryBean을 생성자로 참조한다.

사용자가 입력한 SQL문을 만들어 결과를 얻어낼 수 있게 된다.

 

boardDAO2에 입력한 sql문을 가져와 실행할 수 있도록 의존성 주입을 해준다.

 

 

mybatis-config.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>
	<mappers>
		<mapper resource="com/jdbc/mybatis/boardMapper.xml"/>
	</mappers>
</configuration>

 

xml을 통해 Mapper을 입력할 것이다.

boardMapper는 sql을 입력하는 곳으로 mapper에서 파일 경로를 입력해준다.

 

 

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

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

 

SQL문을 입력해주는 곳이다. 

 

namespace는 다른 곳에서 sql문을 쓸 때 설정한 이름으로 입력해주는 것이다.

 

사용자가 입력할 값은 #{}으로 입력해줘야 한다.

위의 sql문을 값을 입력하는 insert와 값을 가져오는 select문이다.

CDATA는 괄호와 같은 특수문자를 문자열로 인식할 수 있도록 설정해준다.

 

 

BoardDAO2

public class BoardDAO2 {
	
	private SqlSessionTemplate sessionTemplate;
	
	public void setSessionTemplate(SqlSessionTemplate sessionTemplate){
		this.sessionTemplate = sessionTemplate;		
	}
	
	//입력
	public void insertData(BoardDTO dto) {		
		sessionTemplate.insert("com.boardMapper.insertData",dto);		
	}
    
    //전체데이터
	public List<BoardDTO> getLists(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("com.boardMapper.getLists",params);
				
		return lists;		
	}

 

DAO는 값을 넘겨받는다.

SqlSessionTemplate을 생성자를 통한 의존성 주입을 해줘서 사용하도록 한다.

 

insert의 경우 매개변수를 dto로 받아

받은 값을 sessionTemplate의 insert메소드를 호출하여 위에 입력한 sql문에 값을 넣어준다

com.boardMapper는 namespace에서 지정한 이름이다.

 

list의 경우 반환 타입이 List이다.

매개변수가 총 4개이며 각각 타입이 다르기 때문에 object로 데이터를 넣어준다.

따라서 params에 put을 통해 넣어서 sql문으로 결과값을 가져오게 된다.

 

 

 

이후에 웹페이지 출력을 위해 추가로 JSP파일에서 값을 입력하고 출력하는 양식을 만들면

데이터가 제대로 넘어가서 실행되는 것을 알 수 있다!

 

3월 29일 화요일 수업 🌕
반응형
profile

아무튼 개발

@릴쥬

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...