myBatis - 4. 실습 (class + xml 형식)

이번에는 class 애너테이션 + xml remix버전으로 실습을 진행할려고합니다.

나머지는 class 애너테이션버전이용하지만

쿼리같은경우는 xml방식이 가독성이좀더좋기 때문에

쿼리는 xml로 진행할려고합니다.

 

기본세팅

Template.java

package com.memory.batis3.common;

import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

import com.memory.batis3.model.dao.MenuMapper;


public class Template {

	public static String DRIVER = "oracle.jdbc.driver.OracleDriver";
	public static String URL = "jdbc:oracle:thin:@localhost:1521:xe";
	public static String USER = "mybatis";
	public static String PASSWORD = "mybatis";
	public static SqlSessionFactory sqlSessionFactory;
	
	public static SqlSession getSqlSession() {
		
		if(sqlSessionFactory == null) {
			Environment environment = new Environment("dev", new JdbcTransactionFactory(), new PooledDataSource(DRIVER, URL, USER, PASSWORD));
			
			Configuration configuration = new Configuration(environment);
			configuration.addMapper(MenuMapper.class);
			
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
		}
		
		return sqlSessionFactory.openSession(false);
	}
	
}

 

화면에 출력을위한 파일

PrintResult.java

package com.memory.batis3.view;

import java.util.List;

import com.memory.batis3.model.vo.Menu;


public class ResultPrint {
	
	
	public void succesPrint(List<Menu> menuList) {
		for(Menu menu : menuList) {
			System.out.println(menu);
		}
	}
	
	public void failPrint(String errorMsg) {
		switch(errorMsg) {
			case "selectAllMenu" : System.out.println("메뉴 전체 조회를 실패하였습니다."); break;
			case "insert" : System.out.println("신규 메뉴 추가 실패하였습니다."); break;
			case "update" : System.out.println("기존 메뉴 수정 실패하였습니다."); break;
			case "delete" : System.out.println("메뉴 삭제에 실패하였습니다."); break;
		}
	}
	
	// 메뉴 하나만 출력
	public void menuPrint(Menu menu) {
		System.out.println(menu);
		
	}

	public void sPrint(String sMessage) {
		String message = "";
		switch(sMessage) {
			case "insert" : message = "신규 메뉴 추가에 성공하셨습니다."; break;
			case "update" : message = "기존 메뉴 수정에 성공하셨습니다."; break;
			case "delete" : message = "메뉴 삭제에 성공하셨습니다."; break;
		}
		
		System.out.println(message);
		
	}
	
}

 

메뉴실행을위한 파일

Application.java

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.println("메뉴 관리 번호를 입력하세요 : ");
			int no = sc.nextInt();
			
			switch(no) {
				case 1 : menuController.selectAllMenu(); break;
				case 2 : menuController.selectMenu(inputMenu()); break;
				case 3 : menuController.insertMenu(inputInsert()); break;
				case 4 : menuController.UpdateMenu(inputUpdate()); break;
				case 5 : menuController.deleteMenu(inputMenu()); break;
				default : System.out.println("잘못된 메뉴를 선택하셨습니다."); break;
			}
			
		}while(true);
	}

 

 

메뉴 목차

1. 메뉴 전체 조회

2. 메뉴 코드로 메뉴 조회

3. 신규 메뉴 추가

4. 메뉴 수정

5. 메뉴 삭제 

 

5가지의 목차로 존재하고

메뉴번호를 입력 했을시 기능이 동작하도록 설정하였습니다.

그리고 값을 넘길때 Map형식으로 넘기는 이유는 

jsp/servlet 작업할때 매핑을 Controller에 넘기는데

서버작업하듯이 할려고 Map에담아 값을 넘기는거였습니다!

 

 

1. 메뉴 전체 조회

MenuController.java

// 메뉴 전체 조회
	public void selectAllMenu() {
		List<Menu> menuList = menuService.selectAllMenu();
		
		if(menuList != null) {
			resultPrint.succesPrint(menuList);
		}else{
			resultPrint.failPrint("selectAllMenu");
		}
		
	}

 

MenuService.java

// 메뉴 전체 조회
	public List<Menu> selectAllMenu() {
		SqlSession sqlSession = getSqlSession();
		
		menuMapper = sqlSession.getMapper(MenuMapper.class);
		List<Menu> menuList = menuMapper.selectAllMenu();
		
		sqlSession.close();
		
		return menuList;
	}

MenuMapper.interface

// 전체 목록
	List<Menu> selectAllMenu();

 

menuMapper.xml

<resultMap id="menuResultMap" type="com.memory.batis3.model.vo.Menu">
 	<id property="code" column="MENU_CODE"/>
 	<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>

 

그리고 이렇게 xml과 애너테이션 혼합해서 사용할때는 

 

mapper의 Mapper.interface위치와 xml위치를 같은폴더에 같은이름으로 등록을해줘야하고

메소드이름과 id의 값이 일치해야합니다 .

 

 

 

 

2. 메뉴 코드로 메뉴 조회

Application.java

// 메뉴코드 번호 받아오기
	private static Map<String, String> inputMenu(){
		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;
	}

 

MenuService.java

// 메뉴코드로 메뉴조회
	public Menu selectMenu(int code) {
		SqlSession sqlSession = getSqlSession();
		
		menuMapper = sqlSession.getMapper(MenuMapper.class);
		Menu menu = menuMapper.selectMenu(code);
		
		sqlSession.close();
		
		return menu;
	}

 

MenuMapper.interface

//메뉴 코드로 조회
	Menu selectMenu(int code);

 

menuMapper.xml

<select id="selectMenu" 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>

 

3. 신규 메뉴 추가

Application.java

// 신규 메뉴 추가 입력
	private static Map<String, String> inputInsert(){
		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;
	}

 

MenuController.java

// 메뉴코드로 메뉴조회
	public void selectMenu(Map<String, String> parameter) {
		int code = Integer.parseInt(parameter.get("code"));
		
		Menu menu = menuService.selectMenu(code);
		
		if(menu != null) {
			resultPrint.menuPrint(menu);
		}else{
			resultPrint.failPrint("selectMenu");
		}
		
	}

 

MenuService.java

// 신규메뉴 추가
	public boolean insertMenu(Menu menu) {
		SqlSession sqlSession = getSqlSession();
		
		menuMapper = sqlSession.getMapper(MenuMapper.class);
		int result = menuMapper.insertMenu(menu);
		
		if(result > 0) {
			sqlSession.commit();
		}else {
			sqlSession.rollback();
		}
		
		sqlSession.close();
		
		return result > 0 ? true : false;
	}

 

MenuMapper.java

// 신규 메뉴 추가
	int insertMenu(Menu menu);

 

menuMapper.xml

<insert id="insertMenu">
  	INSERT
  	  INTO TBL_MENU
  	  (
  	  	MENU_CODE
  	  , MENU_NAME
  	  , MENU_PRICE
  	  , CATEGORY_CODE
  	  , ORDERABLE_STATUS
  	  )
  	  VALUES
  	  (
  	  	SEQ_MENU_CODE.NEXTVAL
  	  , #{name}
  	  , #{price}
  	  , #{categoryCode}
  	  , 'Y'
  	  )
  </insert>

 

4. 메뉴 수정

Application.java

// 메뉴 수정
	private static Map<String, String> inputUpdate(){
		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.java

// 메뉴 수정
	public void UpdateMenu(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"));
		
		// 작업에 필요한 값을 Menu객체에 저장
		Menu menu = new Menu();
		menu.setCode(code);
		menu.setName(name);
		menu.setPrice(price);
		menu.setCategoryCode(categoryCode);
		
		if(menuService.updateMenu(menu)) {
			resultPrint.sPrint("update");
		}else {
			resultPrint.failPrint("update");
		}
		
	}

 

MenuService.java

// 메뉴 수정
	public boolean updateMenu(Menu menu) {
		SqlSession sqlSession = getSqlSession();
		
		menuMapper = sqlSession.getMapper(MenuMapper.class);
		int result = menuMapper.updateMenu(menu);
		
		if(result > 0) {
			sqlSession.commit();
		}else {
			sqlSession.rollback();
		}
		
		sqlSession.close();
		
		return result > 0 ? true : false;
	}

 

MenuMapper.interface

// 메뉴 수정
	int updateMenu(Menu menu);

 

menuMapper.xml

<update id="updateMenu">
  	UPDATE
  		   TBL_MENU
  	   SET MENU_NAME = #{name}
  	     , MENU_PRICE = #{price}
  	     , CATEGORY_CODE = #{categoryCode}
  	 WHERE MENU_CODE = #{code}
  </update>

 

 

5. 메뉴 삭제 

MenuController.java

// 메뉴 삭제
	public void deleteMenu(Map<String, String> parameter) {
		int code = Integer.parseInt(parameter.get("code"));
		
		if(menuService.deleteMenu(code)) {
			resultPrint.sPrint("delete");
		}else {
			resultPrint.failPrint("delete");
		}
		
	}

 

MenuService.java

// 메뉴 삭제
	public boolean deleteMenu(int code) {
		SqlSession sqlSession = getSqlSession();
		
		menuMapper = sqlSession.getMapper(MenuMapper.class);
		int result = menuMapper.deleteMenu(code);
		
		if(result > 0) {
			sqlSession.commit();
		}else {
			sqlSession.rollback();
		}
		
		sqlSession.close();
		
		return result > 0 ? true : false;
	}

MenuMapper.java

// 메뉴 삭제
	int deleteMenu(int code);

 

MenuMapper.xml

<delete id="deleteMenu">
  	DELETE
  	  FROM TBL_MENU
  	 WHERE MENU_CODE = #{code}
  </delete>

 

후기

코드가줄어서 .. 많은것은좋지만 뭔가 좀더 복잡한느낌을받았고

좀만더 연습해서 잘활용하면 시간단축많이할수있을것같습니다

 

'프로그래밍 > myBatis' 카테고리의 다른 글

myBatis - 5. 동적 쿼리 실습  (0) 2021.10.07
myBatis - 5. 동적 쿼리  (0) 2021.10.07
myBatis - 3. 실습 (class형식)  (0) 2021.10.06
myBatis - 2. 실습 전체 목록 조회(xml형식)  (0) 2021.10.05
myBatis - 1. 기본설정  (0) 2021.10.05
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유