이번에는 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 |