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>