본문 바로가기

연습문제/JAVA

Java 와 DB 연동-2 내가 참고할 코드 (0806) / github 커맨드

수업내용중 github--------------------------------------------------------------
커맨드)
git add . : 파일안에 있는 내용 전부를 add시켜라
git comit -m "initial commit : 커밋하고 커밋내용은 initial commit

여러개 수정파일 커밋 나눠서 해야할경우)   
코드뭉치 스테이지에 올리기 > 코드를보고 원하는 파일만 커밋가능
-----------------------------------------------------------------------------------

 

 

 

 

==Main==

 

import kr.ac.daegu.ysy.db.DbProcess;
import kr.ac.daegu.ysy.input.InputUtil;

public class Main {

public static void main(String[] args) throws Exception {
// 사용자의 입력을 Scanner로 받아 (clear)
// "1" 이외 데이터가 입력될 경우 "다시 입력해 주세요" 하고 다시 입력받을 수 있도록 한다. (clear)
// "1" 을 입력받을 경우 mariadb 에서 정의한 Student 테이블의 데이터를 모두 조회하여 출력 한다.
// "2" 를 입력 받을 경우 새로운 학생을 추가 한다.
String selectedNumber = new InputUtil().validateUserInput(); // 메소드 체이닝.
// 사용자의 입력을 받는다, "1" 이외의 입력이 들어오면 계속 반복하여 메뉴를 보여준다. , "1"의 입력이 들어오면 해당 값을 반환(return)한다.
System.out.println("선택된 번호 : " + selectedNumber);

// selectedNumber에 따라 학생 테이블을 전체 조회 한다.
DbProcess dp = new DbProcess(selectedNumber);
dp.startProcessing();
}
}

 

 

==DBProcess==

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import kr.ac.daegu.ysy.core.Menu;
import kr.ac.daegu.ysy.input.InputUtil;

public class DbProcess {
private static final String DB_URL = "jdbc:mariadb://localhost:3306/DGD";
private static final String DB_USER = "root";
private static final String DB_PW = "0000";

private final String selectedNumber;

// 생성자를 명시적으로 지정하면 기본생성자 DbProcess()는 호출될 수 없다. (따로 명시 해야 한다.)
public DbProcess(String selectedNumber) {
this.selectedNumber = selectedNumber;
}

public void startProcessing() throws SQLException {
// Connection, PreparedStatement, ResultSet interface 객체이다.
Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PW);
PreparedStatement pstmt = null;
ResultSet rs = null;

// selectedNumber에 따라 쿼리를 달리 한다.
switch (this.selectedNumber){
case Menu.SELECT:
showAllStudents(conn, pstmt, rs); break;
case Menu.INSERT: // 신규 Student를 추가 한다.
// 이름은 뭔지 나이는 몇살인지 번호는 뭔지 이메일은 뭔지 입력을 받아서 쿼리 실행 하는 코드들...
Student s = Student.buildStudent();
// max id + 1을 가져온다, 새로운 id db insert 하기 위해
pstmt = conn.prepareStatement("select max(id) + 1 from Student");
rs = pstmt.executeQuery();
if(rs.next()){
int maxId = rs.getInt(1);
System.out.println("maxId = " + maxId);
pstmt = conn.prepareStatement("insert into Student values (?, ?, ?, ?, ?)");
// "?"의 순서 (1부터)에 따라 값을 셋팅 한다.
pstmt.setInt(1, maxId);
pstmt.setString(2, s.getName());
pstmt.setInt(3, s.getAge());
pstmt.setString(4, s.getPhone());
pstmt.setString(5, s.getEmail());
System.out.println("INSERT 완료");

int updatedRows = pstmt.executeUpdate(); // db로 업데이트 (commit)
System.out.println("updatedRows: " + updatedRows);
} else {
throw new SQLException("Can't execute query select max(id) + 1 from Student");
}
break;
case Menu.UPDATE:
// 학생 정보의 수정
System.out.println("학생 정보의 수정");
// 콘솔 출력: 전체 학생의 목록을 조회해서 사용자에게 보여주고
List<Student> students = showAllStudents(conn, pstmt, rs);
// 콘솔 출력: 수정할 학생의 번호(id)를 입력 하세요
System.out.println("수정할 학생의 번호를 입력하세요.");
int sIdToUpdate = InputUtil.getIdFromStudentList(students);
System.out.println("수정할 학생 번호:" + sIdToUpdate);
// 이름은 뭔지 나이는 몇살인지 번호는 뭔지 이메일은 뭔지 입력을 받는다
Student updateStd = Student.buildStudent();
// 업데이트 쿼리 수행
pstmt = conn.prepareStatement("UPDATE Student SET name=?, age=?, phone=?, email=? where id=?");
pstmt.setString(1, updateStd.getName());
pstmt.setInt(2, updateStd.getAge());
pstmt.setString(3, updateStd.getPhone());
pstmt.setString(4, updateStd.getEmail());
pstmt.setInt(5, sIdToUpdate);
pstmt.executeUpdate();
System.out.println("업데이트 완료.");
break;
case Menu.DELETE:
// 삭제를 수행
// 콘솔 출력 : 학생 정보의 삭제
System.out.println("학생 정보의 삭제");
// 전체 학생의 목록 출력
List<Student> studentsList = showAllStudents(conn, pstmt, rs);
// 콘솔 출력 : 삭제할 학생의 번호(id)를 입력 하세요
System.out.println("삭제할 학생의 번호를 입력 하세요.");
int sIdToDelete = InputUtil.getIdFromStudentList(studentsList);
// 삭제 쿼리 수행
pstmt = conn.prepareStatement("DELETE FROM Student where id=?");
pstmt.setInt(1, sIdToDelete);
pstmt.executeUpdate();
System.out.println("학생 id " + sIdToDelete + "삭제 완료.");
break;
default :
System.out.println("nothing to do"); break;
}
}

private List<Student> showAllStudents(Connection conn, PreparedStatement pstmt, ResultSet rs) throws SQLException{
List<Student> sList = new ArrayList<>();
pstmt = conn.prepareStatement("select * from Student");
rs = pstmt.executeQuery();
/* 쿼리날린 결과를 가지고 콘솔에 출력한다. */
while(rs.next()){
System.out.println(
rs.getInt(1) + " | "
+ rs.getString(2) + " | "
+ rs.getInt(3) + " | "
+ rs.getString(4) + " | "
+ rs.getString(5));
sList.add(new Student(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getString(4), rs.getString(5)));
}
return sList;
}
}

 

 

==InputUntil==

 

import org.apache.commons.lang.StringUtils;

import java.util.List;
import java.util.Scanner;

import kr.ac.daegu.ysy.core.Menu;
import kr.ac.daegu.ysy.db.Student;

public class InputUtil {

private static Scanner strSc = new Scanner(System.in); // strSc 멤버변수의 접근 제어자가 default : 같은 패키지 내에서만 접근이 가능하다.

public static String getStringFromConsole(String defaultString) {
String result = strSc.next().trim();
if(result.equals("")){
result = defaultString;
}
return result;
}

// 콘솔에서 숫자 입력 받음
// 숫자 아닌 문자일 경우 경고 출력 하여 다시
public static int getIntFromConsole() {
String v = strSc.next();
if (!isNumber(v)) {
do {
System.out.println("숫자를 입력해 주세요");
v = strSc.next();
} while (!isNumber(v));
}
return Integer.parseInt(v);
}

private static boolean isNumber(String v) {
return StringUtils.isNumeric(v);
}

// 콘솔 입력: 수정할 학생의 번호를 사용자로부터 받는다
// -- (optional) : 이외 번호를 입력 받았을 경우 다시 입력해 주세요 출력하고 학생의 번호를 다시 받는다.
public static int getIdFromStudentList(List<Student> students) {
int usrSelectedId; // 사용자로부터 입력받는 번호
do {
usrSelectedId = InputUtil.getIntFromConsole(); // 숫자만 입력받음.
if(idIsExist(usrSelectedId, students)){ // 존재하는 학생의 id인지?
return usrSelectedId;
} else {
System.out.println("존재하지 않는 학생 id 입니다. id 번호를 선택하시오.");
}
} while (!idIsExist(usrSelectedId, students)); // do - while문의 동작구조가 : while 조건절이 false가 뜰 때까지 do 구문을 반복한다.
return usrSelectedId;
}

private static boolean idIsExist(int usrSelectedId, List<Student> studentIds) {
for(Student s: studentIds){
if(s.getId() == usrSelectedId){
return true;
}
}
return false;
}

// 사용자의 입력을 받아서 지정된 값 이외에는 "다시 입력해주세요" 라고 반복하여 물어봄.
public String validateUserInput() {
String userInputString = null; // 사용자가 입력한 데이터를 저장 하는 역할
Scanner sc = new Scanner(System.in); // 사용자의 입력을 받기 위한 Scanner 객체의 인스턴스를 불러온다. (인스턴스를 불러온다 -> 이 프로그램이 실행될 때 Scanner객체를 쓸 수 있도록 메모리에 적재 해라)
do {
printInfo(); // 사용자의 안내를 출력하는 메소드
userInputString = inputFromUserFromConsole(sc);
} while (checkUserInputScope(userInputString)); // do - while 구문 : while 조건이 false 일때까지 do를 무한 반복한다.
return userInputString;
}

// 콘솔로부터 사용자의 입력을 받는 InputProcess에서만 쓸 수 있는 기능. (private)
private String inputFromUserFromConsole(Scanner sc) { // private : 접근 제어자. 접근 : 해당 메소드가 선언된 클래스 이외의 다른 클래스에서 쓸수 있나 없나?
return sc.next(); // 사용자의 입력을 받은 데이터를 String으로 반환한다.
}

// 이 프로그램이 지정한 inputString에 속하는거면 false, 아니면 "다시 입력해 주세요" 하고 true 처리
private boolean checkUserInputScope(String inputString) {
switch (inputString) {
case Menu.SELECT: case Menu.INSERT: case Menu.UPDATE: case Menu.DELETE: return false;
default :
System.out.println("잘못 입력 하셨습니다. ");
System.out.println("주어진 메뉴중 하나를 골라 주세요");
return true;
}
}

// 사용자가 메뉴를 고를 수 있도록 콘솔로 띄워줌.
private void printInfo() {
System.out.println("아래 내용중 선택하세요.");
System.out.println("1: 전체 학생 조회");
System.out.println("2: 새로운 학생 추가");
System.out.println("3: 학생번호 선택하여 수정");
System.out.println("4: 학생 삭제");
}
}

 

 

==Student==

 

import kr.ac.daegu.ysy.input.InputUtil;

public class Student {
private int id;
private String name;
private int age;
private String phone;
private String email;

public Student() {}
public Student(int id, String name, int age, String phone, String email) {
this.id = id;
this.name = name;
this.age = age;
this.phone = phone;
this.email = email;
}

public static Student buildStudent() {
Student s = new Student();
System.out.println("이름은?");
s.name = InputUtil.getStringFromConsole("no name");
System.out.println("나이는?");
s.age = InputUtil.getIntFromConsole();
System.out.println("번호는?");
s.phone = InputUtil.getStringFromConsole("no phone number");
System.out.println("이메일은?");
s.email = InputUtil.getStringFromConsole("no email");
return s;
}

public int getId(){
return this.id;
}

public String getName(){
return this.name;
}

public int getAge() {
return this.age;
}

public String getPhone() {
return this.phone;
}

public String getEmail() {
return this.email;
}
}

==Menu==

 

public interface Menu { // interface enum처럼 쓴다.
String SELECT = "1";
String INSERT = "2";
String UPDATE = "3";
String DELETE = "4";
}

 

 

 

==========

3. 업데이트와 4. 삭제쿼리 추가

Student 와 InputUntil 추가

자세한 내용은 후에 추가예정--