본문 바로가기
Web Programming/JSP

[JSP] JDBC

JDBC





JDBC : Java Database Connectivity

자바 프로그램에서 SQL문을 실행하여 데이터를 관리하기 위한 JAVA API이다.

JDBC의 특징은 다양한 데이터베이스에 대해서 별도의 프로그램을 만들 필요 없이, 해당 데이터베이스의 JDBC를 이용하면 하나의 프로그램으로 데이터베이스를 관리 할 수 있다.





오라클 드라이버를 사용하기 위한 ojdbc6jar 파일 복사


오라클 JDBC 클래스 패스에 ojdbc 파일 복사 : C:\app\samdo\product\11.2.0\dbhome_3\jdbc\lib

이클립스에 설정되어 있는 JAVA 클래스 패스에 붙혀넣기: C:\Program Files\Java\jre1.8.0_161\lib\ext





데이터베이스 연결 순서





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
    Connection conn = null;
    String driver = "oracle.jdbc.driver.OracleDriver";
    String url = "jdbc:oracle:thin:@localhost:1521:orcl";
    Boolean connect = false;
 
    try {
        Class.forName(driver);
        conn = DriverManager.getConnection(url, "system""1234");
        connect = true;
        conn.close();
    } catch (Exception e) {
        connect = false;
        e.printStackTrace();
    }
%>
cs




Statement 

executeQuery() : SQL문 실행 후 여러개의 결과값이 생기는 경우 사용 , SELECT

executeUpdate() : SQL문 실행 후 테이블의 내용만 변경되는 경우 사용 , INSERT, DELETE, UPDATE


1.Statement 객체는 Statement 인터페이스를 구현 한 객체를 Connection 클래스의 createStatement() 메소드를 호출함으로써 얻어진다.

2. Statement 객체가 생성되면 executeQuery() 메소드를 호출하여 SQL문을 실행시킬 수 있다. 메소드의 인수로 SQL문을 담은 String 객체를 전달한다.

3. Statement는 정적인 쿼리문을 처리할 수 있다. 즉, 쿼리문에 값이 미리 입력되어 있어야 한다.



PreparedStatement

1. PreparedStatement 객체는 Connection 객체의 PreparedStatement() 메소드를 사용해서 생성한다. 이 메소드는 인수로 SQl문을 담은 String 객체가 필요하다.

2. SQL문장이 미리 컴파일 되고, 실행 시간 동안 인수값을 위한 공간을 확보 할 수 있다는 점에서 Statement 객체와 다르다.

3. Statement 객체의 SQL은 실행 될 때 매번 서버에서 분석해야 하는 반면, PreparedStatement 객체는 한번 분석되면 재사용이 용이하다.

4. 각각의 인수에 대해 위치홀더를 사용하여 SQL문장을 정의 할 수 있게 해준다. 위치홀더는 ?로 표현된다.

5. 동일한 SQL문을 특정 값만 바꾸어서 여러번 실행해야 할 때, 인수가 많아서 SQL문을 정리해야 될 필요가 있을 때 사용하면 유용하다




Statement


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
<%@page import="java.sql.*"%>
<%@page import="javax.sql.*"%>
<%@page import="javax.naming.*"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
    
    
 
    <%
       Connection conn=null;
       String sql="INSERT INTO student(num,name) VALUES (6,'홍길동')";
    
       try{
          Context init=new InitialContext();
          DataSource ds=(DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
          conn=ds.getConnection();
          Statement stmt=conn.createStatement();
          
          int result=stmt.executeUpdate(sql);
          if(result!=0){
             out.println("<h3>레코드가 등록되었습니다.</h3>");
          }
       }catch(Exception e){
          out.println("<h3>연결에 실패하였습니다.</h3>");
          e.printStackTrace();
       }
    %>
  
cs





preparedStatement


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
<%@page import="java.sql.*"%>
<%@page import="javax.sql.*"%>
<%@page import="javax.naming.*"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
    
    
        
   <%
           String[] name = {"컴알못","컴잘알","삼도다","삼됴"};
           Connection conn = null;
           String sql = "INSERT INTO student (num, name) VALUES(?,?)";
           
        try{
         Context init=new InitialContext();
         DataSource ds=(DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
         conn=ds.getConnection();
         PreparedStatement stmt=conn.prepareStatement(sql);
         
         for(int i=7; i<=10; i++){
             stmt.setInt(1,i);
              stmt.setString(2, name[i-7]);
              if(stmt.executeUpdate()!=0){
                  out.println(i+"번 레코드를 등록 하였습니다.");
              }
         }
      }catch(Exception e){
         out.println("<h3>연결에 실패하였습니다.</h3>");
         e.printStackTrace();
      }
   %> 
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 
</body>
</html>
cs







커넥션 풀(DBCP)


클라이언트에서 다수의 요청이 발생 할 경우 데이터베이스에 부하가 발생하게 된다.

이러한 문제를 해결하기 위해서 커넥션 풀기법을 이용한다.





META-INF에 context.xml을 추가한다

tomcat컨테이너가 데이터베이스 인증을 하도록



context.xml

1
2
3
4
5
6
7
8
9
10
11
12
<Context>     
      <Resource name="jdbc/OracleDB"
          auth="Container" 
          driverClassName="oracle.jdbc.driver.OracleDriver" 
        type="javax.sql.DataSource"
        url="jdbc:oracle:thin:@localhost:1521:orcl"
        username="system" 
        password="1234" 
        maxActive="20"
        maxIdle="10"
        maxWait="-1"/>   
</Context>
cs



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
<%@page import="java.sql.*"%>
<%@page import="javax.sql.*"%>
<%@page import="javax.naming.*"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%     
    //META-INF에 context.xml에 해둠
      Connection conn = null;
      
      try{
          Context init = new InitialContext();
          DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
          conn = ds.getConnection();
          
          out.println("연결 되었습니다.");
      }catch(Exception e){
          out.println("연결 실패.");
          e.printStackTrace();
      }
    
%>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 
</body>
</html>
cs






'Web Programming > JSP' 카테고리의 다른 글

[JSP] Servlet  (0) 2018.07.10
[JSP] FrontController Pattern & Command Pattern  (0) 2018.05.02
[JSP] DAO DTO  (1) 2018.05.01
[JSP] 자바빈을 이용한 회원가입 만들기  (4) 2018.04.16
[JSP] 한글 처리  (1) 2018.04.15