TIL/MyBatis

[MyBatis] crud-xmlconfig

yndev 2022. 3. 14. 21:44

JDBC에서 crud를 해줬듯이, MyBatis에서도 crud를 수행해보자. 

 

프로젝트 Properties-java Build Path에서 Libraries, Source 추가 해준다.

 

Template생성

package com.greedy.section02.xmlconfig;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Template {

	private static SqlSessionFactory sqlSessionFactory;
	
	public static SqlSession getSqlSession() {
		
		if(sqlSessionFactory == null) {
			String resource = "com/greedy/section02/xmlconfig/mybatis-config.xml";
			
			try {
				InputStream inputStream = Resources.getResourceAsStream(resource);
				sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return sqlSessionFactory.openSession(false);
	}
	
}

 

mybatis-config.xml파일 생성

 

menu-mapper.xml파일 생성

 

Application

package com.greedy.section01.xmlconfig;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Application {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		MenuController menuController = new MenuController();
		
		do {
			System.out.println("===== 메뉴 관리 =====");
			System.out.println("1. 메뉴 전체 조회");
			System.out.println("2. 메뉴 코드로 메뉴 조회");
			System.out.println("3. 신규 메뉴 추가");
			System.out.println("4. 메뉴 수정");
			System.out.println("5. 메뉴 삭제");
			System.out.print("메뉴 관리 번호를 입력하세요 : ");
			int no = sc.nextInt();
			
			switch(no) {
			case 1 : menuController.selectAllMenu(); break;
			case 2 : menuController.selectMenuByCode(inputMenuCode()); break;
			case 3 : menuController.registMenu(inputMenu()); break;
			case 4 : menuController.modifyMenu(inputModifyMenu()); break;
			case 5 : menuController.deleteMenu(inputMenuCode()); break;
			default : System.out.println("잘못 된 메뉴를 선택하셨습니다.");
			}
			
		} while(true);
	}
	
	private static Map<String, String> inputMenuCode(){
		Scanner sc = new Scanner(System.in);
		System.out.print("메뉴 코드를 입력하세요 : ");
		String code = sc.nextLine();
		
		Map<String, String> parameter = new HashMap<>();
		parameter.put("code", code);
		
		return parameter;
	}
	
	private static Map<String, String> inputMenu(){
		Scanner sc = new Scanner(System.in);
		System.out.print("메뉴 이름을 입력하세요 : ");
		String name = sc.nextLine();
		System.out.print("메뉴 가격을 입력하세요 : ");
		String price = sc.nextLine();
		System.out.print("카테고리 코드를을 입력하세요 : ");
		String categoryCode = sc.nextLine();
		
		Map<String, String> parameter = new HashMap<>();
		parameter.put("name", name);
		parameter.put("price", price);
		parameter.put("categoryCode", categoryCode);
		
		return parameter;
	}
	
	private static Map<String, String> inputModifyMenu(){
		Scanner sc = new Scanner(System.in);
		System.out.print("수정할 메뉴 코드를 입력하세요 : ");
		String code = sc.nextLine();
		System.out.print("수정할 메뉴 이름을 입력하세요 : ");
		String name = sc.nextLine();
		System.out.print("수정할 메뉴 가격을 입력하세요 : ");
		String price = sc.nextLine();
		System.out.print("수정할 카테고리 코드를을 입력하세요 : ");
		String categoryCode = sc.nextLine();
		
		Map<String, String> parameter = new HashMap<>();
		parameter.put("code", code);
		parameter.put("name", name);
		parameter.put("price", price);
		parameter.put("categoryCode", categoryCode);
		
		return parameter;
	}

}

 

MenuController

package com.greedy.section01.xmlconfig;

import java.util.List;
import java.util.Map;

public class MenuController {
	
	private final PrintResult printResult;
	private final MenuService menuService;
	
	public MenuController() {
		printResult = new PrintResult();
		menuService = new MenuService();
	}
	
	public void selectAllMenu() {
		
		List<MenuDTO> menuList = menuService.selectAllMenu();
		
		if(menuList != null) {
			PrintResult.printMenuList(menuList);
		} else {
			printResult.printErrorMessage("selectList");
		}
	}

	public void selectMenuByCode(Map<String, String> parameter) {
		
		int code = Integer.parseInt(parameter.get("code"));
		
		MenuDTO menu = menuService.selectMenuByCode(code);
		
		if(menu != null) {
			printResult.printMenu(menu);
		} else {
			printResult.printErrorMessage("selectOne");
		}
	}

	public void registMenu(Map<String, String> parameter) {
		
		String name = parameter.get("name");
		int price = Integer.parseInt(parameter.get("price"));
		int categoryCode = Integer.parseInt(parameter.get("categoryCode"));
		
		MenuDTO menu = new MenuDTO();
		menu.setName(name);
		menu.setPrice(price);
		menu.setCategoryCode(categoryCode);
		
		if(menuService.registMenu(menu)) {
			printResult.printSuccessMessage("insert");
		} else {
			printResult.printErrorMessage("insert");
		}
	}

	public void modifyMenu(Map<String, String> parameter) {
		
		int code = Integer.parseInt(parameter.get("code"));
		String name = parameter.get("name");
		int price = Integer.parseInt(parameter.get("price"));
		int categoryCode = Integer.parseInt(parameter.get("categoryCode"));
		
		MenuDTO menu = new MenuDTO();
		menu.setCode(code);
		menu.setName(name);
		menu.setPrice(price);
		menu.setCategoryCode(categoryCode);
		
		if(menuService.modifyMenu(menu)) {
			printResult.printSuccessMessage("update");
		} else {
			printResult.printErrorMessage("update");
		}
	}

	public void deleteMenu(Map<String, String> parameter) {
		
		int code = Integer.parseInt(parameter.get("code"));
		
		if(menuService.deleteMenu(code)) {
			printResult.printSuccessMessage("delete");
		} else {
			printResult.printErrorMessage("delete");
		}
	}
	
}

 

MenuService

package com.greedy.section01.xmlconfig;

import java.util.List;
import static com.greedy.section01.xmlconfig.Template.getSqlSession;
import org.apache.ibatis.session.SqlSession;


public class MenuService {

	private final MenuDAO menuDAO;
	
	public MenuService() {
		menuDAO = new MenuDAO();
	}
	
	public List<MenuDTO> selectAllMenu() {
		
		SqlSession sqlSession = getSqlSession();
		
		List<MenuDTO> menuList = menuDAO.selectAllMenu(sqlSession);
		
		sqlSession.close();
		
		return menuList;
	}

	public MenuDTO selectMenuByCode(int code) {
		
		SqlSession sqlSession = getSqlSession();
		
		MenuDTO menu = menuDAO.selectMenuByCode(sqlSession, code);
		
		sqlSession.close();
		
		return menu;
	}

	public boolean registMenu(MenuDTO menu) {
		
		SqlSession sqlSession = getSqlSession();
		
		int result = menuDAO.insertMenu(sqlSession, menu);
		
		if(result > 0) {
			sqlSession.commit();
		} else {
			sqlSession.rollback();
		}
		
		sqlSession.close();
		
		return result > 0 ? true : false;
	}

	public boolean modifyMenu(MenuDTO menu) {
		
		SqlSession sqlSession = getSqlSession();
		
		int result = menuDAO.updateMenu(sqlSession, menu);
		
		if(result > 0) {
			sqlSession.commit();
		} else {
			sqlSession.rollback();
		}
		
		sqlSession.close();
		
		return result > 0 ? true : false;
		
	}

	public boolean deleteMenu(int code) {
		
		SqlSession sqlSession = getSqlSession();
		
		int result = menuDAO.deleteMenu(sqlSession, code);
		
		if(result > 0) {
			sqlSession.commit();
		} else {
			sqlSession.rollback();
		}
		
		sqlSession.close();
		
		return result > 0 ? true : false;
	}

}

 

PrintResult

package com.greedy.section01.xmlconfig;

import java.util.List;

public class PrintResult {

	public static void printMenuList(List<MenuDTO> menuList) {
		for(MenuDTO menu : menuList) {
			System.out.println(menu);
		}
	}
	public void printMenu(MenuDTO menu) {
		System.out.println(menu);
		
	}
	
	public void printSuccessMessage(String successCode) {
		String successMessage = "";
		switch(successCode) {
		case "insert" : successMessage = "신규 메뉴 등록에 성공하셨습니다."; break;
		case "update" : successMessage = "신규 메뉴 수정에 성공하셨습니다."; break;
		case "delete" : successMessage = "메뉴 삭제에 성공하셨습니다."; break;
		}
		System.out.println(successMessage);
	}
	
	public void printErrorMessage(String errorCode) {
		String errorMessage = "";
		switch(errorCode) {
		case "selectList" : errorMessage = "메뉴 목록 조회에 실패하셨습니다."; break;
		case "selectOne" : errorMessage = "메뉴 조회에 실패하셨습니다."; break;
		case "insert" : errorMessage = "신규 메뉴 등록에 실패하셨습니다."; break;
		case "update" : errorMessage = "신규 메뉴 수정에 실패하셨습니다."; break;
		case "delete" : errorMessage = "메뉴 삭제에 실패하셨습니다."; break;
		}
		System.out.println(errorMessage);
	}



}

 

MenuDAO

package com.greedy.section01.xmlconfig;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

public class MenuDAO {

	public List<MenuDTO> selectAllMenu(SqlSession sqlSession) {
		
		return sqlSession.selectList("MenuMapper.selectAllMenu");
	}

	public MenuDTO selectMenuByCode(SqlSession sqlSession, int code) {
	
		return sqlSession.selectOne("MenuMapper.selectMenuByCode", code);
	}

	public int insertMenu(SqlSession sqlSession, MenuDTO menu) {
		
		return sqlSession.insert("MenuMapper.insertMenu", menu);
	}

	public int updateMenu(SqlSession sqlSession, MenuDTO menu) {
		
		return sqlSession.update("MenuMapper.updateMenu", menu);
	}

	public int deleteMenu(SqlSession sqlSession, int code) {
		
		return sqlSession.delete("MenuMapper.deleteMenu", code);
	}

}

 

menu-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">
<mapper namespace="MenuMapper">
	
	<!-- 조회한 컬럼과 DTO를 매핑시키기 위한 설정이다. -->
	<resultMap type="com.greedy.section01.xmlconfig.MenuDTO" id="menuResultMap">
		<id property="code" column="MENU_CODE"/>	<!-- pk -->
		<result property="name" column="MENU_NAME"/>	<!-- 일반컬럼 -->
		<result property="price" column="MENU_PRICE"/>
		<result property="categoryCode" column="CATEGORY_CODE"/>
		<result property="orderableStatus" column="ORDERABLE_STATUS"/>
	</resultMap>
	
	<select id="selectAllMenu" resultMap="menuResultMap">
			SELECT
				   MENU_CODE
				 , MENU_NAME
				 , MENU_PRICE
				 , CATEGORY_CODE
				 , ORDERABLE_STATUS
			  FROM TBL_MENU
			 WHERE ORDERABLE_STATUS = 'Y'
			 ORDER BY MENU_CODE
	</select>
	
	<!-- 
	파라미터가 한 개인 경우 바인딩 되는 이름은 상관 없다. 파라미터 타입도 지정하지 않아도 된다. 
	resultMap : 위에서 정의한 resultMap을 리턴 타입으로 이용하는 경우
	resultType : 이미 정의되어 있는 타입을 리턴 타입으로 이용하는 경우
	 -->
	<select id="selectMenuByCode" parameterType="_int" resultMap="menuResultMap">
				SELECT
				   MENU_CODE
				 , MENU_NAME
				 , MENU_PRICE
				 , CATEGORY_CODE
				 , ORDERABLE_STATUS
			  FROM TBL_MENU
			 WHERE ORDERABLE_STATUS = 'Y'
			   AND MENU_CODE = #{ code } <!-- 중괄호 안에 아무거나 써도 됨 -->
	</select>

	<!-- insert, update, delete의 경우 resultType은 작성하지 않는다. 기본 _int로 수행 결과를 리턴한다. -->
	<!-- 파라미터로 전달된 DTO의 필드 이름으로 값을 바인딩 해주어야 한다. getter를 이용하며 getter가 없는 경우 에러가 발생한다. -->
	<insert id="insertMenu"	parameterType="com.greedy.section01.xmlconfig.MenuDTO">
		INSERT
		  INTO TBL_MENU
		(
		  MENU_CODE
		, MENU_NAME
		, MENU_PRICE
		, CATEGORY_CODE
		, ORDERABLE_STATUS
		)
		VALUES
		(
		  SEQ_MENU_CODE.NEXTVAL
		, #{ name }
		, #{ price }
		, #{ categoryCode }
		, 'Y'
		)
	</insert>
	
	<update id="updateMenu" parameterType="com.greedy.section01.xmlconfig.MenuDTO">
		UPDATE
			   TBL_MENU
		   SET MENU_NAME = #{ name }
		     , MENU_PRICE = #{ price }
		     , CATEGORY_CODE = #{ categoryCode }
		 WHERE MENU_CODE = #{ code }
	</update>
	
	<delete id="deleteMenu" parameterType="_int">
		DELETE
		  FROM TBL_MENU
		 WHERE MENU_CODE = #{ code }
	</delete>
</mapper>