웹_프론트_백엔드/JAVA프레임윅기반_풀스택

2020.07.01

shine94 2020. 7. 1. 09:06

1. MyBatis의 Mapper(Java 객체와 SQL 연동)
 : MyBatis에서 Mapper 역할을 하는 매핑파일(XML)은 데이터 조작을 하는 객체와 쿼리(SQL)를 연결(mapping),

   데이터 조작을 하는 객체는 일반적으로 DAO객체가 그 역할을 하고 있다.

** DAO는 인터페이스로만 주어지고,  MyBatis가 DAO를 구현해준다.

 

** <mappper>는 어느 DAO에 매핑될지 지정, <mapper>는 여러 <SQL세팅>으로 구성 가능 

 

** 각 <SQL세팅>은 DAO의 어느 메소드에 매핑될지 지정

 

 

2. MyBatis x 스프링 설정 파일

 : MyBatis를 스프링과 같이 사용하려면, 컨텍스트(컨테이너)에 두 가지 필요  

 

1) SqlSessionFactory 정의
 : MyBatis 스프링 연동 모듈에서는 SqlSessionFactoryBean을 설정 -> 구현 가능함

2) Mapper 정의
[방법1] 매퍼 interface + MapperFactoryBean 사용

[방법2] XML 파일로 Mapper 세팅

 

 

3. SqlSession은 매번 가져와서 사용해야 한다.

   왜? SqlSession은 종료되면 자동적으로 닫히기 때문에

 

   [처음] IWriteDAO dao = sqlSession.getMapper(IWriteDAO.class);

   [필요할 때마다] dao = sqlSession.getMapper(IWriteDAO.class);

 

 

4. STS15_MyBatis

** src > main > webapp > WEB-INF > spring > sppServlet > servlet-context.xml

<?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.lec.sts15_mybatis" />
	
	
	<!-- spring-jdbc 빈 객체 생성 -->
	<!-- DataSource 객체 -->
	<beans:bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<beans:property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<beans:property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
		<beans:property name="username" value="scott0316"/>
		<beans:property name="password" value="tiger0316"/>
	</beans:bean>
	
	<!-- MyBatis 설정 -->
	<!-- SqlSessionFactoryBean 생성  -->
	<beans:bean name="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<beans:property name="dataSource" ref="dataSource"/>
		<beans:property name="mapperLocations" value="classpath:com/lec/sts15_mybatis/mapper/*.xml"/>
	</beans:bean>
	<!-- SqlSessionTemplate 생성 -->
	<beans:bean name="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<beans:constructor-arg index="0" ref="SqlSessionFactory"/>
	</beans:bean>
	
</beans:beans>

 

** [src/main/java] com.lec.sts15_mybatis.board.controller > BoardController.java

package com.lec.sts15_mybatis.board.controller;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.BWriteDTO;
import com.lec.sts15_mybatis.board.command.BCommand;
import com.lec.sts15_mybatis.board.command.BDeleteCommand;
import com.lec.sts15_mybatis.board.command.BListCommand;
import com.lec.sts15_mybatis.board.command.BSelectCommand;
import com.lec.sts15_mybatis.board.command.BUpdateCommand;
import com.lec.sts15_mybatis.board.command.BViewCommand;
import com.lec.sts15_mybatis.board.command.BWriteCommand;

@Controller
@RequestMapping("/board")
public class BoardController {

	private BCommand command;
	
	// MyBatis
	private SqlSession sqlSession;
	
	public BoardController() {
		super();
		System.out.println("BoardController() 생성");
	}
	
	@Autowired
	public final void setSqlSession(SqlSession sqlSession) {
		this.sqlSession = sqlSession;
		C.sqlSession = sqlSession;
	}

	@RequestMapping("/list.do")
	public String list(Model model) {
		command = new BListCommand();
		command.execute(model);
		return "board/list";
	}
	
	@RequestMapping("/write.do")
	public String write(Model model) {
		return "board/write";
	}
	
	@RequestMapping(value = "/writeOk.do", method = RequestMethod.POST)
	public String writeOk(BWriteDTO dto, Model model) {
		model.addAttribute("dto", dto);
		new BWriteCommand().execute(model);
		return "board/writeOk";
	}
	
	@RequestMapping("/view.do")
	public String view(int uid, Model model) {
		model.addAttribute("uid", uid);
		new BViewCommand().execute(model);
		return "board/view";
	}
	
	@RequestMapping("/update.do")
	public String update(int uid, Model model) {
		model.addAttribute("uid", uid);
		new BSelectCommand().execute(model);
		return "board/update";
	}
	
	@RequestMapping(value = "/updateOk.do", method = RequestMethod.POST)
	public String updateOK(BWriteDTO dto, Model model) {
		model.addAttribute("dto", dto);
		new BUpdateCommand().execute(model);
		return "board/updateOk";
	}
	
	@RequestMapping("/deleteOk.do")
	public String deleteOk(int uid, Model model) {
		model.addAttribute("uid", uid);
		new BDeleteCommand().execute(model);
		return "board/deleteOk";
	}
	
}

 

** [src/main/java] com.lec.sts15_mybatis.board > C.java

package com.lec.sts15_mybatis.board;

import org.apache.ibatis.session.SqlSession;

public class C {
	// MyBatis 용 SQLSession
	public static SqlSession sqlSession;
}

 

** [src/main/java] com.lec.sts15_mybatis.board.beans > IWriteDAO.java

<?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.lec.sts15_mybatis.board.beans.IWriteDAO">
	<!-- list.do -->
	<select id="select" resultType="com.lec.sts15_mybatis.board.beans.BWriteDTO">
			SELECT 
				wr_uid "uid", 
				wr_subject subject,
				wr_content content, 
				wr_name name, 
				wr_viewcnt viewcnt,
				wr_regdate regdate 
			FROM 
				test_write 
			ORDER BY 
				wr_uid DESC
	</select>
	
	<!-- view.do -->
	<select id="selectByUid" resultType="com.lec.sts15_mybatis.board.beans.BWriteDTO">
		SELECT 
			wr_uid "uid", wr_subject subject, wr_content content, wr_name name, 
			wr_viewcnt viewcnt, wr_regdate regDate 
		FROM test_write 
		WHERE wr_uid=#{uid}
	</select>
	<!-- 조회수 증가 -->
	<update id="incViewCnt" flushCache="true">
		UPDATE test_write 
		SET wr_viewcnt = wr_viewcnt + 1 
		WHERE wr_uid = #{param1}
	</update>
	
	<update id="update" flushCache="true" 
		parameterType="com.lec.sts15_mybatis.board.beans.BWriteDTO">
		UPDATE test_write 
		SET wr_subject = #{subject}, wr_content = #{content} 
		WHERE wr_uid = #{uid}
	</update>
	
	<!-- delete.do -->
	<delete id="deleteByUid" flushCache="true">
		DELETE FROM test_write WHERE wr_uid = #{uid}
	</delete>
</mapper>

 

** [src/main/java] com.lec.sts15_mybatis.board.beans > IWriteDAO2.java

<?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.lec.sts15_mybatis.board.beans.IWriteDAO">
	<!-- write -->
	<!-- 
	<insert id="insert" flushCache="true"
		parameterType="com.lec.sts15_mybatis.board.beans.BWriteDTO">
		INSERT INTO test_write
			(wr_uid, wr_subject, wr_content, wr_name)
		VALUES
			(test_write_seq.nextval, #{subject}, #{content}, #{name})	
	</insert>
	-->
	<insert id="insert" flushCache="true">
		INSERT INTO test_write
			(wr_uid, wr_subject, wr_content, wr_name)
		VALUES
			(test_write_seq.nextval, #{param1}, #{param2}, #{param3})	
	</insert>
</mapper>

 

** [src/main/java] com.lec.sts15_mybatis.board.command > BListCommand.java

package com.lec.sts15_mybatis.board.command;

import java.util.List;

import org.springframework.ui.Model;

import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.*;

public class BListCommand implements BCommand {

	@Override
	public void execute(Model model) {
//		BWriteDAO dao = new BWriteDAO();
//		List<BWriteDTO> list = dao.select();
//		model.addAttribute("list", list);
		
		// MyBatis 사용
		IWriteDAO dao = C.sqlSession.getMapper(IWriteDAO.class);
		model.addAttribute("list", dao.select());
		
	} // end execute()

} // end Command

 

** [src/main/java] com.lec.sts15_mybatis.board.command > BWriteCommand.java

package com.lec.sts15_mybatis.board.command;

import java.util.Map;

import org.springframework.ui.Model;

import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.BWriteDTO;
import com.lec.sts15_mybatis.board.beans.IWriteDAO;

public class BWriteCommand implements BCommand {

	@Override
	public void execute(Model model) {
		// Model 안에 있는 값(attribute) 꺼내기
		Map<String, Object> map= model.asMap();
		BWriteDTO dto = (BWriteDTO)map.get("dto");
		
//		BWriteDAO dao = new BWriteDAO();
//		int result = dao.insert(dto);
//		model.addAttribute("result", result);
		
		// MyBatis 사용
		IWriteDAO dao = C.sqlSession.getMapper(IWriteDAO.class);
		//model.addAttribute("result", dao.insert(dto));
		model.addAttribute("result", 
			dao.insert(dto.getSubject(), dto.getContent(), dto.getName()));
	} // end execute

} // end Command

 

** [src/main/java] com.lec.sts15_mybatis.board.command > BViewCommand.java

package com.lec.sts15_mybatis.board.command;

import java.util.Arrays;
import java.util.Map;

import org.springframework.ui.Model;

import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.BWriteDTO;
import com.lec.sts15_mybatis.board.beans.IWriteDAO;

public class BViewCommand implements BCommand {

	@Override
	public void execute(Model model) {
		Map<String, Object> map = model.asMap();
		int uid = (Integer)map.get("uid");
		
//		BWriteDAO dao = new BWriteDAO();
//		BWriteDTO dto = dao.readByUid(uid);
//		model.addAttribute("list", Arrays.asList(dto));
		
		// Arrays.asList(new String[]{"aaa", "bbb"})
		// Arrays.asList("aaa", "bbb")
		
		// MyBatis 사용
		IWriteDAO dao = C.sqlSession.getMapper(IWriteDAO.class);
		dao.incViewCnt(uid); // 조회수 증가
		
		BWriteDTO dto = dao.selectByUid(uid);  // 똑똑하게 BWriteDTO 를 리턴한다.
		model.addAttribute("list", Arrays.asList(dto));
		
	} // end execute()

} // end Command

 

** [src/main/java] com.lec.sts15_mybatis.board.command > BSelectCommand.java

package com.lec.sts15_mybatis.board.command;

import java.util.Arrays;
import java.util.Map;

import org.springframework.ui.Model;

import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.BWriteDTO;
import com.lec.sts15_mybatis.board.beans.IWriteDAO;

public class BSelectCommand implements BCommand {

	@Override
	public void execute(Model model) {
		Map<String, Object> map = model.asMap();
		int uid = (Integer)map.get("uid");
		
//		BWriteDAO dao = new BWriteDAO();
//		BWriteDTO dto = dao.selectByUid(uid);
//		model.addAttribute("list", Arrays.asList(dto));
		
		IWriteDAO dao = C.sqlSession.getMapper(IWriteDAO.class);
		BWriteDTO dto = dao.selectByUid(uid);
		model.addAttribute("list", Arrays.asList(dto));
		
	} // end execute()

} // end Command

 

** [src/main/java] com.lec.sts15_mybatis.board.command > BUpdateCommand.java

package com.lec.sts15_mybatis.board.command;

import java.util.Map;

import org.springframework.ui.Model;

import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.BWriteDTO;
import com.lec.sts15_mybatis.board.beans.IWriteDAO;

public class BUpdateCommand implements BCommand {

	@Override
	public void execute(Model model) {
		Map<String, Object> map = model.asMap();
		BWriteDTO dto = (BWriteDTO)map.get("dto");
		
//		BWriteDAO dao = new BWriteDAO();
//		int cnt = dao.update(dto);
//		model.addAttribute("result", cnt);
		
		IWriteDAO dao = C.sqlSession.getMapper(IWriteDAO.class);
		model.addAttribute("result", dao.update(dto));
		
	} // end execute()

} // end Command

 

** [src/main/java] com.lec.sts15_mybatis.board.command > BDeleteCommand.java

package com.lec.sts15_mybatis.board.command;

import java.util.Map;

import org.springframework.ui.Model;

import com.lec.sts15_mybatis.board.C;
import com.lec.sts15_mybatis.board.beans.IWriteDAO;

public class BDeleteCommand implements BCommand {

	@Override
	public void execute(Model model) {
		Map<String, Object> map = model.asMap();
		int uid = (Integer)map.get("uid");
		
//		BWriteDAO dao = new BWriteDAO();
//		int cnt = dao.deleteByUid(uid);
//		model.addAttribute("result", cnt);

		IWriteDAO dao = C.sqlSession.getMapper(IWriteDAO.class);	
		model.addAttribute("result", dao.deleteByUid(uid));
		
	} // end execute

} // end Command

 

 

6. MyBatis 버전으로 완성되면 아래의 코드 및 클래스를 삭제해도 작동 가능하다

1) com.lec.sts15_mybatis.board > BWriteDAO 클래스 삭제 가능


2) com.lec.sts15_mybatis.board.controller > BoardController 컨트롤러에서 사용하던 JdbcTemplate 변수 삭제 가능


3) com.lec.sts15_mybatis.board > C.java에서 사용하던 JdbcTemplate 변수 삭제 가능


4) src > main > webapp > WEB-INF > spring > sppServlet > Servletservlet-context.xml

   설정파일의 JdbcTemplate 빈 설정 삭제 가능


5) com.lec.sts15_mybatis.board > C.java의 쿼리문 모두 삭제 가능

'웹_프론트_백엔드 > JAVA프레임윅기반_풀스택' 카테고리의 다른 글

2020.07.03  (0) 2020.07.03
2020.07.02  (0) 2020.07.02
2020.06.30  (0) 2020.06.30
2020.06.29  (0) 2020.06.29
2020.06.23  (0) 2020.06.23