2014년 8월 29일 금요일

JDBC 연결순서[자바JSP/Servlet/JDBC/MiPlatform/XPlatform/교육/JSP/서블릿강좌/Spring교육잘하는곳/자바,JSP/spring/교육추천/JSP/JDBC실무교육]

=============== 
JDBC 연결순서 
=============== 

첫 번째 
데이터베이스와의 접속을 오픈 하기 위해 애플리케이션의 JVM안으로 특정 드라이버 클래스를 적재.  
오라클 Thin dirver : 
Class.forName("oracle.jdbc.driver.OracleDriver"); 
드라이버가 메모리에 적재될 때, java.sql.DriverManager 클래스를 사용해서      이 드라이버를 사용 가능한 드라이버로 등록 

두 번째 : DriverManager클래스를 이용하여 URL형태로 주어진 데이터 베이스에 대한 접속을 요청. 
Connection con = 
DriverManager.getConnection("jdbc:oracle:thin: 
    @dbhost:port:sid", "scott", "tiger"); 
JDBC URL은 드라이버 고유의 방식으로 개별적인 데이터베이스를 식별. 
    ☞ 오라클 : [jdbc:oracle:thin:@dbhost:port:sid] 


세 번째 : SQL 질의어 실행 
java.sql.Statement 클래스를 사용한다. 
Statement클래스는 직접 인스턴스화 되지 않고 Connection 클래스의 createStatement( ) 메소드에 의해 생성. 
    ☞ Statement stmt = con.createStatement( ); 
Statement의 executeQuery( ) 메소드를 사용하여 데이터를 포함하는 java.sql.ResultSet을 리턴받는다. 
    ☞ ResultSet rs = stmt.executeQuery("SELECT * FROM                      CUSTOMERS"); 


마지막 : Close the Connection 
connection.close(); 
Connection은 상당한 Overhead를 가져온다. 따라서 최적화된 상태를 유지하기 위해서는 반드시 Connection을 닫아 주어야 한다. 




=============== 
JDBC 연결순서 
=============== 

첫 번째 
데이터베이스와의 접속을 오픈 하기 위해 애플리케이션의 JVM안으로 특정 드라이버 클래스를 적재.  
오라클 Thin dirver : 
Class.forName("oracle.jdbc.driver.OracleDriver"); 
드라이버가 메모리에 적재될 때, java.sql.DriverManager 클래스를 사용해서      이 드라이버를 사용 가능한 드라이버로 등록 

두 번째 : DriverManager클래스를 이용하여 URL형태로 주어진 데이터 베이스에 대한 접속을 요청. 
Connection con = 
DriverManager.getConnection("jdbc:oracle:thin: 
    @dbhost:port:sid", "scott", "tiger"); 
JDBC URL은 드라이버 고유의 방식으로 개별적인 데이터베이스를 식별. 
    ☞ 오라클 : [jdbc:oracle:thin:@dbhost:port:sid] 


세 번째 : SQL 질의어 실행 
java.sql.Statement 클래스를 사용한다. 
Statement클래스는 직접 인스턴스화 되지 않고 Connection 클래스의 createStatement( ) 메소드에 의해 생성. 
    ☞ Statement stmt = con.createStatement( ); 
Statement의 executeQuery( ) 메소드를 사용하여 데이터를 포함하는 java.sql.ResultSet을 리턴받는다. 
    ☞ ResultSet rs = stmt.executeQuery("SELECT * FROM                      CUSTOMERS"); 


마지막 : Close the Connection 
connection.close(); 
Connection은 상당한 Overhead를 가져온다. 따라서 최적화된 상태를 유지하기 위해서는 반드시 Connection을 닫아 주어야 한다. 

JDBC로 Oracle의 Stored Procedure 사용하기 예제[자바JSP/Servlet/JDBC/MiPlatform/XPlatform/교육/JSP/서블릿강좌/Spring교육잘하는곳/자바,JSP/spring/교육추천/JSP/JDBC실무교육]

/* Oracle Server에 작성된 Function */ 
/* Employees Table에서 이름을 넘겨주면 나이를 Return하는 함수 */ 
/* Employees Table LayOut */ 

SQL> desc employees; 
 이름                                      널?      유형 
 ----------------------------------------- -------- ---------------------------- 
 NUM                                      NOT NULL NUMBER(5) 
 NAME                                      NOT NULL VARCHAR2(15) 
 PHONE                                              VARCHAR2(20) 
 SEX                                      NOT NULL VARCHAR2(1) 
 AGE                                                NUMBER(2) 


function employ_age (v_name in employees.name%TYPE) return number 
is 
v_age number(3) := 0; 
begin 
  select age into v_age from employees 
  where  name = v_name; 
  return v_age; 
exception 
  when no_data_found or too_many_rows then 
      return v_age; 
end; 


// storedprocedure.html 
//action 부분은 적당히 수정하세요 
<html> 
<head><title>Stored Procedure Call Test </title></head> 
<body> 
<form name=myform action=/servlet/StoredProcedure method=get> 
성명 : <input type=text name=name> 
<input type=submit> 
</form> 
</body> 
</html>      

/* StoredProcedure.java */ 
/* Oracle의 Stored Procedure를 JDBC로 이용하는 예제입니다.  StoredProcedure.java*/ 
import java.io.*; 
import java.sql.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 

public class StoredProcedure extends HttpServlet { 

  public void doGet(HttpServletRequest req, HttpServletResponse res) 
                              throws ServletException, IOException { 
    Connection con = null; 
    Statement stmt = null;    
    
    res.setContentType("text/html; charset=euc-kr"); 
    PrintWriter out = res.getWriter();  
    try { 
      // 오라클 드라이버를 Load 한다 
      Class.forName("oracle.jdbc.driver.OracleDriver"); 
      // 데이타 베이스에 접속을 한다. 
      con = DriverManager.getConnection("jdbc:oracle:thin:@211.53.71.228:1521:wink", "scott", "tiger"); 
      
      // Statement object를 생성한다. 
  CallableStatement cstmt = con.prepareCall("{? = call employ_age(?) }"); 

      //Stored Procedure의 input value의 setting및 output value의 type설정 
  cstmt.registerOutParameter(1,Types.INTEGER); 
  cstmt.setString(2, han(req.getParameter("name")));  //Procedure의 parameter setting 
  cstmt.execute();                                    //CallableStatement 실행 

  int age = cstmt.getInt(1); 

  out.println("요청하신 " + han(req.getParameter("name")) + " 님의 나이는 " + age + " 입니다."); 


        catch(ClassNotFoundException e) {  
      out.println("Couldn't load database driver: " + e.getMessage()); 
    } 
    catch(SQLException e) {  
      out.println("SQLException caught: " + e.getMessage()); 
    } 
    finally {      // 언제나 데이타 베이스 연결을 종료한다. 
      try {        if (con != null) con.close();  } 
catch (SQLException ignored) { } 
    } 
  } 
  //한글변환 함수 
  public static String han(String Unicodestr) throws UnsupportedEncodingException {    
      if( Unicodestr == null)    
        return null;    
      return new String(Unicodestr.getBytes("8859_1"),"KSC5601");    
  }    

  






 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/jQUERY개발… 오라클자바…12-271639
 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취…오라클자바…12-111165
53 [평일주간]100%환급6건,안드로이드,자바,C#,스프링3.2,SQL,힌트/… 오라클자바…03-15924
52 [주말주간]C#, ASP.NET마스터 오라클자바…01-311088
51 [평일,기업100%환급]SQL기초에서 Schema Object까지 오라클자바…01-31827
50 [평일야간]HTML5, CSS3,Ajax, jQuery마스터과정 오라클자바…01-31784
49 [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 오라클자바…01-191055
48 [평일주간,평일야간,주말]안드로이드개발자과정 오라클자바…01-11953
47 [평일야간,주말주간]JAVA,Network&WEB&Framework 오라클자바…01-031459
46 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/jQUERY개발… 오라클자바…12-271639
45 [평일야간,주말]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis… 오라클자바…12-191184
44 웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,JavaScript) 오라클자바…12-141185
43 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… 오라클자바…12-111165
42 [평일,기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 오라클자바…12-09937
41 [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 오라클자바…12-011095
40 [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍(평일주간(단기)… 오라클자바…12-011359
39 [평일야간,주말,주말야간]SQL기초에서실무까지(SQL기초,PLSQL,힌… 오라클자바…12-01829

Oracle Clob를 이용한 게시판 글내용 무제한으로 넣기 - 정민철[자바JSP/Servlet/JDBC/MiPlatform/XPlatform/교육/JSP/서블릿강좌/Spring교육잘하는곳/자바,JSP/spring/교육추천/JSP/JDBC실무교육]

Oracle 9i clob Type  

 Oracle 8i 이전 버전에서 대용량 처리는 long 타입으로 처리를 할 수 밖에 없었으며, 
이 칼럼은 한테이블에 하나만 사용할 수 있으며 (최대 크기 2GB) 더군다나 검색을 구현 
하기가 너무 어려워 포기를 해야 만 했습니다. 

 그래서 이런 문제를 보안하기 위해 나온 것이 바로 Oracle 8i부터 지원되는 대용량 데 
이터 저장 타입인 Lob(Large Object) Type 입니다.. 
  
 Lob 타입은 테이블에 여러개의 컬럼을 생성할 수 있으며 (최대 크기 4GB) 또한 long  
타입보다 훨씬 쉬운 검색기능을 제공합니다. 
  
 Lob type의 종류로는 이진 바이너리 데이터의 저장시 사용되는 Blob (Binary Large Object)와 
문서 데이터의 저장시 사용되는 Clob (Character Large Object) 그리고 
외부 파일에 저장된 이진 데이터가 있는 경로의 저장시 사용되는 BFILE 가 있습니다. 

  
 그럼 이중에서 Clob에 대해 알아보겠습니다. 

  
--------------- 
Clob에 저장하기 
--------------- 

 Clob 부연 설명을 한다면, 먼저 다른 데이터들을 먼저 데이터베이스에 넣고 그 다음 clob 
타입의 데이터를 update 해주는 방식입니다. 
그럼 자세히 알아보겠습니다. 

*참고:저는 DBConnect라는 자바빈즈를 사용하여 Oracle에 접속하였습니다. 

<jsp:useBean id="dbconn" class="jspBean.DBConnect" scope="application" /> 

    Connection  conn    = dbconn.getConnection();  
          // 자바빈즈로부터 데이터베이스 커넥션 받기 
    conn.setAutoCommit(false);  
          // Clob의 가장 중요한 부분 입니다. 
          // 반드시 CLOB column을 업데이트 하는동안 다른 process의 접근을  
          //막기위해 setAutoCommit(false)를 반드시 설정해야 합니다.  
  
    Statement  stmt    = null;  // SQL 구문 실행을 위한 Statement 선언 
    
    try { 
        stmt    = conn.createStatement();  // 커넥션으로부터 Statement 생성 
    } catch(SQLException e) { 
    } 
    
    query = "INSERT INTO gongzi VALUES (seq_gongzi_id.nextval,"; 
    query = query + "?,?,?,?,?,sysdate,empty_clob(),0,seq_gongzi_id.currval,?,?,?)"; 
          // empty_clob() 를 이용하여 공간을 확보하면서 insert 합니다. 

    PreparedStatement ps = conn.prepareStatement(query); 
      ps.setString(1, subject); 
      ps.setString(2, name); 
      ps.setString(3, password); 
      ps.setString(4, email); 
      ps.setString(5, homepage); 
      ps.setInt(6, step); 
      ps.setInt(7, position); 
      ps.setString(8,ip); 
    
    try { 
      ps.executeUpdate(); 
    } catch(SQLException e) { 
    } 
    ps.close(); 
    
    query = "select contents from gongzi where id = (select max(id) from gongzi)"; 
          //위에서 Insert한 데이터를 다시 가져옵니다. 

    ps = conn.prepareStatement(query); 
    rs = ps.executeQuery(); 
    if(rs.next()) { 
      CLOB clob = ((OracleResultSet)rs).getCLOB(1);        
      Writer writer = clob.getCharacterOutputStream(); 
      Reader src = new CharArrayReader(contents.toCharArray()); 
      char[] buffer = new char[1024]; 
      int read = 0; 
      while ( (read = src.read(buffer,0,1024)) != -1) { 
            writer.write(buffer, 0, read); // write clob. 
      } 
      src.close();        
      writer.close(); 
    } 
    conn.commit(); 
          // CLOB column에 데이터을 저장하였다면 commit()을 실행시키고  
    conn.setAutoCommit(true);  
          // conn.setAutoCommit(true)로 다시 설정합니다.  
      
    response.sendRedirect("list.jsp"); 
  



------------- 
Clob 불러오기 
------------- 

    query = "SELECT * FROM gongzi WHERE id = "+id ; 

    try { 
rs = stmt.executeQuery(query); 
    } catch(SQLException e) { 
    } 
    rs.next(); 

    String ip = rs.getString("ip"); 
    String subject = rs.getString("subject"); 
    String name = rs.getString("name"); 
    String email = rs.getString("email"); 
    String homepage = rs.getString("homepage"); 
    String created = rs.getString("created"); 

//---------------------------------------------- 
    StringBuffer output = new StringBuffer(); 
    Reader input = rs.getCharacterStream("contents"); 
    char[] buffer = new char[1024]; 
    int byteRead; 
    while((byteRead=input.read(buffer,0,1024))!=-1){ 
  output.append(buffer,0,byteRead); 
    } 
    
    String contents = output.toString(); 
          //CLOB 데이터를 불러오기 위해서는 위에서처럼  
          //rs.getCharacterStream("content")로  
          //불러서 StringBuffer에 담아야 합니다.  
//---------------------------------------------- 
    int hit = rs.getInt("hit")+1; 
    int ref = rs.getInt("ref");  
    int position = rs.getInt("position"); 

    rs.close(); 

글 제목에서 무제한이라고 했지만, 솔직히 무제한은 아닙니다..^^ 아시죠 4GB.  
텍스트로 4GB 넣으시려면 몇일 걸리지 않을까요.  


 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/jQUERY개발… 오라클자바…12-271639
 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취…오라클자바…12-111165
53 [평일주간]100%환급6건,안드로이드,자바,C#,스프링3.2,SQL,힌트/… 오라클자바…03-15924
52 [주말주간]C#, ASP.NET마스터 오라클자바…01-311088
51 [평일,기업100%환급]SQL기초에서 Schema Object까지 오라클자바…01-31827
50 [평일야간]HTML5, CSS3,Ajax, jQuery마스터과정 오라클자바…01-31784
49 [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 오라클자바…01-191055
48 [평일주간,평일야간,주말]안드로이드개발자과정 오라클자바…01-11953
47 [평일야간,주말주간]JAVA,Network&WEB&Framework 오라클자바…01-031459
46 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/jQUERY개발… 오라클자바…12-271639
45 [평일야간,주말]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis… 오라클자바…12-191184
44 웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,JavaScript) 오라클자바…12-141185
43 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… 오라클자바…12-111165
42 [평일,기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 오라클자바…12-09937
41 [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 오라클자바…12-011095
40 [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍(평일주간(단기)… 오라클자바…12-011359
39 [평일야간,주말,주말야간]SQL기초에서실무까지(SQL기초,PLSQL,힌… 오라클자바…12-01829