본문 바로가기

웹/jsp

jsp14 -db연동 2 :statment, preparedstate

A>statement ,preapreStatement

sql실행과 관련된 객체

 

1. executeQuerty(String sql) : select문 수행 시 사용,

                                       리턴타입은 ResultSet

 

2.executeUpdate(String sql) : 삽입,수정,삭제와 관련된 sql문

                                      삽입,수정,삭제가 적용된 행 수를 int형으로 리턴

                                      

3.close() : statment 객체 반환

 

 

B>statement

과정

- 뭐가 되었든 Connection에서 할 수 있다. 

  DB랑 연결을 해주는 객체니까

 

-수행은 statement객체를 통해 해야한다. 

  그리고 statement객체 역시

  Connection객체에서 createStatement() 를 통해 

  할 수 있다.

 

1. Connection 객체를 생성

2. DataSource (dbcp풀의 역할) 에서 .getConnection() 

3. statement 생성 Connection conn.createStatement()

4. statement 를 통해 수행

 

예시1. 삽입하기.jsp

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
<%@page import="java.sql.Statement"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="java.sql.Connection"%>
<%@page import="javax.naming.*"%>
<%
    Connection conn =null;
    String sql = "INSERT INTO student2 (num,name) VALUES (7,'홍길동')";
    Statement stmt = null;
    try{
        Context init = new InitialContext();
        DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
        conn =ds.getConnection();
        
        stmt =conn.createStatement();
        
        int result = stmt.executeUpdate(sql);
        if(result !=0){
//result 가 0이면 실행 결과가 없다는 뜻
            out.println("<h3> 레코드가 등록되었습니다.</h3>");
        }
    }catch(Exception e){
        out.println("<h3> 레코드가 실패되었습니다.</h3>");
        e.printStackTrace();
    }finally{
        try{
            stmt.close();
           conn.close();
        }catch(Exception e){
//만약 statement 나 Connection이 안 만들어져 있으면
//오류가 나기 때문에 예외처리
            e.printStackTrace();
        }
    }
%>
 
cs

 

C>PreparedStatement

과정

Connection 객체 생성

DataSource 에서 getConnection() 으로 Connection 객체 가져오기

prepareStatement객체 생성 : Connection conn.prepareStatement()

 

예시2. 등록.jsp

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
<%@page import="javax.naming.*"%>
<%@page import="javax.sql.*"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
    Connection conn = null;
    String sql ="INSERT INTO student2 VALUES(?,'홍길동')";
    PreparedStatement pstmt = null;
    try{
        Context init = new InitialContext();
        DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
        conn = ds.getConnection();
        pstmt= conn.prepareStatement(sql);
        
        for(int i =0; i<=11;i++){
            pstmt.setInt(1,i);
            if(pstmt.executeUpdate()!=0){
                out.println("<h3>"+i+"번 레코드 등록 성공</h3>");
            }
        }
    }catch(Exception e){
        out.println("<h3> 레코드 등록 실패</h3>");
        e.printStackTrace();
    }finally{
        try{
            pstmt.close();
            conn.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
%>
cs

statement 와 차이점

setInt, setString 과 같은 메소드로 ?를  채워줘야함

setString(?의 순번, 값)

 

 

D>ResultSet과 ResultSetMetaData

select 문을 사용하여 얻어온 레코드 값들을 저장하는 객체

resultSet 커서라고 생각해도 된다.

 

rs.next()로 커서를 움직이면서 레코드 값들을 가져오거나

get타입() 메소드로 레코드 값을 지정한 타입으로 가져온다.

get타입()의 종류

get타입(String 칼럼이름)

get타입(int 칼럼 인덱스)

 

예시3. select.jsp

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
<%@page import="javax.sql.*"%>
<%@page import="javax.naming.*"%>
<%@page import="java.sql.*"%>
 
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
 
<%
    Connection conn = null;
    String sql = "SELECT * FROM student2";
    PreparedStatement pstmt = null;
    ResultSet rs =null;
    
    try{
        Context init = new InitialContext();
        DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
        conn = ds.getConnection();
        pstmt = conn.prepareStatement(sql);
        rs= pstmt.executeQuery();
        
        while(rs.next()){
            out.println("<h3>"+rs.getInt(1+ "," +rs.getString(2)+"</h3>");
        }
    }catch(Exception e){
        out.println("<h3>실패</h3>");
        e.printStackTrace();
    }finally{
        try{
            rs.close();
            pstmt.close();
            conn.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
%>
 
 
cs

 

1.resultSet의 커서 자유롭게 움직이기

absolute(int row) 지정한 위치로 커서 이동

beforeFirst() : 커서를 처음위치로 이동

afterLast(): 마지막 위치로

first(): 처음 레코드 존재 행 이동

last(): 마지막 레코드 존재 행 이동

next() : 다음 레코드 행으로 이동

previous(): 이전 레코드 행으로 이동

 

2.ResultSet옵션

 

 

 

 

 

커서를 움직이기 위해선

prepareStatement 에 TYPE_SCROLL_SENSITIVE  가 있어야 한다.

예시

pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,
                                 ResultSet.CONCUR_UPDATABLE); 

 

예시4. 커서를 움직이면서 select한 결과 출력.jsp

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
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<%
    Connection conn = null;
    String sql = "SELECT * FROM student2";
    PreparedStatement pstmt = null;
    ResultSet rs = null;
 
    
   try {
        Context init = new InitialContext();
        DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
        conn = ds.getConnection();
        
        pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,
                                        ResultSet.CONCUR_UPDATABLE);
        rs = pstmt.executeQuery();
        rs.last();
        out.println(rs.getInt(1+ "," + rs.getString(2)+ "<br>");
        rs.first();
        out.println(rs.getInt(1+ "," + rs.getString(2)+ "<br>");
          rs.absolute(3);
        out.println(rs.getInt(1+ "," + rs.getString(2)+ "<br>");
 
   }catch(Exception e){
       out.println("<h3>데이터 가져오기 실패</h3>");
      e.printStackTrace();
    }finally{
       try{
          rs.close();
          pstmt.close();
          conn.close();
       }
       catch(Exception e){
          e.printStackTrace();
       }
    }
%>
cs

 

 

E>ResultSetMetaData

ResultSet으로 얻어온 레코드들의 정보

- getColumnCount(): 저장되어 있는 테이블 칼럼 수

- getColoumnLabel(int column): 해당 번호 칼럼의 title 리턴

- getColoumnName(int column) :해당 번호 칼럼 이름

- getColumnType(int column):해당 번호 칼럼의 데이터 타입 int 형 반환

- getColumnTypeName(int column) : 해당 번호 칼럼 데이터 타입 String 형 리턴

 

F>트랜잭션 관리

commit , rollback

 

autoCommit 해제 --자바는 기본이 autoCommit

Connection conn.setAutoCommit(false)
로 해야 트랜잭션 컨트롤이 가능

 

롤백을 하게 되면 트랜잭션 컨트롤의 시작점으로 돌아간다.

 

예시5.rollback,autocommit.jsp

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
 
<%@page import="javax.sql.*"%>
<%@page import="javax.naming.*"%>
<%@page import="java.sql.*"%>
 
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
    Connection conn = null;
    PreparedStatement pstmt =null;
    ResultSet rs =null;
    String sql1 = "INSERT INTO student2(num,name) VALUES(13,'홍길동')";
    String sql2 = "SELECT *FROM student2 WHERE num=12";
    
    try{
        Context init = new InitialContext();
        DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
        conn = ds.getConnection();
        conn.setAutoCommit(false);  //transaction control 시작 위치
        
        pstmt= conn.prepareStatement(sql1);
        pstmt.executeUpdate();
        
        pstmt= conn.prepareStatement(sql2);
        rs = pstmt.executeQuery();
        if(!rs.next()){
            conn.rollback(); //transaction control 시작 위치로 돌아간다.
            out.println("<h3>데이터 삽입에 문제가 발생해 롤백했습니다.");
        }else{
            conn.commit();
            out.println("<h3>데이터 삽입에 완료했습니다.");
        }
        conn.setAutoCommit(true);
    }catch(Exception e){
        out.println("<h3>데이터 삽입에 실패했습니다.");
        e.printStackTrace();
    }finally{
        try{
            rs.close();
            pstmt.close();
            conn.close();
        }catch(Exception e){
            e.printStackTrace();    
        }
        
    }
 
%>
cs

 

 

I>stored procedure 와 callableStatmenet

프로시저를 사용하는 것.

프로시저의 수행은 서버에서 , 결과는 클라이언트로 보내기 때문에

실행 속도도 빠르고, 네트워크 부하도 덜함

 

프로시저를 호출할때 쓰는 객체가

callableStatement

사용법

CallableStatement cs =conn.prepareCall("{call 프로시져이름(?,?,?)}");

cs.setInt(1,1);

cs.setString(2,"넣을값")

cs.registerOutParameter(3,java.sql.Types.VARCHAR);

cs.execute();

cs.close();

 

 

' > jsp' 카테고리의 다른 글

jsp 15 -커스텀 태그와 jstl  (0) 2021.01.28
jsp13 - DB 연동  (0) 2021.01.27
jsp11 -파일 업로드  (0) 2021.01.27
jsp10 - 예외처리  (0) 2021.01.27
jsp-9 세션과 쿠키  (0) 2021.01.27