오늘의 코딩순서
(폴더: oBootMybatis01)
메인페이지: http://localhost:8387
(0808 일지) 1. 회원 목록 (기본 CRUD)
1. 기본 틀
- 기본: application.yml + build.gradle
DTO: Dept.class + Emp.class +
DAO: EmpDao.interface + EmpDaoImpl.class
Service: EmpService.interface + EmpServiceImpl.class
Controller: EmpController.class
View: header.jsp + list.jsp + index.html +board.css
Password 설정: SecurityConfiguration.class
(0808 일지 ~ 0809 일지) 1. 회원 목록 (기본 CRUD)
2. 페이징 작업 - 메인 페이지 + List
- Paging.class(Service) + application.yml + configuration.xml + Emp.xml + EmpController.class
+ EmpService.interface + EmpServiceImpl.class
+ EmpDao.interface+ EmpDaoImpl.class
3. 페이징 작업 - 페이지 번호 작동
- EmpController.class (현장 HW 1)
4. 페이지 조회 (현장 HW 2)
- detailEmp.jsp +
(현장 HW 2) EmpController.class + EmpService.interface + EmpServiceImpl.class
+ EmpDao.interface+ EmpDaoImpl.class + Empno.xml
5. 게시판 내용 수정
- updateFormEmp.jsp +
(현장 HW 3) EmpController.class + EmpService.interface + EmpServiceImpl.class
+ EmpDao.interface+ EmpDaoImpl.class + Empno.xml
(0812 일지)1. 회원 목록 (기본 CRUD)
6.writeFormEmp => 게시판 내용 새로 입력 + 메시지 전달
- list.jsp + EmpController.class + writeFormEmp.jsp
- writeFormEmp 눌렀을 때, 관리자사번 선택창 나오게 하기
(현장 HW 1) EmpController.class + EmpService.interface + EmpServiceImpl.class
+ EmpDao.interface+ EmpDaoImpl.class + Emp.xml - writeFormEmp 눌렀을 때, 부서코드 선택창 나오게 하기
EmpController.class + EmpService.interface + (현장 HW 2) EmpServiceImpl.class
+ DeptDao.interface + DeptDaoImpl.class + Dept.xml - Submit(확인)버튼 눌렀을 때 이동될 창 만들기
(현장 HW 3) EmpController.class + EmpService.interface + EmpServiceImpl.class
+ EmpDao.interface+ EmpDaoImpl.class + Emp.xml - 중복확인 버튼 JSP 방식으로 작동되게 만들기
writeFormEmp.jsp + EmpController.class
- writeFormEmp 눌렀을 때, 관리자사번 선택창 나오게 하기
7. 게시판 내용 삭제
- EmpController.class + EmpService.interface + EmpServiceImpl.class
+ EmpDao.interface+ EmpDaoImpl.class + Emp.xml
오늘의 코딩 포인트
(폴더: oBootMybatis01)
(0808 일지)
1. 기본 틀
- application.yml
server:
port: 8387
# Oracle Connect
spring:
datasource:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@localhost:1521/xe
username: scott
password: tiger
#JPA Setting
jpa:
show-sql: true
hibernate:
ddl-auto: create
# View Resolver
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
- build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.2'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.oracle'
version = 'version.1.0'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-mail'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
implementation group: 'org.glassfish.web', name: 'jakarta.servlet.jsp.jstl', version: '2.0.0'
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.3'
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
- Dept.class
package com.oracle.oBootMybatis01.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class Dept {
private int deptno;
private String dname;
private String loc;
// 프로젝트시 DTO파일을 여러개 만드는 것보다,
// 아래에 @Transient 어노테이션을 걸고 더 추가하는 것이 유지보수에 좋음
}
- Emp.class
package com.oracle.oBootMybatis01.model;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
@Data
public class Emp {
private int empno;
@NotEmpty(message = "이름은 필수입니다 흑유흑유")
private String ename;
private String job;
private int mgr;
private String hiredate;
private int sal;
private int comm;
private int deptno;
// 조회용
private String search;
private String keyword;
private String pageNum;
private int start;
private int end;
// Page 정보
private String currentPage;
// 프로젝트시 DTO파일을 여러개 만드는 것보다,
// 아래에 @Transient 어노테이션을 걸고 더 추가하는 것이 유지보수에 좋음
}
- EmpDao.interface
package com.oracle.oBootMybatis01.dao;
public interface EmpDao {
int totalEmp();
}
- EmpDaoImpl.class
Tip)- SqlSession
- JDBC가 DataSource, JPA가 EntityManager을 사용한다면, Mybatis는 SqlSession을 사용함
- SqlSession
package com.oracle.oBootMybatis01.dao;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
// Mybatis DB 연동
private final SqlSession session;
@Override
public int totalEmp() {
// TODO Auto-generated method stub
return 0;
}
}
- EmpService.interface
package com.oracle.oBootMybatis01.service;
public interface EmpService {
int totalEmp();
}
- EmpServiceImpl.class
package com.oracle.oBootMybatis01.service;
import org.springframework.stereotype.Service;
import com.oracle.oBootMybatis01.dao.EmpDao;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
private final EmpDao ed;
@Override
public int totalEmp() {
// TODO Auto-generated method stub
return 0;
}
}
- EmpController.class
package com.oracle.oBootMybatis01.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
private final EmpService es;
@RequestMapping(value = "listEmpStart")
public String listEmpStart(Emp emp, Model model) {
System.out.println("EmpController Start listEmp...");
model.addAttribute("tatalEmp", 5);
return "list";
}
}
- header.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<link href="css/board.css" rel="stylesheet" type="text/css">
- list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>회원관리 </h1>
<h3>사원수 : ${totalEmp }</h3>
</body>
</html>
- index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>회원 관리</h1>
<a href="/listEmpStart">회원 목록(기본 CRUD)</a><p>
</body>
</html>
↳ ID는 user, PW는 Console에 나타나는 것으로 입력하기
- SecurityConfiguration.class
package com.oracle.oBootMybatis01.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfiguration {
@Bean
public BCryptPasswordEncoder encodePwd() {
return new BCryptPasswordEncoder();
}
// @Bean
// protected SecurityFilterChain filterChai(HttpSecurity http) throws Exception {
// http.authorizeHttpRequests()
// .anyRequest()
// .permitAll()
// ;
// return http.build();
// }
@Bean
protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.cors(cors -> cors.disable())
.csrf(csrf -> csrf.disable());
return http.build();
}
}
(0808 일지 ~ 0809 일지)
2. 페이징 작업 - 메인 페이지 + List
- Paging.class
package com.oracle.oBootMybatis01.service;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class Paging {
private int currentPage = 1;
private int rowPage = 10;
private int pageBlock = 10;
private int start; private int end;
private int startPage; private int endPage;
private int total; private int totalPage;
public Paging(int total, String currentPage1) {
this.total = total; //20
if (currentPage1 != null) {
this.currentPage = Integer.parseInt(currentPage1); //2
}
// 1 10
start = (currentPage - 1) * rowPage + 1; // 시작시 1 11
end = start + rowPage - 1; // 시작시 10 20
// 20 10
totalPage = (int)Math.ceil((double)total / rowPage); // 시작시 3
// 1 1
startPage = currentPage - (currentPage - 1) % pageBlock; // 시작시 1
endPage = startPage + pageBlock - 1; //10
// ex: 10 14
if (endPage > totalPage) {
endPage = totalPage;
}
}
}
- application.yml
server:
port: 8387
# Oracle Connect
spring:
datasource:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@localhost:1521/xe
username: scott
password: tiger
#JPA Setting
jpa:
show-sql: true
hibernate:
ddl-auto: update
# View Resolver
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
# Mybatis
mybatis:
config-location: classpath:configuration.xml
mapper-locations: classpath:mappers/*.xml
- configuration.xml
Tip) http://mybatis.org에 들어가서 config.dtd를 검색해도 나옴- yml파일의 configuration.xml 설정과 연결됨
- 여기서 기재했기 때문에 Emp.xml과 configuration.xml 이 연결되어, parameterType과 resultType을 길게 기재할 필요 없어짐
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config
3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="Emp" type="com.oracle.oBootMybatis01.model.Emp"/>
<typeAlias alias="Dept" type="com.oracle.oBootMybatis01.model.Dept"/>
</typeAliases>
</configuration>
d
- Emp.xml
Tip)- id는 session의 mapper ID와 동일해야함
- #{} 받고자 하는 필드명
<?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.oracle.oBootMybatis01.EmpMapper">
<select id="empTotal" resultType="int">
SELECT Count(*) FROM emp
</select>
<select id="tkEmpListAll" parameterType="Emp" resultType="Emp">
</select>
</mapper>
- +++ Emp.xml( 현장 HW)
<?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.oracle.oBootMybatis01.EmpMapper">
<select id="empTotal" resultType="int">
SELECT Count(*) FROM emp
</select>
<select id="tkEmpListAll" parameterType="Emp" resultType="Emp">
SELECT*
FROM
(
SELECT rownum rn, a.*
FROM
(
SELECT * FROM emp
ORDER BY empno) a
)
WHERE rn BETWEEN #{start} and #{end}
</select>
</mapper>
- EmpController.class
package com.oracle.oBootMybatis01.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
private final EmpService es;
@RequestMapping(value = "listEmpStart")
public String listEmpStart(Emp emp, Model model) {
System.out.println("EmpController Start listEmp...");
int totalEmp = es.totalEmp();
String currentPage = "1";
// Paging 작업
Paging page = new Paging(totalEmp, currentPage);
// Parameter emp ==> Page만 추가 Setting
emp.setStart(page.getStart()); // 시작시 1
emp.setEnd(page.getEnd()); // 시작시 10
List<Emp> listEmp = es.listEmp(emp);
System.out.println("EmpController list listEmp.size()->"+listEmp.size());
model.addAttribute("totalEmp", totalEmp);
model.addAttribute("listEmp", listEmp);
model.addAttribute("page", page);
return "list";
}
}
- EmpService.interface
package com.oracle.oBootMybatis01.service;
import java.util.List;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpService {
int totalEmp();
List<Emp> listEmp(Emp emp);
}
- EmpServiceImpl.class
package com.oracle.oBootMybatis01.service;
import java.util.List;
import org.springframework.stereotype.Service;
import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
private final EmpDao ed;
@Override
public int totalEmp() {
System.out.println("EmpServiceImpl totalEmp Start...");
int totEmpCnt = ed.totalEmp();
System.out.println("EmpServiceImpl totalEmp totEmpCnt->"+totEmpCnt);
return totEmpCnt;
}
@Override
public List<Emp> listEmp(Emp emp) {
List<Emp> empList = null;
System.out.println("EmpServiceImpl listManager Start...");
empList = ed.listEmp(emp);
System.out.println("EmpServiceImpl listEmp empList.size()->"+empList.size());
return empList;
}
}
- EmpDao.interface
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpDao {
int totalEmp();
List<Emp> listEmp(Emp emp);
}
- EmpDaoImpl.class
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
// Mybatis DB 연동
private final SqlSession session;
@Override
public int totalEmp() {
int totEmpCount = 0;
System.out.println("EmpDaoImpl Start totalEmp...");
try {
totEmpCount = session.selectOne("com.oracle.oBootMybatis01.EmpMapper.empTotal");
System.out.println("EmpDaoImpl totalEmp totEmpCount->"+totEmpCount);
} catch (Exception e) {
System.out.println("EmpDaoImpl totalEmp e.getMessage()->"+e.getMessage());
}
return totEmpCount;
}
@Override
public List<Emp> listEmp(Emp emp) {
List<Emp> empList = null;
System.out.println("EmpDaoImpl listEmp Start...");
try {
// Map ID(Emp tag의 List) , parameter
// ID 이름은 유일해야함(unique)
empList = session.selectList("tkEmpListAll", emp);
System.out.println("EmpDaoImpl listEmp empList.size()->"+empList.size());
} catch (Exception e) {
System.out.println("EmpDaoImpl listEmp e.getMessage()->"+e.getMessage());
}
return empList;
}
}
3. 페이징 작업 - 페이지 번호 작동
- EmpController.class (현장 HW 1)
package com.oracle.oBootMybatis01.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
private final EmpService es;
// 1.메인 페이지 + list 조회
@RequestMapping(value = "listEmpStart")
public String listEmpStart(Emp emp, Model model) {
System.out.println("EmpController Start listEmp...");
int totalEmp = es.totalEmp();
String currentPage = "1";
// Paging 작업
Paging page = new Paging(totalEmp, currentPage);
// Parameter emp ==> Page만 추가 Setting
emp.setStart(page.getStart()); // 시작시 1
emp.setEnd(page.getEnd()); // 시작시 10
List<Emp> listEmp = es.listEmp(emp);
System.out.println("EmpController list listEmp.size()->"+listEmp.size());
model.addAttribute("totalEmp", totalEmp);
model.addAttribute("listEmp", listEmp);
model.addAttribute("page", page);
return "list";
}
// 2. 페이지 번호 이동
@RequestMapping(value = "listEmp")
public String listEmp(Emp emp, Model model) {
System.out.println("EmpController Start listEmp...");
// 20
int totalEmp = es.totalEmp();
// Paging 작업
Paging page = new Paging(totalEmp, emp.getCurrentPage());
// Parameter emp ==> Page만 추가 Setting
emp.setStart(page.getStart()); // 시작시 1
emp.setEnd(page.getEnd()); // 시작시 10
List<Emp> listEmp = es.listEmp(emp);
System.out.println("EmpController list listEmp.size()->"+listEmp.size());
model.addAttribute("totalEmp", totalEmp);
model.addAttribute("listEmp", listEmp);
model.addAttribute("page", page);
return "list";
}
}
4. 페이지 조회
- detailEmp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>직원정보</h2>
<table>
<tr><th>사번</th><td>${emp.empno }</td></tr>
<tr><th>이름</th><td>${emp.ename }</td></tr>
<tr><th>업무</th><td>${emp.job }</td></tr>
<tr><th>급여</th><td>${emp.sal }</td></tr>
<tr><th>입사일</th><td>${emp.hiredate }</td></tr>
<tr><th>보너스</th><td>${emp.comm }</td></tr>
<tr><th>관리자사번</th><td>${emp.mgr }</td></tr>
<tr><th>부서코드</th><td>${emp.deptno }</td></tr>
<tr><td colspan="2">
<input type="button" value="목록"
onclick="location.href='listEmp'">
<input type="button" value="수정"
onclick="location.href='updateFormEmp?empno=${emp.empno}'">
<input type="button" value="삭제"
onclick="location.href='deleteEmp?empno=${emp.empno}'">
</td>
</tr>
</table>
</body>
</html>
(현장 HW 2)
- EmpController.class
package com.oracle.oBootMybatis01.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
private final EmpService es;
// 현장HW 2-1
@GetMapping(value = "detailEmp")
public String detailEmp(Emp emp1, Model model) {
System.out.println("EmpController Start detailEmp...");
// 1. EmpService안에 detailEmp method 선언
// 1) parameter : empno
// 2) Return Emp
//
// 2. EmpDao detailEmp method 선언
//// mapper ID , Parameter
// emp = session.selectOne("tkEmpSelOne", empno);
System.out.println("emp->"+emp1);
Emp emp = es.detailEmp(emp1.getEmpno());
model.addAttribute("emp", emp);
return "detailEmp";
}
}
- EmpService.interface
package com.oracle.oBootMybatis01.service;
import java.util.List;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpService {
int totalEmp();
List<Emp> listEmp(Emp emp);
// 현장HW 2-2
Emp detailEmp(int empno);
}
- EmpServiceImpl.class
package com.oracle.oBootMybatis01.service;
import java.util.List;
import org.springframework.stereotype.Service;
import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
private final EmpDao ed;
// 현장 HW 2-3
//1. EmpService안에 detailEmp method 선언
// 1) parameter : empno
// 2) Return Emp
@Override
public Emp detailEmp(int empno) {
System.out.println("EmpServiceImpl detailEmp...");
Emp emp = null;
emp = ed.detailEmp(empno);
System.out.println("EmpServiceImpl detailEmp emp->"+emp);
return emp;
}
}
- EmpDao.interface
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpDao {
int totalEmp();
List<Emp> listEmp(Emp emp);
// 현장 HW 2-4
Emp detailEmp(int empno);
}
- EmpDaoImpl.class
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
// Mybatis DB 연동
private final SqlSession session;
// 현장 HW 2-5
// 2. EmpDao detailEmp method 선언
// mapper ID , Parameter
// emp = session.selectOne("tkEmpSelOne", empno);
@Override
public Emp detailEmp(int empno) {
System.out.println("EmpDaoImpl detailEmp Start...");
Emp emp = new Emp();
try {
// mapper ID , Parameter
emp = session.selectOne("tkEmpSelOne",empno);
System.out.println("EmpDaoImpl detail getEname->"+emp.getEname());
} catch (Exception e) {
System.out.println("EmpDaoImpl detail Exception->"+e.getMessage());
}
return emp;
}
}
- Empno.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="com.oracle.oBootMybatis01.EmpMapper">
<select id="tkEmpSelOne" parameterType="int" resultType="Emp">
SELECT * EMP emp
WHERE empno = #{empno}
</select>
</mapper>
5. 게시판 내용 수정
- updateFormEmp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>직원정보</h2>
<form action="updateEmp" method="post">
<input type="hidden" name="empno" value="${emp.empno }">
<table>
<tr><th>사번</th><td>${emp.empno }</td></tr>
<tr><th>이름</th><td>
<input type="text" name="ename" required="required" value="${emp.ename }"></td></tr>
<tr><th>업무</th><td>
<input type="text" name="job" required="required" value="${emp.job }"></td></tr>
<tr><th>급여</th><td>
<input type="text" name="sal" required="required" value="${emp.sal }"></td></tr>
<tr><th>입사일</th><td>
<input type="date" name="hiredate" id="hiredate" value="${emp.hiredate }"></td></tr>
<tr><th>보너스</th><td>
<input type="number" name="comm" required="required" value="${emp.comm }"></td></tr>
<tr><th>관리자사번</th><td>
<input type="number" name="mgr" value="${emp.mgr }"></td></tr>
<tr><th>부서코드</th><td>
<input type="number" name="deptno" required="required" value="${emp.deptno }"></td></tr>
<tr>
<td colspan="2">
<input type="submit" value="확인">
</td>
</tr>
</table>
</form>
</body>
</html>
(현장 HW 3)
- EmpController.class
package com.oracle.oBootMybatis01.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
private final EmpService es;
// 3. 게시판 내용 수정
@GetMapping(value = "updateFormEmp")
public String updateFormEmp(Emp emp1, Model model) {
System.out.println("EmpController Start updateFormEmp...");
Emp emp = es.detailEmp(emp1.getEmpno());
System.out.println("EmpController updateFormEmp emp->"+emp);
// 문제
// 1. DTO String hiredate
// 2.View : 단순조회 OK ,JSP에서 input type="date" 문제 발생
// 3.해결책 : 년월일만 짤라 넣어 주어야 함
String hiredate = "";
if (emp.getHiredate() != null) {
hiredate = emp.getHiredate().substring(0,10);
emp.setHiredate(hiredate);
}
System.out.println("hiredate->"+hiredate);
model.addAttribute("emp", emp);
return "updateFormEmp";
}
// 현장HW 3-1
// 1. EmpService안에 updateEmp method 선언
// 1) parameter : Emp
// 2) Return updateCount (int)
//
//2. EmpDao updateEmp method 선언
//// mapper ID , Parameter
//updateCount = session.update("tkEmpUpdate", emp);
@PostMapping(value = "updateEmp")
public String updateEmp(Emp emp, Model model) {
log.info("updateEmp start...");
int updateCount = es.updateEmp(emp);
System.out.println("EmpController es.updateEmp updateCount->"+updateCount);
model.addAttribute("upCnt",updateCount); // Test Controller간 Data 전달
model.addAttribute("kk3","Message Test"); // Test Controller간 Data 전달
// return "forward:listEmp"
return "redirect:listEmp";
}
}
- EmpService.interface
package com.oracle.oBootMybatis01.service;
import java.util.List;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpService {
int totalEmp();
List<Emp> listEmp(Emp emp);
// 현장HW 2-2
Emp detailEmp(int empno);
// 현장HW 3-2
int updateEmp(Emp emp);
}
- EmpServiceImpl.class
package com.oracle.oBootMybatis01.service;
import java.util.List;
import org.springframework.stereotype.Service;
import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
private final EmpDao ed;
// 현장 HW 3-3
// 1. EmpService안에 updateEmp method 선언
// 1) parameter : Emp
// 2) Return updateCount (int)
@Override
public int updateEmp(Emp emp) {
System.out.println("EmpServiceImpl Update...");
int updateCount = 0;
updateCount = ed.updateEmp(emp);
System.out.println("EmpServiceImpl updateEmp updateCount->"+updateCount);
return updateCount;
}
}
- EmpDao.interface
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpDao {
int totalEmp();
List<Emp> listEmp(Emp emp);
// 현장 HW 2-4
Emp detailEmp(int empno);
// 현장 HW 3-4
int updateEmp(Emp emp);
}
- EmpDaoImpl.class
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
// Mybatis DB 연동
private final SqlSession session;
// 현장 HW 3-5
// 2. EmpDao updateEmp method 선언
// mapper ID , Parameter
// updateCount = session.update("tkEmpUpdate", emp);
// model.addAttribute("upCnt",updateCount); // Test Controller간 Data 전달됨
@Override
public int updateEmp(Emp emp) {
System.out.println("EmpDaoImpl update Start...");
int updateCount = 0;
try {
// mapper ID , Parameter
updateCount = session.update("tkEmpUpdate", emp);
} catch (Exception e) {
System.out.println("EmpDaoImpl updateEmp Exception->"+e.getMessage());
}
return updateCount;
}
}
- Empno.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="com.oracle.oBootMybatis01.EmpMapper">
<update id="tkEmpUpdate" parameterType="Emp">
UPDATE emp SET ename=#{ename}
, job=#{job}
, mgr=#{mgr}
, sal=#{sal}
, hiredate=#{hiredate}
, comm=#{comm}
, deptno=#{deptno}
where empno = #{empno}
</update>
</mapper>
Tip) Foreign Key인 부서코드가 SQL에서 null일 경우, 수정이 되지 않을 수 있다
때문에 게시판의 update 기능을 통해 코드를 입력해주어야 한다
(0812 일지)
6. writeFormEmp => 게시판 내용 새로 입력 + 메시지 전달
- list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>회원관리 </h1>
<a href="writeFormEmp">writeFormEmp 입력</a><p>
<a href="writeFormEmp3">writeFormEmp3 입력(Validation)</a>
<h3>사원수 : ${totalEmp }</h3>
<p>uptCnt 수정시 전달 Message : ${uptCnt} <p>
<p>kk3 수정시 전달 Message : ${kk3}<p>
<c:set var="num" value="${page.total-page.start+1 }"></c:set>
<table>
<tr>
<th>번호</th> <th>사번</th> <th>이름</th>
<th>업무</th> <th>급여</th>
</tr>
<c:forEach var="emp" items="${listEmp }">
<tr>
<td>${num }</td><td>${emp.empno }</td>
<td><a href="detailEmp?empno=${emp.empno }">${emp.ename }</a></td>
<td>${emp.job }</td><td>${emp.sal }</td>
</tr>
<c:set var="num" value="${num - 1 }"></c:set>
</c:forEach>
</table>
<c:if test="${page.startPage > page.pageBlock }">
<a href="listEmp?currentPage=${page.startPage-page.pageBlock }">[이전]</a>
</c:if>
<c:forEach var="i" begin="${page.startPage }" end="${page.endPage }">
<a href="listEmp?currentPage=${i}">[${i}]</a>
</c:forEach>
<c:if test="${page.endPage < page.totalPage }">
<a href="listEmp?currentPage=${page.startPage+page.pageBlock }">[다음]</a>
</c:if>
</body>
</html>
- EmpController.class
package com.oracle.oBootMybatis01.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
private final EmpService es;
// 3. 게시판 내용 수정
@GetMapping(value = "updateFormEmp")
public String updateFormEmp(Emp emp1, Model model) {
System.out.println("EmpController Start updateFormEmp...");
Emp emp = es.detailEmp(emp1.getEmpno());
System.out.println("EmpController updateFormEmp emp->"+emp);
// 문제
// 1. DTO String hiredate
// 2.View : 단순조회 OK ,JSP에서 input type="date" 문제 발생
// 3.해결책 : 년월일만 짤라 넣어 주어야 함
String hiredate = "";
if (emp.getHiredate() != null) {
hiredate = emp.getHiredate().substring(0,10);
emp.setHiredate(hiredate);
}
System.out.println("hiredate->"+hiredate);
model.addAttribute("emp", emp);
return "updateFormEmp";
}
// 현장HW 3-1
// 1. EmpService안에 updateEmp method 선언
// 1) parameter : Emp
// 2) Return updateCount (int)
//
//2. EmpDao updateEmp method 선언
//// mapper ID , Parameter
//updateCount = session.update("tkEmpUpdate", emp);
@PostMapping(value = "updateEmp")
public String updateEmp(Emp emp, Model model) {
log.info("updateEmp start...");
System.out.println("EmpController updateEmp emp->"+emp);
int updateCount = es.updateEmp(emp);
System.out.println("EmpController es.updateEmp updateCount->"+updateCount);
model.addAttribute("upCnt",updateCount); // Test Controller간 Data 전달
model.addAttribute("kk3","Message Test"); // Test Controller간 Data 전달
return "forward:listEmp";
// return "redirect:listEmp";
}
}
- writeFormEmp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>직원정보 입력</h2>
<c:if test="${msg!=null}">${msg}</c:if>
<form action="writeEmp" method="post" name="frm">
<table>
<tr><th>사번</th><td><input type="number" name="empno" required="required"
maxlength="4" value="${empno }">
<input type="button" value="중복확인" onclick="chk()">
</td>
</tr>
<tr><th>이름</th><td><input type="text" name="ename" required="required"></td></tr>
<tr><th>업무</th><td><input type="text" name="job" required="required"></td></tr>
<tr><th>급여</th><td><input type="number" name="sal" required="required"></td></tr>
<tr><th>입사일</th><td><input type="date" name="hiredate" required="required"></td></tr>
<tr><th>보너스</th><td><input type="number" name="comm" required="required"></td></tr>
<tr><th>관리자사번</th><td>
<select name="mgr">
<c:forEach var="emp" items="${emMngList}">
<option value="${emp.empno}">${emp.ename}</option>
</c:forEach>
</select> </td>
</tr>
<tr><th>부서코드</th><td>
<select name="deptno">
<c:forEach var="dept" items="${deptList}">
<option value="${dept.deptno}">${dept.dname}</option>
</c:forEach>
</select> </td>
</tr>
<tr><td colspan="2"><input type="submit" value="확인"></td>
</tr>
</table>
</form>
</body>
</html>
1. writeFormEmp 눌렀을 때, 관리자사번 선택창 나오게 하기
- EmpController.class
package com.oracle.oBootMybatis01.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
private final EmpService es;
// (0812) 현장 HW 1
// 1. service -> listManager
// 2. Dao -> listManager
// 3. mapper -> tkSelectManager
System.out.println("EmpController writeForm empList.size()->"+empList.size());
model.addAttribute("empMngList",empList); // emp Manager List
// 부서(코드,부서명)
// List<Dept> deptList = es.deptSelect();
// model.addAttribute("deptList", deptList); // dept
// System.out.println("EmpController writeForm deptList.size->"+deptList.size());
return "writeFormEmp";
}
}
- EmpService.interface
package com.oracle.oBootMybatis01.service;
import java.util.List;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpService {
int totalEmp();
List<Emp> listEmp(Emp emp);
// (0809)현장HW 2-2
Emp detailEmp(int empno);
// (0809)현장HW 3-2
int updateEmp(Emp emp);
// (0812)현장 1-2
List<Emp> listManager();
}
- EmpServiceImpl.class
package com.oracle.oBootMybatis01.service;
import java.util.List;
import org.springframework.stereotype.Service;
import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
private final EmpDao ed;
// (0812)현장 1-3
@Override
public List<Emp> listManager() {
List<Emp> empList = null;
System.out.println("EmpServiceImpl listManager start...");
empList = ed.listManager();
System.out.println("EmpServiceImpl listManager empList.size()->"+empList.size());
return empList;
}
}
- EmpDao.interface
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpDao {
int totalEmp();
List<Emp> listEmp(Emp emp);
// (0809)현장 HW 2-4
Emp detailEmp(int empno);
// (0809)현장 HW 3-4
int updateEmp(Emp emp);
// (0812)현장 1-4
List<Emp> listManager();
}
- EmpDaoImpl.class
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
// Mybatis DB 연동
private final SqlSession session;
// (0812)현장 1-5
@Override
public List<Emp> listManager() {
List<Emp> empList = null;
System.out.println("EmpDaoImpl listManager Start...");
try {
// emp 관리자만 Select Naming Rule
empList = session.selectList("tkSelectManager");
} catch (Exception e) {
System.out.println("EmpDaoImpl listManager Exception->"+e.getMessage());
}
return empList;
}
}
- Emp.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="com.oracle.oBootMybatis01.EmpMapper">
<select id="tkSelectManager" resultType="Emp">
SELECT *
FROM emp
WHERE empno in (
SELECT mgr
FROM emp
)
</select>
</mapper>
2. writeFormEmp 눌렀을 때, 부서코드 선택창 나오게 하기
- EmpController.class
package com.oracle.oBootMybatis01.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
private final EmpService es;
@RequestMapping(value = "writeFormEmp")
public String writeFormEmp(Model model) {
System.out.println("empController writeFormEmp Start...");
// 관리자사번만 Get
List<Emp> empList = es.listManager();
// (0812) 현장 HW 1
// 1. service -> listManager
// 2. Dao -> listManager
// 3. mapper -> tkSelectManager
System.out.println("EmpController writeForm empList.size()->"+empList.size());
model.addAttribute("empMngList",empList); // emp Manager List
// 부서(코드,부서명)
List<Dept> deptList = es.deptSelect();
model.addAttribute("deptList", deptList); // dept
System.out.println("EmpController writeForm deptList.size->"+deptList.size());
return "writeFormEmp";
}
}
- EmpService.interface
package com.oracle.oBootMybatis01.service;
import java.util.List;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpService {
int totalEmp();
List<Emp> listEmp(Emp emp);
// (0809)현장HW 2-2
Emp detailEmp(int empno);
// (0809)현장HW 3-2
int updateEmp(Emp emp);
// (0812)현장 1-2
List<Emp> listManager();
List<Dept> deptSelect();
}
- EmpServiceImpl.class
package com.oracle.oBootMybatis01.service;
import java.util.List;
import org.springframework.stereotype.Service;
import com.oracle.oBootMybatis01.dao.DeptDao;
import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
private final EmpDao ed;
private final DeptDao dd;
// 서로 다른 Interface(DAO)를 받은 것이기 때문에 두 개 이상 가능
// (0812)현장 HW 2-1
@Override
public List<Dept> deptSelect() {
List<Dept> deptList = null;
System.out.println("EmpServiceImpl deptSelect Start...");
deptList = dd.deptSelect();
System.out.println("EmpServiceImpl deptSelect deptList.size()->"+deptList.size());
return deptList;
}
}
- DeptDao.interface
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import com.oracle.oBootMybatis01.model.Dept;
public interface DeptDao {
List<Dept> deptSelect();
}
- DeptDaoImpl.class
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.oracle.oBootMybatis01.model.Dept;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class DeptDaoImpl implements DeptDao {
// Mybatis 연동
private final SqlSession session;
// (0812)현장 HW 2-2
@Override
public List<Dept> deptSelect() {
List<Dept> deptList = null;
System.out.println("DeptDaoImpl deptSelect Start...");
try {
// ID: tkSelectDept
deptList = session.selectList("tkSelectDept");
} catch (Exception e) {
System.out.println("DeptDaoImpl Exception Exception->"+e.getMessage());
}
return deptList;
}
}
- Dept.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="com.oracle.oBootMybatis01.DeptMapper">
<select id="tkSelectDept" resultType="Dept">
SELECT * FROM dept
</select>
</mapper>
3. Submit(확인)버튼 눌렀을 때 이동될 창 만들기
- EmpController.class
package com.oracle.oBootMybatis01.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
private final EmpService es;
@RequestMapping(value = "writeFormEmp")
public String writeFormEmp(Model model) {
System.out.println("empController writeFormEmp Start...");
// 관리자사번만 Get
List<Emp> empList = es.listManager();
// (0812) 현장 HW 1-1
// 1. service -> listManager
// 2. Dao -> listManager
// 3. mapper -> tkSelectManager
System.out.println("EmpController writeForm empList.size()->"+empList.size());
model.addAttribute("empMngList",empList); // emp Manager List
// 부서(코드,부서명)
List<Dept> deptList = es.deptSelect();
model.addAttribute("deptList", deptList); // dept
System.out.println("EmpController writeForm deptList.size->"+deptList.size());
return "writeFormEmp";
}
@PostMapping(value = "writeEmp")
public String writeEmp(Emp emp, Model model) {
System.out.println("EmpController writeEmp Start...");
// Service, Dao , Mapper명[insertEmp] 까지 -> insert
int insertResult = es.insertEmp(emp);
if (insertResult > 0)
return "redirect:listEmp";
// insertResult 1일때 입력 성공
else {
model.addAttribute("msg", "입력 실패. 확인해 보세요.");
return "forward:writeFormEmp";
// 입력 실패시 위의 writeFormEmp로 돌아가되 msg의 값을 가져가므로,
// writeFormEmp의 <c:if test="${msg!=null}">${msg}</c:if> 값이 출력되어
// 메시지가 나타남
}
}
}
- EmpService.interface
package com.oracle.oBootMybatis01.service;
import java.util.List;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpService {
int totalEmp();
List<Emp> listEmp(Emp emp);
// (0809)현장HW 2-2
Emp detailEmp(int empno);
// (0809)현장HW 3-2
int updateEmp(Emp emp);
// (0812)현장 1-2
List<Emp> listManager();
List<Dept> deptSelect();
// (0812)현장 3-1
int insertEmp(Emp emp);
}
- EmpServiceImpl.class
package com.oracle.oBootMybatis01.service;
import java.util.List;
import org.springframework.stereotype.Service;
import com.oracle.oBootMybatis01.dao.DeptDao;
import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
private final EmpDao ed;
private final DeptDao dd;
// 서로 다른 Interface(DAO)를 받은 것이기 때문에 두 개 이상 가능
// (0812)현장 3-2
// Service, Dao , Mapper명[insertEmp] 까지 -> insert
@Override
public int insertEmp(Emp emp) {
int result = 0;
System.out.println("EmpServiceImpl Insert Start...");
result = ed.insertEmp(emp);
return result;
}
}
- EmpDao.interface
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpDao {
int totalEmp();
List<Emp> listEmp(Emp emp);
// (0809)현장 HW 2-4
Emp detailEmp(int empno);
// (0809)현장 HW 3-4
int updateEmp(Emp emp);
// (0812)현장 1-4
List<Emp> listManager();
// (0812)현장 3-3
int insertEmp(Emp emp);
}
- EmpDaoImpl.class
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
// Mybatis DB 연동
private final SqlSession session;
// (0812)현장 3-4
@Override
public int insertEmp(Emp emp) {
int result = 0;
System.out.println("EmpDaoImpl insert Start...");
try {
result = session.insert("insertEmp", emp);
} catch (Exception e) {
System.out.println("EmpDaoImpl insertEmp Exception->"+e.getMessage());
}
return result;
}
}
- Emp.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="com.oracle.oBootMybatis01.EmpMapper">
<insert id="insertEmp" parameterType="Emp">
INSERT into emp values ( #{empno}, #{ename}, #{job}, #{mgr},
#{hiredate}, #{sal}, #{comm}, #{deptno}
)
</insert>
</mapper>
4. 중복확인 버튼 JSP 방식으로 작동되게 만들기
- writeFormEmp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function chk() {
if (!frm.empno.value) {
alert("사번을 입력해주세요")
frm.empno.focus();
return false;
} else location.href="confirm?empno="+frm.empno.value;
}
</script>
</head>
<body>
<h2>직원정보 입력</h2>
<c:if test="${msg!=null}">${msg}</c:if>
<form action="writeEmp" method="post" name="frm">
<table>
<tr><th>사번</th><td><input type="number" name="empno" required="required"
maxlength="4" value="${empno }">
<input type="button" value="중복확인" onclick="chk()">
</td>
</tr>
<tr><th>이름</th><td><input type="text" name="ename" required="required"></td></tr>
<tr><th>업무</th><td><input type="text" name="job" required="required"></td></tr>
<tr><th>급여</th><td><input type="number" name="sal" required="required"></td></tr>
<tr><th>입사일</th><td><input type="date" name="hiredate" required="required"></td></tr>
<tr><th>보너스</th><td><input type="number" name="comm" required="required"></td></tr>
<tr><th>관리자사번</th><td>
<select name="mgr">
<c:forEach var="emp" items="${empMngList}">
<option value="${emp.empno}">${emp.ename}</option>
</c:forEach>
</select> </td>
</tr>
<tr><th>부서코드</th><td>
<select name="deptno">
<c:forEach var="dept" items="${deptList}">
<option value="${dept.deptno}">${dept.dname}</option>
</c:forEach>
</select> </td>
</tr>
<tr><td colspan="2"><input type="submit" value="확인"></td>
</tr>
</table>
</form>
</body>
</html>
- EmpController.class
package com.oracle.oBootMybatis01.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
private final EmpService es;
@GetMapping(value = "confirm")
public String confirm(Emp emp1, Model model) {
Emp emp = es.detailEmp(emp1.getEmpno());
model.addAttribute("empno", emp1.getEmpno());
if (emp != null) {
System.out.println("EmpController confirm 중복된 사번...");
model.addAttribute("msg", "중복된 사번입니다");
//return "forward:writeFormEmp";
} else {
System.out.println("EmpController confirm 사용 가능한 사번...");
model.addAttribute("msg", "사용 가능한 사번입니다");
//return "forward:writeFormEmp";
}
return "forward:writeFormEmp";
// return을 최소화하여 효율성 높이기
}
}
}
7. 게시판 내용 삭제
- EmpController.class
package com.oracle.oBootMybatis01.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
private final EmpService es;
// 7. 데이터 삭제
// Controller --> deleteEmp 1.parameter : empno
// name -> Service, dao , mapper
// return -> listEmp
@RequestMapping(value = "deleteEmp")
public String deleteEmp(Emp emp, Model model) {
System.out.println("EmpController delete Start...");
int result = es.deleteEmp(emp.getEmpno());
System.out.println("EmpController es.deleteEmp result->"+result);
return "redirect:listEmp";
}
}
- EmpService.interface
package com.oracle.oBootMybatis01.service;
import java.util.List;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpService {
int totalEmp();
List<Emp> listEmp(Emp emp);
// (0809)현장HW 2-2
Emp detailEmp(int empno);
// (0809)현장HW 3-2
int updateEmp(Emp emp);
// (0812)현장 1-2
List<Emp> listManager();
List<Dept> deptSelect();
// (0812)현장 3-1
int insertEmp(Emp emp);
// (0812)현장 4-1
int deleteEmp(int empno);
}
- EmpServiceImpl.class
package com.oracle.oBootMybatis01.service;
import java.util.List;
import org.springframework.stereotype.Service;
import com.oracle.oBootMybatis01.dao.DeptDao;
import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
private final EmpDao ed;
private final DeptDao dd;
// 서로 다른 Interface(DAO)를 받은 것이기 때문에 두 개 이상 가능
// 7. 데이터 삭제
// (0812)현장 4-2
@Override
public int deleteEmp(int empno) {
int result = 0;
System.out.println("EmpServiceImpl delete Start...");
result = ed.deleteEmp(empno);
return empno;
}
}
- EmpDao.interface
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import com.oracle.oBootMybatis01.model.Emp;
public interface EmpDao {
int totalEmp();
List<Emp> listEmp(Emp emp);
// (0809)현장 HW 2-4
Emp detailEmp(int empno);
// (0809)현장 HW 3-4
int updateEmp(Emp emp);
// (0812)현장 1-4
List<Emp> listManager();
// (0812)현장 3-3
int insertEmp(Emp emp);
// (0812)현장 4-3
int deleteEmp(int empno);
}
- EmpDaoImpl.class
package com.oracle.oBootMybatis01.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.oracle.oBootMybatis01.model.Emp;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
// Mybatis DB 연동
private final SqlSession session;
// 7. 데이터 삭제
// (0812)현장 4-4
@Override
public int deleteEmp(int empno) {
System.out.println("EmpDaoImpl delete Start...");
int result = 0;
try {
result = session.delete("deleteEmp", empno);
System.out.println("EmpDaoImpl delete emp.->"+result);
} catch (Exception e) {
System.out.println("EmpDaoImpl delete Exception->"+e.getMessage());
}
return result;
}
}
- Emp.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="com.oracle.oBootMybatis01.EmpMapper">
<delete id="deleteEmp" parameterType="int">
DELETE FROM emp
WHERE empno = #{empno}
</delete>
</mapper>
질문목록
수업교재
05. Mybatis
3. spring ORM - myBatis와 Hibernate의 세부특징 비교 ⭐⭐⭐⭐
비교 | Mybatis ⭐⭐⭐ | Hiberate(JPA) |
Mapping | Partial Mapping | Full Mapping |
SQL 필요지식 | 상대적으로 높음 | 상대적으로 낮음 |
DML 적용 객체 | Sql Session | Entity Manager |
적용 기법 | SQL Mapper | 객체단위 (Repositiry => Entity, Attribute => Table, Column) |
오늘의 숙제
'Spring' 카테고리의 다른 글
2024_08_13_화 (0) | 2024.08.13 |
---|---|
2024_08_12_월 (0) | 2024.08.12 |
2024_08_07_수~08_08_목 (0) | 2024.08.07 |
2024_08_06_화~08_07_수 (0) | 2024.08.06 |
2024_08_05_월~08_06_화 (0) | 2024.08.05 |