TOP
본문 바로가기
[Java]/Java 기초

[Java] JDBC : 데이터베이스

by 기록자_Recordian 2025. 4. 15.
728x90
반응형
이전 내용
 

[java] 컬렉션 프레임워크, 제네릭

이전 내용 [java] 스레드 제어이전 내용 [java] java 스레드(thread) - 멀티, 메인, 작업 / 동기화 메소드이전 내용 [java] java.lang 패키지이전 내용 [java] 예외 (클래스, 처리), 다중 catch, 예외 떠넘기기, S

puppy-foot-it.tistory.com


JDBC
Connector J 다운로드 받기

 

◆ JDBC란?

JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.

 

JDBC API를 사용하기 위해서는 먼저 JDBC 드라이버를 다운받아야 한다.

필자의 경우 MySQL을 사용하므로, MySQL에 접속하여 드라이버를 다운 받는 것을 설명한다.

 

검색창에 MySQL JDBC를 검색하면 MySQL 사이트가 뜨는데, 해당 사이트로 접속 (또는 하단 링크)

https://dev.mysql.com/downloads/connector/j/

 

MySQL :: Download Connector/J

MySQL Connector/J is the official JDBC driver for MySQL. MySQL Connector/J 8.0 and higher is compatible with all MySQL versions starting with MySQL 5.7. Additionally, MySQL Connector/J 8.0 and higher supports the new X DevAPI for development with MySQL Ser

dev.mysql.com

 

접속 후, [Archives]를 누르고

 

Product Version을 선택하고, Operating System에서 'Platform Independent' 선택

(필자의 경우, 9.2.0 버전 선택)

그리고나서 Zip Archive (윈도우 용) 파일을 다운 받으면 된다.

 

그리고 이클립스에 접속하여 DB를 연동해야 하는 프로젝트의 오른쪽 마우스 - Build Path - Configure Build Path 로 들어간 다음,

 

 Java Build Path의 'Libraries' 탭에서 [Add External JAR's] 를 선택한 뒤, 앞서 다운 받아놓은 MySQL 드라이버를 선택하면 된다.


Java - DB 연동 확인하기

 

먼저, MySQL Workbench에 들어가서 테이블을 하나 생성한다.

CREATE TABLE book (
  bookid int(11) NOT NULL auto_increment,
  bookname varchar(40) NOT NULL,
  publisher varchar(40) NOT NULL,
  price int(11) NOT NULL,
  PRIMARY KEY (bookid)
);

 

그리고 이클립스에서 Book 클래스를 만든다.

Book 클래스는 책의 정보를 저장하고 관리하기 위한 클래스로, bookid(책 ID - 자동 증가), bookname(책 이름), publisher(출판사), price(가격)을 속성으로 갖고 있다. 또한, 이러한 속성들과 관련된 생성자 및 접근자 메서드가 포함되어 있다. 

public class Book {
	private int bookid;
	private String bookname;
	private String publisher;
	private int price;

	public Book(int bookid, String bookname, String publisher, int price) {
		this.bookid = bookid;
		this.bookname = bookname;
		this.publisher = publisher;
		this.price = price;
	}

	public int getBookid() {
		return bookid;
	}

	public void setBookid(int bookid) {
		this.bookid = bookid;
	}

	public String getBookname() {
		return bookname;
	}

	public void setBookname(String bookname) {
		this.bookname = bookname;
	}

	public String getPublisher() {
		return publisher;
	}

	public void setPublisher(String publisher) {
		this.publisher = publisher;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "Book [bookid=" + bookid + ", bookname=" + bookname + ", publisher=" + publisher + ", price=" + price
				+ "]";
	}
}

 

다음으로는 Booklist 클래스를 만든다.

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

public class Booklist {
	Connection conn;

	public Booklist() throws Exception {
		String driver = "com.mysql.cj.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/tabledb";
		String userid = "root";
		String pwd = "1234";

		Class.forName(driver);
		System.out.println("드라이버 로드 성공");
		System.out.println("드라이버 연결 준비");
		conn = DriverManager.getConnection(url, userid, pwd);
		System.out.println("드라이버 연결 성공");

	}

	private void sqlRun() throws Exception {
		String sql = "select bookid, bookname, publisher, price from book";
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery(sql);
		while (rs.next()) {
			System.out.print("\t" + rs.getInt(1));
			System.out.print("\t" + rs.getString(2));
			System.out.print("\t" + rs.getString(3));
			System.out.print("\t" + rs.getInt(4));
			System.out.println();
		}
		rs.close();
		stmt.close();
	}

	public void insert() {
		Statement stmt;
		String sql = "insert into book (bookid, bookname, publisher, price) values (0, '임꺽정 전기', '서구 출판사', 25000)";

		try {
			stmt = conn.createStatement();
			int result = stmt.executeUpdate(sql);
			if (result == 1) {
				System.out.println("레코드 추가 성공");
			} else {
				System.out.println("레코드 추가 실패");
			}

			stmt.close();

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void delete(int num) {
		PreparedStatement pstmt;
		String sql = "delete from book where bookid = ?";
		try {
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, num);
			int result = pstmt.executeUpdate();

			if (result == 1) {
				System.out.println("레코드 삭제 성공" + num);
			} else {
				System.out.println("레코드 삭제 실패");
			}

			pstmt.close();

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void insertBook(Book book) {
//		int bookid = book.getBookid();
		String bookname = book.getBookname();
		String publisher = book.getPublisher();
		int price = book.getPrice();

		String sql = "insert into book (bookname, publisher, price) values (?, ?, ?)";
		PreparedStatement pstmt;

		try {
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, bookname);
			pstmt.setString(2, publisher);
			pstmt.setInt(3, price);

			int result = pstmt.executeUpdate();
			if (result == 1) {
				System.out.println("레코드 추가 성공!");
			} else {
				System.out.println("레코드 추가 실패!");
			}

			pstmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws Exception {
		Booklist bl = new Booklist();
		bl.sqlRun();
		bl.insert();

		Book book = new Book(0, "데이터베이스", "연희출판사", 30000);
		bl.insertBook(book);
		book = new Book(0, "안드로이드", "연희출판사", 50000);
		bl.insertBook(book);
		bl.delete(1);
		bl.sqlRun();
	}
}

 

이 클래스에 들어 있는 코드에 대해 설명하면

 

◆ 데이터베이스 연동

Connection conn;

public Booklist() throws Exception {
    String driver = "com.mysql.cj.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/tabledb";
    String userid = "root";
    String pwd = "1234";

    Class.forName(driver);
    System.out.println("드라이버 로드 성공");
    System.out.println("드라이버 연결 준비");
    conn = DriverManager.getConnection(url, userid, pwd);
    System.out.println("드라이버 연결 성공");

}
  • Class.forName(dirver): 데이터베이스 드라이버 클래스를 메모리에 로드한다. 
  • conn = DriverManager.getConnection(url, userid, pwd);: 데이터베이스에 연결을 시도한다. url은 연결하려는 데이터베이스의 URL이고, userid는 데이터베이스에 연결하기 위한 사용자 ID, pwd는 해당 사용자에 대한 비밀번호이다.

◆ sqlRun 메소드

private void sqlRun() throws Exception {
    String sql = "select bookid, bookname, publisher, price from book";
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
    while (rs.next()) {
        System.out.print("\t" + rs.getInt(1));
        System.out.print("\t" + rs.getString(2));
        System.out.print("\t" + rs.getString(3));
        System.out.print("\t" + rs.getInt(4));
        System.out.println();
    }
    rs.close();
    stmt.close();
}

데이터베이스에서 book 테이블의 모든 책 정보를 조회하고 출력하는 역할.

작동 방식:

  • SQL 쿼리를 정의하여 bookid, bookname, publisher, price 컬럼 선택.
  • Statement 객체를 사용하여 쿼리를 실행하고 결과를 ResultSet에 저장.
  • while 루프를 통해 ResultSet에서 각 행(row)을 반복하여 책의 정보를 출력.
  • 작업이 완료된 후 ResultSet과 Statement를 종료.

◆ insert 메소드

public void insert() {
    Statement stmt;
    String sql = "insert into book (bookid, bookname, publisher, price) values (0, '임꺽정 전기', '서구 출판사', 25000)";

    try {
        stmt = conn.createStatement();
        int result = stmt.executeUpdate(sql);
        if (result == 1) {
            System.out.println("레코드 추가 성공");
        } else {
            System.out.println("레코드 추가 실패");
        }

        stmt.close();

    } catch (SQLException e) {
        e.printStackTrace();
    }
}

이 메서드는 데이터베이스에 새 책을 추가하는 기능 수행.
작동 방식:

  • SQL 쿼리를 작성하여 고정된 값을 사용하여 book 테이블에 새로운 레코드 추가.
  • Statement 객체를 사용하여 쿼리를 실행하고 결과를 반환받음.
  • 삽입이 성공적으로 이루어졌는지 확인하고 결과에 따라 메시지 출력.
  • 작업이 끝난 후 Statement를 종료.

◆ delete 메소드

public void delete(int num) {
    PreparedStatement pstmt;
    String sql = "delete from book where bookid = ?";
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, num);
        int result = pstmt.executeUpdate();

        if (result == 1) {
            System.out.println("레코드 삭제 성공" + num);
        } else {
            System.out.println("레코드 삭제 실패");
        }

        pstmt.close();

    } catch (SQLException e) {
        e.printStackTrace();
    }
}

특정 bookid를 가진 책을 데이터베이스에서 삭제하는 기능 수행.
작동 방식:

  • SQL 쿼리를 사용하여 bookid에 해당하는 레코드 삭제.
  • PreparedStatement를 사용하여 쿼리에 파라미터(num)를 설정.
  • 삭제 성공 여부를 확인하여 해당 메시지를 출력.
  • 작업이 완료된 후 PreparedStatement 종료.

◆ insertBook 메소드

public void insertBook(Book book) {
    String bookname = book.getBookname();
    String publisher = book.getPublisher();
    int price = book.getPrice();

    String sql = "insert into book (bookname, publisher, price) values (?, ?, ?)";
    PreparedStatement pstmt;

    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, bookname);
        pstmt.setString(2, publisher);
        pstmt.setInt(3, price);

        int result = pstmt.executeUpdate();
        if (result == 1) {
            System.out.println("레코드 추가 성공!");
        } else {
            System.out.println("레코드 추가 실패!");
        }

        pstmt.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

주어진 Book 객체의 정보를 사용하여 데이터베이스에 책을 추가하는 기능 수행.
작동 방식:

  • Book 객체에서 책 이름, 출판사, 가격 정보 추출.
  • SQL 쿼리를 통해 파라미터를 포함한 삽입 쿼리 작성.
  • PreparedStatement를 사용하여 각 속성을 설정하여 쿼리를 실행.
  • 삽입 성공 여부를 확인하여 메시지 출력.
  • 작업 마무리 후 PreparedStatement 종료.

◆ main 메소드

public static void main(String[] args) throws Exception {
    Booklist bl = new Booklist();
    bl.sqlRun();
//  bl.insert();

    Book book = new Book(0, "데이터베이스", "연희출판사", 30000);
    bl.insertBook(book);
    book = new Book(0, "안드로이드", "연희출판사", 50000);
    bl.insertBook(book);
//  bl.delete(1);
    bl.sqlRun();
}

프로그램의 진입점으로, Booklist 인스턴스를 생성하고 메서드들을 순차적으로 수행.
작동 방식:

  • sqlRun() 메서드를 호출하여 초기 데이터베이스 내용 출력.
  • insertBook() 메서드를 사용하여 두 개의 책 레코드 추가.
  • 책을 추가한 후 다시 sqlRun() 메서드를 호출하여 변경된 데이터베이스 내용 출력.

이를 실행하면,


다음 내용

 

[Java] 람다 표현식 (Lambda)

이전 내용 [Java] JDBC : 데이터베이스이전 내용 [java] 컬렉션 프레임워크, 제네릭이전 내용 [java] 스레드 제어이전 내용 [java] java 스레드(thread) - 멀티, 메인, 작업 / 동기화 메소드이전 내용 [java] java.

puppy-foot-it.tistory.com

 

728x90
반응형