생생이
20
2019-09-11 00:30:50
3
181

JDBC(MySQL) 기본 CRUD 를 메소드화 만들기


안녕하세요 항상 선배님들의 도움을 많이받고 있는 대학생입니다.

IT 학과 1학년 재학중인데 막히는부분이 있으면 웬만하면 넘어가는데 간단한부분인데 너무 해결이  안돼서 도움을 요청합니다..

*밑에 코드는 select 를 select()메소드로 만든 것이고, 메인 메소드에서 잘 동작하여 DB table 이 잘 출력됩니다


package DBTest;


import java.sql.Connection;

import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SelectTest {

	// public static void main(String[] args) {

	public static void Select() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;

		try {
			// 1. 드라이버 로딩
			Class.forName("com.mysql.jdbc.Driver");

			// 2. 연결하기
			String url = "jdbc:mysql://localhost:3306/kes_table?useSSL=false";
			conn = DriverManager.getConnection(url, "root", "sd203505");

			// 3. 쿼리 수행을 위한 Statement 객체 생성
			stmt = conn.createStatement();

			// 4. SQL 쿼리 작성
			// 주의사항
			// 1) JDBC에서 쿼리를 작성할 때는 세미콜론(;)을 빼고 작성한다.
			// 2) SELECT 할 때 * 으로 모든 칼럼을 가져오는 것보다
			// 가져와야 할 칼럼을 직접 명시해주는 것이 좋다.
			// 3) 원하는 결과는 쿼리로써 마무리 짓고, java 코드로 후작업 하는 것은 권하지 않음
			// 4) 쿼리를 한 줄로 쓰기 어려운 경우 들여쓰기를 사용해도 되지만 띄어쓰기에 유의 !!
			String sql = "SELECT * FROM table_test";

			// 5. 쿼리 수행
			// 레코드들은 ResultSet 객체에 추가된다.
			rs = stmt.executeQuery(sql);

			// 6. 실행결과 출력하기
			while (rs.next()) {
				// 레코드의 칼럼은 배열과 달리 0부터 시작하지 않고 1부터 시작한다.
				// 데이터베이스에서 가져오는 데이터의 타입에 맞게 getString 또는 getInt 등을 호출한다.
				String id = rs.getString(1);
				String Name = rs.getString(2);
				String Age = rs.getString(3);
				String Job = rs.getString(4);
				String Hobby = rs.getString(5);

				System.out.println(id + " " + Name + " " + " " + Age + " " + Job+ " " +Hobby);
			}
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 실패");
		} catch (SQLException e) {
			System.out.println("에러 " + e);
		} finally {
			try {
				if (conn != null && !conn.isClosed()) {
					conn.close();
				}
				if (stmt != null && !stmt.isClosed()) {
					stmt.close();
				}
				if (rs != null && !rs.isClosed()) {
					rs.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}
}
// }


밑에코드는 밑 클래스를 insert메소드를 만들어 매개변수를 받게끔 만들었습니다. 

package DBTest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class InsertTest {

	// public static void main(String[] args) {
	// // kes_table 테이블에는 ID/타이틀/내용/만들시일 칼럼이 있습니다.
	// insert( 5,"BullySQL", "BULLT SQL is...", "2019-09-10
	// 01:36:33","Allen","developer");
	// }

	public static void insert(int id, String Name, String Age, String Job, String Hobby) {

		
		Connection conn = null;
		PreparedStatement pstmt = null;

		try {
			// 1. 드라이버 로딩
			Class.forName("com.mysql.jdbc.Driver");

			// 2. 연결하기
			String url = "jdbc:mysql://localhost:3306/kes_table?useSSL=false";
			conn = DriverManager.getConnection(url, "root", "sd203505");

			// 3. SQL 쿼리 준비
			// 추가하려는 데이터의 값은 전달된 인자를 통해 동적으로 할당되는 값이다.
			// 즉 어떤 값이 전달될지 모르므로 Select 할 때와 달리
			// stmt = conn.createStatement(); 를 작성하지 않고
			// pstmt = conn.prepareStatement(sql); 로 작성하여 데이터를 추가할 것임을 알립니다.
			// 물론 sql 쿼리 내에서 + 연산자로 한 줄로 작성할 수 있지만 가독성이 너무 떨어지게 되므로
			// 이 방법을 권합니다.
			String sql = "INSERT INTO table_test VALUES (?,?,?,?,?)";
			pstmt = conn.prepareStatement(sql);
			insert(id, Name, Age, Job, Hobby);
			// 4. 데이터 binding
			pstmt.setInt(1, id);
			pstmt.setString(2, Name);
			pstmt.setString(3, Age);
			pstmt.setString(4, Job);
			pstmt.setString(5, Hobby);
			
			// 5. 쿼리 실행 및 결과 처리
			// SELECT와 달리 INSERT는 반환되는 데이터들이 없으므로
			// ResultSet 객체가 필요 없고, 바로 pstmt.executeUpdate()메서드를 호출하면 됩니다.
			// INSERT, UPDATE, DELETE 쿼리는 이와 같이 메서드를 호출하며
			// SELECT에서는 stmt.executeQuery(sql); 메서드를 사용했었습니다.
			// @return int - 몇 개의 row가 영향을 미쳤는지를 반환
			int count = pstmt.executeUpdate();
			if (count == 0) {
				System.out.println("데이터 입력 실패");
			} else {
				System.out.println("데이터 입력 성공");
			}
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 실패");
		} catch (SQLException e) {
			System.out.println("에러 " + e);
		} finally {
			try {
				if (conn != null && !conn.isClosed()) {
					conn.close();
				}
				if (pstmt != null && !pstmt.isClosed()) {
					pstmt.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}



밑이 구동시키려 하는 메인 클래스입니다. 시험용으로 매우 간단히 만들엇습니다.

package DBTest;

import java.util.*;

public class Test {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int inpt;
		String str;

		System.out.println("파일 정보를 입력해주세요");
		// SelectTest.Select();
		inpt = scan.nextInt();
		str = scan.nextLine();

		// UpdateTest.Update(a,b,c,d);
		InsertTest.insert(inpt, str, str, str, str);

		scan.close();
	}
}



제가 원하는 프로그램은 자바에서 JDBC를 사용해서 main 구동 클래스에서 insert메소드를 사용하면 insert가,update를 하면 update가, 이렇게 입력을 받아서 값을받게 메소드화를 시키고 싶습니다. 예를들면 메인메소드에서 입력으로 선택을해서

<1번은 생성 2번은 수정 3번은 삭제입니다 어떤걸로하시겠습니까?>

같은 구문으로 동작을 시키려고하는데  입력값이 처음값만 가지고 그 뒤에잇는값이 안받아지거나 여러가지로 바꿔보고 햇는데 원하는데로 되지가 않네요..

데이터베이스 테이블 타입은

table_test

FieldTypeNullKeyDefaultExtra
idint
PRINullAUTO_INCREMENT
NameVARCHAR

Null

AgeVARCHAR


Null

JobVARCHAR


Null

HobbyVARCHAR


Null

대략 이런 구조입니다.


개발자 선배님들 도움 부탁드립니다 좋은명절들 보내세요

0
0
  • 답변 3

  • Autowired
    551
    2019-09-11 01:01:02 작성 2019-09-11 01:04:53 수정됨

    insert메소드안에 자기자신을 한번더호출하는코딩은 빼시면되요

    .

    0
  • 기러우
    26
    2019-09-11 01:41:05

    https://stackoverflow.com/questions/23450524/java-scanner-doesnt-wait-for-user-input

    0
  • 생생이
    20
    2019-09-11 10:47:39

    insert에서 호출하는 코드는 원래 없엇고 잠깐 만들엇던건데 잇네요, 저게 없어도 똑같네요..

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.