Hoon222y

[JSP & Servlet] 8장. 데이터베이스와 JDBC 본문

코딩/교육

[JSP & Servlet] 8장. 데이터베이스와 JDBC

hoon222y 2019. 1. 17. 15:54

8.4 JDBC 기본 구조와 API 이해 

- JDBC : 자바 프로그램에서 서로 다른 데이터 베이스를 표준화 된 방법으로 접속할 수 있도록 만든 API 규격

- 따라서 개발자는 데이터베이스 종류와 무관하게 프로그램을 만들 수 있다. 

JDBC 프로그래밍 : 자바에서 데이터베이스 연동 프로그램을 개발하는 것을 말한다. 


JDBC 프로그래밍 단계 

1) JDBC 드라이버 로드 

- 데이터베이스에 접속하려면 먼저 해당 데이터베이스의 JDBC 드라이버를 로드해야 한다. 


드라이버 로드하는 2가지 방법

1.1)  jdbc.drivers 시스템 환경변수 이용하기 

1
System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver");
cs

1.2) Class.forName() 메서드 이용하기

1
Class.forName("com.mysql.jdbc.Driver");
cs


2) 데이터베이스 연결

- 드라이버가 로드되면 해당 데이터베이스의 JDBC 드라이버를 이용해 프로그램을 작성할 수 있는 상황이 된 것.

- 실제 데이터베이스와 연결하려면 Connection 클래스의 인스턴스 필요

- DriverManager.gtConnection() 메서드를 이용해 레퍼런스를 가져올 수 있음.

1
Connection conn = DriverManager.getConnection(JDBC_URL,"아이디","비밀번호");
cs

 이와 같은 식으로 Connection 클래스 인스턴스 레퍼런스를 얻을 수 있다. 여기서 아이디와 비밀번호는 데이터베이스 자체에서 관리하는 계정이다. 


JDBC_URL : 데이터베이스에 대한 정보를 가지고 있다. 해당 구조는    jdbc:mysql://IP주소: PORT(옵션) / 스키마     의 구조로 이루어져 있다. 스키마는 데이터베이스에서 생성한 스키마(데이터베이스) 이름.


3) Statement 생성

- Statement는 데이터베이스 연결로부터 SQL을 수행할 수 있도록 해주는 클래스이다. 

- executeQuery() : select 문을 수행할 때 사용한다. 반환 값은 ResultSet 클래스의 인스턴스로, 해당 SELECT 문의 결과에 해당하는 데이터에 접근할 수 있는 방법 제공

- executeUpdate() : UPDATE, DELETE 와 같은 문을 수행할 때 사용. 반환값은 int 값으로, 처리된 데이터 수를 반환

1
2
3
Statement stmt = conn.createStatement();
stmt.executeUpdate("insert value (' " +request.getParameter("username")+" ','
                +request.getParameter("email")+" ')";
cs

 이런식으로 수행될 수 있지만, 칼럼이 많아지는 경우 복잡해지기 때문에 PreparedStatement를 통해서 간략히 구현 가능하다. 


PreparedStatement

- sql문을 미리 만들어두고 변수를 따로 입력하는 방식으로

1
2
3
4
PreparedStatement pstmt = conn.prepareStatement("insert value(?,?)");
pstmt.setString(1,request.getParameter("username"));
pstmt.setString(2,request.getParameter("email"));
pstmt.executeUpdate();
cs

 이런식으로 간략하게 할 수 있다. 해당 방식이 컬럼이 증가할 경우 더 보기 좋다. 


4) SQL문 전송

- 만약 처리한 로우의 개수를 확인하고 싶으면 int cnt = pstmt.executeUpdate(); 이런식으로 확인 가능하다.


5) 결과 받기 

- 데이터 결과를 받으려면 Statement나 PreparedStatement의 executeQuery()를 사용한다. 

- 데이터를 가져오는 경우에는 가져온 결과 데이터를 처리하기 위한 ResultSet 객체가 필요하다. ResultSet은 조회한 결과값에 순차적으로 접근할 수 있는 커서를 다루게 한다. 

ex) ResultSet rs = pstmt.executeQuery(); 

- ResultSet은 실제 처리 결과의 데이터가 모두 있는 구조가 아니라, 데이터 인덱스 정보만 있는 구조이다. 

- 따라서 필요한 데이터를 모두 가져온 다음에 ReslutSet을 close하고 , 그 다음 connection을 close해야 한다. 

- ResultSet은 next() 메서드를 이용해 다음 로우로 이동 가능하다. (커서를 최초 데이터 위치로 이동하려면 ReslutSet 사용전에 rs.next() 한번 해주어야 한다. )


6) 연결 해제

- conn.close();




그냥 연결 어떤식으로 되는지에 대한 예제 코드 [ConnectionTest]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package myJSP.ch07;
import java.sql.*;
 
public class connectionTest {
    public static void main(String[] args) {
        String jdbc_driver = "com.mysql.cj.jdbc.Driver";
        String jdbc_url = "jdbc:mysql://localhost:3306/mydb";
        String sql = "select * from test;";
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
 
        try {
            Class.forName(jdbc_driver); // JDBC driver를 load하는 것!
            conn = DriverManager.getConnection(jdbc_url, "root""6789");
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            
            rs.next();
            System.out.println(rs.getString("name"));
            conn.close();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}
 
cs


이름과 이메일을 등록하면 화면 아래에 등록된 리스트가 나오는 예제[예제 8-4] 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<%@ page language="java" contentType="text/html; charset=UTF-8" 
                    pageEncoding="UTF-8" import="java.sql.*"%>
<% 
    request.setCharacterEncoding("utf-8");
    //HTML 폼을 통해 전달되는 한글 처리 부분
%>
 
<%        
    // 데이터베이스 연결관련 변수 선언
    Connection conn = null;
    PreparedStatement pstmt = null;
    Statement stmt = null;
    // 데이터베이스 연결관련정보를 문자열로 선언
    String jdbc_driver = "com.mysql.jdbc.Driver";
    String jdbc_url = "jdbc:mysql://localhost/mydb";
 
try{
    // JDBC 드라이버 로드
    Class.forName(jdbc_driver);
    // 데이터베이스 연결정보를 이용해 Connection 인스턴스 확보
    conn = DriverManager.getConnection(jdbc_url,"root","6789");
 
    // Connection 클래스의 인스턴스로 부터 SQL문 작성을 위한 Statement 준비
    String sql = "insert into jdbc_test values(?,?)";
    pstmt = conn.prepareStatement(sql);
    pstmt.setString(1,request.getParameter("username"));
    pstmt.setString(2,request.getParameter("email"));
    // username 값을 입력한 경우 sql 문장을 수행.
    if(request.getParameter("username"!= null) {
        pstmt.executeUpdate();
    }
}
catch(Exception e) {
    System.out.println(e);
}
%>
<HTML>
    <HEAD><TITLE>JDBC 테스트 </TITLE></HEAD>
<BODY>
    <div align="center">
    <H2>이벤트 등록</H2>
    <HR>
    <form method=post>
        등록이름 : <input type=text name=username>
        email주소 : <input type=text name=email size=20>
        <input type=submit value="등록">
    </form>
    <HR>
    </div>
# 등록 목록<P>
<%
try{
    // select 문장을 문자열 형태로 구성한다.
    String sql = "select username, email from jdbc_test";
     // sql = "select * from jdbc_test" 라고 해도 됨. 
    
    stmt = conn.createStatement();
    //pstmt = conn.prepareStatement(sql);
    // select 를 수행하면 데이터정보가 ResultSet 클래스의 인스턴스로 리턴됨.
    ResultSet rs = stmt.executeQuery(sql);
    int i=1;
    // 마지막 데이터까지 반복함.
    while(rs.next()) {
        out.println(i+" : "+rs.getString(1)+" , "
                    +rs.getString("email")+"<BR>");
        i++;
    }
    // 사용한 자원의 반납.
    rs.close();
    pstmt.close();
    conn.close();
}
catch(Exception e) {
    System.out.println(e);
}
%>
</BODY>
</HTML>
cs

이벤트 등록


등록이름 :  email주소 :  

# 등록 목록

1 : 가나다 , 123123
2 : 마바사 , 456456


-------------------------------------------------------------------------------------------------------


아래코드 공부할 것




JdbcTestDAO.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package myJSP.chap08;
 
import java.sql.*;
import java.util.*;
 
public class JdbcTestDAO {
    private Connection conn;
    private Statement stmt;
    private PreparedStatement pstmt;
    private ResultSet rs;
    
    public JdbcTestDAO() {
        String jdbc_driver = "com.mysql.jdbc.Driver";
        String jdbc_url = "jdbc:mysql://localhost/mydb";
        
        try{
            Class.forName(jdbc_driver);
            conn = DriverManager.getConnection(jdbc_url,"root","6789");
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
    
    public int insertJdbcTest(JdbcTestDO jdbcTestDO) {
        int count = 0;
        String sql = "insert into jdbc_test_values(?,?);";
        
        try {
            pstmt =conn.prepareStatement(sql);
            pstmt.setString(1, jdbcTestDO.getUsername());
            pstmt.setString(2, jdbcTestDO.getEmail());
            count = pstmt.executeUpdate();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        return count;
    }
    
    public List getAllJdbcTest(){
        List list = new ArrayList();
        JdbcTestDO jdbcTestDO;
        String sql = "select * from jdbc_test;";
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            
            while(rs.next()) {
                jdbcTestDO = new JdbcTestDO();
                jdbcTestDO.setUsername(rs.getString("username"));
                jdbcTestDO.setEmail(rs.getString("email"));
                
                list.add(jdbcTestDO);
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        return list;
    }
}
 
cs



JdbcTestDO.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package myJSP.chap08;
 
public class JdbcTestDO {
    private String username;
    private String email;
    
    public JdbcTestDO () {
        
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}
cs


Comments