JDBC

Objective_chicorita·2022년 9월 6일
0

SQL

목록 보기
4/5

JDBC를 이용한 데이터베이스 연동 과정

1. JDBC 드라이버 Load

DriverManager란?

  • java.sql.Driver 구현 객체를 관리하는 일을 한다.
  • DBMS 연결 요청이 들어오면 해당 DBMS의 Driver 구현체를 찾아 작업을 위임한다.

JDBC 드라이버 등록 방법1)

직접 Driver 구현객체를 생성하고 직접 등록하기

// 1) java.sql.Driver 구현체의 인스턴스를 생성한다.
java.sql.Driver mairadbDriver = new org.mariadb.jdbc.Driver();
java.sql.Driver oracleDriver = new oracle.jdbc.OracleDriver();
java.sql.Driver mssql.Driver = new com.microsoft.sqlserver.jdbc.SQLServerDriver();

// 2) java.sql.Driver 구현체의 인스턴스를 드라이버 관리자에게 등록한다.
DriverManager.registerDriver(mariadbDriver);
DriverManager.registerDriver(oracleDriver);
DriverManager.registerDriver(mssqlDriver);


// +) DriverManager에 등록된 Driver 인스턴스를 확인해보자.
java.sql.Driver driver = DriverManager.getDriver("jdbc:mariadb://");
System.out.println(driver);
java.sql.Driver drvier2 = DriverManager.getDriver("jdbc:oracle:thin://");
System.out.println(driver2);
java.sql.Driver driver3 = DriverManager.getDriver("jdbc:sqlserver://");
System.out.println(driver3);

//실행결과
//org.mariadb.jdbc.Driver@53d8d10a
//oracle.jdbc.OracleDriver@1d81eb93
//SQLServerDriver:1

JDBC 드라이버 등록 방법2) Driver 구현 클래스 로딩과 자동등록

=> java.sql.Driver 인터페이스를 구현한 클래스를 로딩하면 해당 클래스에서 자신을 자동으로 DriverManager에 등록할 것이다.

Class.forName("fully-qualified class name(패키지명을 포함한 클래스명)");

Class.forName("org.mariadb.jdbc.Driver");

java.sql.Driver driver = DriverManager.getDriver("jdbc:mariadb://");
System.out.printfln(driver);

// 실행결과
// org.mariadb.jdbc.Driver@87aac27

2. DBMS 연결

java.sql.Connection con = DriverManager.getConnection(
        "jdbc:mariadb://localhost:3306/studydb", // jdbcURL
        "study", // username
        "1111" // password
        );) 

     System.out.println("DBMS와 연결됨!");

    System.out.println("DBMS와 연결 해제됨!");

JDBC URL

  • jdbc:mariadb:// -> mariadb 연결
  • localhost -> 연결할 서버, 현재는 localhost서버에 연결
  • 3306 -> 포트번호
  • /studydb -> 연결할 db

3. DBMS에 SQL문 보내기 : INSERT

  1. java.sql.Statement 구현 객체를 얻는다.
    SQL문을 DBMS의 형식에 따라 인코딩하여 서버에 전달하는 일을 하는 객체.
    1) INSERT/UPDATE/DELETE 등 DML 관련 SQL문 전송
    => executeUpdate()
    => 리턴값: 변경(insert/update/delete)된 데이터의 개수
    2) SELECT 등 DQL 관련 SQL문 전송
    => executeQuery()
    => 리턴값: 서버에서 데이터를 가져오는 일을 할 객체
// 1.DB연결 - connection
java.sql.Connection con = DriverManager.getConnection(
        "jdbc:mariadb://localhost:3306/studydb?user=study&password=1111");

	// 2. Statement 생성 
	java.sql.Statement stmt = con.createStatement();

	// 3. Statement의 이름 출력
	System.out.println(stmt.getClass().getName());

	// 4. 명령문 실행 - executeUpdate()
	int count = stmt.executeUpdate(
          "insert into x_board(title,contents) values('제목10','내용')");
	System.out.printf("%d 개 입력 성공!", count);
    

4. DBMS에 SQL문 보내기 : SELECT

executeQuery()
=> DBMS 서버에 select 문을 보낸다.
=> 리턴 값: java.sql.ResultSet 구현 객체
ResultSet?
=> 결과가 아니다! 서버에서 결과를 가져오는 일을 할 객체이다.
=> 즉 서버의 select 실행 결과를 가져올 때 사용하는 도구이다.

// 1) DB 연결, connection
java.sql.Connection con = DriverManager.getConnection(
"jdbc:mariadb://localhost:3306/studydb?user=study&password=1111");

// 2) Statement 연결
java.sql.Statement stmt = con.createStatement();

// 3) ResultSet
java.sql.ResultSet rs = stmt.executeQuery(
	"select * from x_board order by board_id desc");
    
// 4) getClass() getName() 쿼리문 출력
System.out.println(rs.getClass().getName());

boolean isReceived = rs.next();
// 가져왔으면 true, 가져올 게 없다면 false

if(isReceived){
	System.out.printf("%s, $s, $s, $s, $s \n");
    re.getString(1),
    re.getString(2),
    re.getString(3),
    re.getString(4),
    re.getString(5);
} else {
	System.out.println("서버에서 한 개의 레코드를 가져오지 못했다!");
}

getString(칼럼번호) :

  • DBMS에 설정된 칼ㄹ럼의 값을 문자열로 출력한다.
  • Select 문에 나열한 칼럼의 순서를 지정한다.
    단, 번호는 0부터가 아니라 1부터 지정한다.
  • select 문에 wildcard(*)를 사용했다면, 테이블 정의할 때
    선언한 칼럼의 순서이다.

getXXXX(칼럼명)

: DBMS에 설정된 칼럼의 타입에 따라 값을 변환해서 받고 싶다면, 다음과 같이 해당 타입의 값을 리턴하는 getXXX()을 호출하면 된다.

  • 해당 번호가 어떤 칼럼을 가르키는지 알려면 select문을 봐야되는 번거러움이 있어서 실무에서는 가능한 번호 대신 칼럼이름을 사용한다.
// int, number => getInt()
// char, varchar, text => getString()
// date, time, datetime => getDate(), getTime()
// float => getFloat()

boolean isReceived = rs.next();
if(isReceived){
	System.out.printf("%d, %s, %s, %s, %s, %d\n");
    	rs.getInt(1); // rs.getInt("board_id");
        rs.getString(2); // rs.getString("title");
        rs.getString(3); // rs.getString("contents");
        rs.getDate(4); // rs.getDate("created_date");
        rs.getTime(4); 
        rs.getInt(5); // rs.getInt("view_count");
 } else {
 	System.out.println("서버에서 한 개의 레코드를 가져오지 못했다.");
}

select 정리

java.util.Connection con = DriverManager.getConnection(
"jdbc:mariadb://localhost:3306/studydb?user=study&password=1111");
java.sql.Statement stmt = con.createStatement();
java.sql.ResultSet rs = stmt.executeQuerey(
"select * from x_board order by board_id desc");

while(rs.next()){
	System.out.printf("%d, %s, %s, %s, %d \n");
    	rs.getInt("board_id");
        rs.getString("title");
        rs.getString("content");
        rs.getDate("created_date");
        //rs.getString("created_date");하게되면 시간도함께 표시된
        rs.getInt("view_count");
}

DBMS에 SQL문 보내기 : UPDATE

java.sql.Connection con = DriverManager.getConnection(
"jdbc:mariadb://localhost:3306/studydb?user=study&password=1111");
java.sql.Statement stmt = con.createStatement();

int count = stmt.executeUpdate(
	"update x_board set view_count = view_count + 1" +
    " where board_id = 4");
System.out.printf("%d개 변경성공!", count);
//executeUpdate()
//=> DBMS서버에 update문을 보낸다. 리턴값은 변경된 레코드의 수!

DBMS에 SQL문 보내기 : DELETE

executeUpdate()가 DBMS서버에 delete문을 보낸다.

java.sql.Connection con = DriverManager(
"jdbc:mariadb://localhost:3306/studydb?user=study&passwoard=1111");
java.sql.Statement stmt = con.createStatement();

int count = stmt.executeUpdate(
	"delete from x_board where board_id = 7");
System.out.printf(" %d 개 삭제 성공!", count);
  • FK가 참조하는 데이터 지우기
    부모 테이블의 데이터를 지우려면, 참조하는 자식 테이블의 데이터를 먼저 지운다. => 게시글을 참조하는 자식 테이블의 데이터를 먼저 지워야 한다.
profile
객체지향 치코리타와 함께하는 dev_travel

0개의 댓글