2011. 1. 24. 15:55

group study.

서블릿

Servet = > 1. 서버에서 실행되는 자바 컴포넌트
               2. HTTP 요청을 받아서 처리
               3. HTTP 응답을 동적으로 만들어서 처리
               4. Web Container에서 실행
                     (Web Container : Servlet과 Thread pool을 관리하는 특별한 형태의 JVM)


head   url, HTTP1.1, Cookie
body   data

  [클라이언트가 보내는 요청 방식]
※GET방식
head  http://○.○.○/○.jsp?name=kim  
※POST방식
head http://○.○.○/○.jsp
body name = kim

1) GET :  요청정보를 head에다 담아가는 방식. (ex) http://***.***.***/login.jsp?user=kim&pass)
특별히 어느 방식으로 요청하지 않으면 GET이 Default 방식이 된다.
Bookmarking같은 것이 필요한 경우에는 반드시 GET방식으로 써야 한다.
(눈에 보여도 상관없는 경우도 OK.)
2) POST : 요청정보를 body에다 담아가는 방식 사용  (ex) user = kim & pass = 1, 2, 3
서버에게 보내야 하는 데이터가 경우, 전송데이터에 보안이 요구되는 경우
3)PUT ( 파일을 올릴때 ) [자주 사용하진 않음] 
4)DELETE ( 삭제 할 때 ) [자주 사용하진 않음]

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
     public FirstServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    //새로 생성. doGet방식으로 들어오든, doPost방식으로 들어오든(요청)
    //같은 방식으로 처리하겠다.
    protected void process(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
     response.setContentType("text/html;charset=utf-8");
     PrintWriter out = response.getWriter();
     out.println("<b>환영합니다</b>"); //respontse가 알아서 씀.\
  out.close();
  //이 페이지를 요청하면 환영합니다. 하고 끝~
 }
   
 protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
 }
 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
  
 }
}


[서블릿 클래스의 기능을 이해하고 생성할 수 있다.]
 HttpServlet
 init();
 service(request,response);
    ->doPost(request, response)
    ->doGet(request, response)
 destroy();

 Servlet Life Cycle
1. load servlet class
2. create sevlet instance
3. Call the init method
4. Call the service method
    서비스는 종류에 따라 달리 불러질 것
    GET - doget
    POST - dopost
5. Call the destroy dethod

The web container manages the life cycle of a servlet instance
These methods should not be called by your code. 




import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 private int count;
 
 public FirstServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

 
 /*
  * init()
  * 서블릿을 시작할 때 호출한다.
  * 시작할 때 무엇인가를 처리하고 싶다면..
  * init()에 처리
  */
 @Override
 public void init() throws ServletException {
  // TODO Auto-generated method stub
  super.init();
  count = 100;
  System.out.println("init() called... count = " + count);
  //콘솔에 창 띄움.
 }
 
 /*
  * destroy()
  * 서버를 종료시키면 호출된다.
  * 서블릿을 종료시킬 때 처리하고 싶은 것이 있다면...
  * destory()에 처리
  */
   @Override
 public void destroy() {
  // TODO Auto-generated method stub
  System.out.println("destroy() called... count = " + count);
 }
 
 
 
    //새로 생성. doGet방식으로 들어오든, doPost방식으로 들어오든(요청)
    //같은 방식으로 처리하겠다.
   protected void process(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
     response.setContentType("text/html;charset=utf-8");
     PrintWriter out = response.getWriter();
     out.println( "<b>환영합니다" + (count++) +"번째 방문객입니다.</b>"); //respontse가 알아서 씀.\
  out.close();
  //이 페이지를 요청하면 환영합니다. 하고 끝~
 }
   
   /*
    * 서비스는 종류에 따라 불러짐.
    * get - doget
    * post - dopost
    */
    protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
 }

 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
  
 }
}








 

JSP용도 : 프레젠테이션.(보여주기만 하는것)
Client의 요청을 서블릿에게 보내줌...!!!!!!
클라이언트에게 요청이 들어오면 그 요청을 서블릿이 받아서 처리할 것
서블릿은 내가 호출하는 것이 아니라, 
클라이언트가 요청을 보내면 Web Container()가 받아서,,, Web Container가 Request에 해당하는 객체를 자동적으로 만들어줌.
그 과정에서 만들어진 HttpServerRequest와 HttpServerResponse에 의해 init, doget, dopost, destroy 부름..

 

request와 response객체를 이해한다.
   HttpServlet Request
       getHeanerName()
       getHeader(name)
   HttpServletResponse
       getParameter(name)
       getParameterValues(name)
       getParameterNames()
       getRequestDispatcher("다음으로 갈 페이지명")
           ->반환하는 객체가 RequestDispatcher이다.
             이 객체가 제공하는 forward(request, response)
             메서드를 호출하여 다음 페이지로 이동한다.



요청 헤더 정보의 처리 

JSP의 request 기본 객체는 헤더 정보를 읽어올 수 있는 기능을 제공하고 있으며, 이 기능을 제공하는 메서드는 아래와 같다.
; 헤더정보 ex)웹 브라우저는 웹 부라우저의 종류에 대한 정보를 헤더에 담아서 전송

 [request 기본 객체가 제공하는 헤더 읽기 메서드]
 메서드 리턴 타입  설명 
 getHeaderNames() java.util.Enumeration  모든 헤더의 이름을 구한다. 
 getHeader(String name) String  지정한 이름의 헤더 값을 구한다. 
 getHeaders(String name) java.util.Enumeration  지정한 이름의 헤더 목록을 구한다. 
 getIntHeader(String name) int  지정한 헤더의 값을 정수 값으로 읽어온다. 
 getDateHeader(String name) long  지정한 헤더의 값을 시간 값으로 읽어온다.(이때 시간은 1970년 1월 1일 이후로 흘러간 1/1000초 단위의 값을 가진다. 


import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 private int count;
 
 public FirstServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
 
 /*
  * init()
  * 서블릿을 시작할 때 호출한다.
  * 시작할 때 무엇인가를 처리하고 싶다면..
  * init()에 처리
  */
 @Override
 public void init() throws ServletException {
  // TODO Auto-generated method stub
  super.init();
  count = 100;
  System.out.println("init() called... count = " + count);
  //콘솔에 창 띄움.
 }
 
 /*
  * destroy()
  * 서버를 종료시키면 호출된다.
  * 서블릿을 종료시킬 때 처리하고 싶은 것이 있다면...
  * destory()에 처리
  */
   @Override
 public void destroy() {
  // TODO Auto-generated method stub
  System.out.println("destroy() called... count = " + count);
 }
 
 
 
    //새로 생성. doGet방식으로 들어오든, doPost방식으로 들어오든(요청)
    //같은 방식으로 처리하겠다.
   protected void process(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
     response.setContentType("text/html;charset=utf-8");
     PrintWriter out = response.getWriter();
     out.println( "<b>환영합니다" + (count++) +"번째 방문객입니다.</b>"); //respontse가 알아서 씀.\
     
  
   //getHeaderNames() 헤더에 담겨져 오는 데이터의 이름값을 가져온다.
     Enumeration headers = request.getHeaderNames();
     //헤드 정보 이름 : 값. 으로 구성되 있음...
     while ( headers.hasMoreElements()) //요소가 있는 동안에 돌리겠다.
     {
      String name = (String)headers.nextElement();
      //getHeader(name)는 해당 이름에 해당하는 값을 읽어 온다.
      String value = request.getHeader(name);
      out.println("<li>"+ name + "  : " + value);
     }
     
     
     out.close();
  //이 페이지를 요청하면 환영합니다. 하고 끝~
 }
   
   /*
    * 서비스는 종류에 따라 불러짐.
    * get - doget
    * post - dopost
    */
    protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
 }


 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
  
 }
}





 




요청 파라미터의 처리
>request 기본 객체의 파라미터 읽기 메서드

 메서드 리턴 타입  설명 
 getParameterNames() java.util.Enumeration  웹 브라우저가 전송한 파라미터의 이름을 구한다. 
 getParameter(String name) String  이름이 name인 파라미터의 값을 구한다. 존재하지 않을 경우 null을 리턴한다. 
 getParameterValues(String name) String[]  이름이 name인 모든 파라미터의 값을 배열로 구한다. 존재하지 않을 경우 null을 리턴한다. 
 getParameterMap() java.util.Map  웹 브라우저가 전송한 파라미터의 맵을 구한다. 맵은 <파라미터 이름, 값> 쌍으로 구성된다. 



실제로 파라메터 값을 읽어올 수 있는지 확인하기 위한 jsp화면.
>POST형식으로 데이터 request 하기

 index.jsp
 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
    현재시간 : <%= new java.util.Date() %> <br></br>
  <p>데이터를 입력하고 전송 버튼을 눌러 주세요</p>
  <form action = "first.do" method = "post">
       이름 : <input type = "text" name = "name"/><br/>
       좋아하는 동물은 ?
       <input type = "checkbox" name = "pet" value = "강아지">강아지</input>
       <input type = "checkbox" name = "pet" value = "고양이">고양이</input>
       <input type = "checkbox" name = "pet" value = "송아지">송아지</input>
       <br/>
       <input type = "submit" value = "전송"/>
    </form>
</body>
</html>
 FirstSetvlet.java

 package simple.web.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 private int count;
 
 public FirstServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

 
 /*
  * init()
  * 서블릿을 시작할 때 호출한다.
  * 시작할 때 무엇인가를 처리하고 싶다면..
  * init()에 처리
  */
 @Override
 public void init() throws ServletException {
  // TODO Auto-generated method stub
  super.init();
  count = 100;
  System.out.println("init() called... count = " + count);
  //콘솔에 창 띄움.
 }
 
 /*
  * destroy()
  * 서버를 종료시키면 호출된다.
  * 서블릿을 종료시킬 때 처리하고 싶은 것이 있다면...
  * destory()에 처리
  */
   @Override
 public void destroy() {
  // TODO Auto-generated method stub
  System.out.println("destroy() called... count = " + count);
 }
 
  
    //새로 생성. doGet방식으로 들어오든, doPost방식으로 들어오든(요청)
    //같은 방식으로 처리하겠다.
   protected void process(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
     response.setContentType("text/html;charset=utf-8");
     request.setCharacterEncoding("utf-8");
     //POST 방식으로 보냈을 때 한글로 처리하기 위함
     PrintWriter out = response.getWriter();
     
     String name = request.getParameter("name");
     String[] pet = request.getParameterValues("pet");
     out.println("<b>"+ name + "님 환영합니다."
       + (count++) +"번째 방문객입니다.</b>"); //respontse가 알아서 씀.\
     out.println("좋아하는 동물을 다음과 같이 선택하셨습니다.");
     for(String p : pet){
      out.println("<li>"+p);
     }
     
  
     out.close();
  //이 페이지를 요청하면 환영합니다. 하고 끝~
 }
   
   /*
    * 서비스는 종류에 따라 불러짐.
    * get - doget
    * post - dopost
    */
    protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
 }

 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
  
 }
}







>GET형식으로 데이터를 한글로!! request 하기
1) 일단 설정을 변경하여야 한다.(톰캣 자체를)

redirectPort 밑에 라인 추가
URIEncoding = "utf-8"




2)이제 한글로 출력해 보자.  앞에 jsp 파일에서 method = "get" 부분만 수정해 주면 된다.
(default일 경우 get처리 되므로 생략하여도 get 처리된다.) 

GET방식으로 하면, head에 한글이 첨부되어 간다(블록 처리해 놓은 것 참조)

Posted by Triany
2011. 1. 20. 16:17
JDBC개념과 역할
  * JDBC 구조
     - JDBC(Java Database Connectivity)
     - 데이터베이스 벤더와 상관없이 동일한 개발이 가능함

  * JDBC 드라이버
     - JDBC 드라이버는 사용하고자 하는 데이터베이스 벤더 별로 제공 된다.


(ojdbc14.jar)를 jar 파일로 추가



 * JDBC 프로그래밍 단계

1. JDBC 드라이버 로드
    : System.sepProperty()
2. 데이터베이스 연결
3. Statement생성
4. SQL 문 전송
    : java.sql.Statement -> [DB조회] excuteQuery(),   <-  Query를 넣어서...
                                      [DB변경]  excuteUpdate()
5. 결과 받기 [excuteQuery()의 경우]
   java.sql.ResultSet(state마다 하나씩밖에 없다.
6. 연결 해제
   java.sql.Connection -> close()   


> 코드보기(select문에 대한 sql문 처리)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBTest {
 public static void main(String[] args) {
  
  //DB는 전부다 1521 포드로 연결
  //jdbc:oracle:thin:@117.17.93.103:1521:orcl
  String url = "jdbc:oracle:thin:@117.17.93.103:1521:orcl";
  String username="scott";
  String passwd = "tiger";
  
  //쿼리문 하나 만듦.
  String sql = "select * from customers";
  Connection con = null;
  Statement st = null;
  ResultSet rs = null;   //finally에서 사용하기 위해 Connection ~ ResultSet까지의 객체를 try~catch문 밖에 선언
  try {
   //[1.JDDB드라이버 로드]
   Class.forName("oracle.jdbc.driver.OracleDriver"); //예외처리
   
   //[2. 데이터 베이스 연결.. 드라이버 연결(connection 얻어오는 작업)]
   con = DriverManager.getConnection(url, username, passwd); //예외처리
   
   //3. Statement 생성 
   st = con.createStatement();
   //statement객체 쿼리를 담을 수 있는 객체, 쿼리를 제공하는 메소드가 담겨져 있는 클래스
   
   
   //4.SQL문 전송
   rs = st.executeQuery(sql);
   //쿼리한 결과가 ResultSet으로 반환됨.
   
   //5. 결과 받기
   //resultset은 처음에는 컬럼명에 있음..
   //rs의 위치는  rs-> name       phone           address
   //      rs.next()이순신    010-2222-1111     서울시 노원구 중계동
   //다음줄로 넘길려면 rs.next()
   System.out.println("customers 테이블 정보");
   System.out.printf("%-10s %-16s %-30s\n", "  이름", "|     전화번호", "|       주소");
   System.out.println("-----------------------------------------------------");
   while(rs.next()){
    System.out.printf("%-10s %-16s %-30s\n",
      rs.getString("name"), rs.getString("phone"), rs.getString("address"));
    //컬럼 이름으로 준것, index로 줘서 rs.getString(1) 도 동일
    //rs.getString(2)
    //rs.getString(3)
   }
   System.out.println("-----------------------------------------------------");
      
   
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally{
   //6. 연결끊기(해제) (가장 마지막에 만들어진 객체 부터.. 닫아줌)
   if( rs != null) try { rs.close();} catch (SQLException e) { e.printStackTrace();}
   if( st != null) try { st.close();} catch (SQLException e) { e.printStackTrace();}
   if( con != null) try { con.close();} catch (SQLException e) { e.printStackTrace();}
   
  }
 }
}
[console]
customers 테이블 정보
  이름       |     전화번호       |       주소                   
-----------------------------------------------------
김영숙        010-1112-2222    서울시 노원구 중계동                  
홍길동        010-2222-2222    서울시 노원구 중계동                  
이순신        010-3333-2222    서울시 노원구 중계동                  
장동건        010-4444-2222    서울시 노원구 중계동                  
-----------------------------------------------------



* 데이터 베이스 연결
- Connection conn = DriverManger.getConnection(JDBC_url, "아이디", "비밀번호");
- JDBC_URL 구성 = JDBC:orcle:thin:@IP주소:포트:SID
- 엑세스 DB인 경우 = JDBC:odbc:song

*statement 생성 및 쿼리 실행
- Statement 객체 생성후 SQL 문장을 변수 처리부와 함께 문자열로 구형
- 쿼리가 복잡해 질수록 성능저하 및 관리에 어려움이 있음
 //Statement객체 : 쿼리를 담는 객체 (가장 간편히 사용) static한 string을 받아서..(변동이 없는 쿼리물을 담음)
 //PreparedStatement (satement객체 상속받음) 쿼리문이 계속 바뀌는 경우
//CallofStatement(preparedStatement 객체 상속받음) 아주~~ 성능이 좋아야 하는 경우, 쿼리문을 DB가 갖고 있음.
                                                                          (쿼리문을 db에 proceduer로 등록시킴..)
-Statement stmt = conn.createStatement();
 쿼리 - 데이터변경 : executeUpdate()
       - 데이터읽기: executeQury()

*PreparedStament생성 및 쿼리 실행(insert나 add같은 경우)
 - PreparedStatement 객체 생성시 SQL 문장을 미리 생성하고 변수 부는 별도의 메서드로 대입하는 방식으로 성능과 관리 면에서 모두 권장되는 방식임
PreparedStatement pstmt = conn.prepareStatement("insert into test values(?,?)");
pstmt.setString(1,request.getParameter("username");
pstmt.setString(2,request.getParameter("email");
pstmt.executeUpdate();


* 결과받기
 ResultSet rs = pstmt.executeQuery();
- ResultSet은 커서 개념의 연결 포인터
- 기본적으로 next()메서드를 통해 로우 이동


* 연결해제
  - Connection 을 close()해 주지 않으면 사용하지 않은 연결이 유지됨
  - DB 자원을 낭비하게 됨. conn.close();
   


>customers에 insert하고, select * from customer 한것.. (sql문을 두개 사용)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class DBTest {
 public static void main(String[] args) {
  
  //DB는 전부다 1521 포드로 연결
  //jdbc:oracle:thin:@117.17.93.103:1521:orcl
  String url = "jdbc:oracle:thin:@117.17.93.103:1521:orcl";
  String username="scott";
  String passwd = "tiger";
  
  String sql2 = "insert into customers values(?,?,?)";
  String sql = "select * from customers";
  Connection con = null;
  PreparedStatement st = null;
  PreparedStatement st2 = null;
  ResultSet rs = null;   //finally에서 사용하기 위해 Connection ~ ResultSet까지의 객체를 try~catch문 밖에 선언
  try {

   //[1.JDDB드라이버 로드]
   Class.forName("oracle.jdbc.driver.OracleDriver"); //예외처리
   
   //[2. 데이터 베이스 연결.. 드라이버 연결(connection 얻어오는 작업)]
   con = DriverManager.getConnection(url, username, passwd); //예외처리
   
   //3. PreparedStatement 생성
   st2 = con.prepareStatement(sql2); //sql문 넘겨받음
   st2.setString(1, "흐흐흐3"); //자바문법이기 때문에 표시를 " " 로 해 주어야
   st2.setString(2, "010-1234-5678");
   st2.setString(3, "서울시 몽땅 우리집");
   st2.executeUpdate();
   //새로운 레코드를 추가

   st = con.prepareStatement(sql); //sql문 넘겨받음
   rs = st.executeQuery(); //이미 쿼리문을 st가 갖고 있기에 (sql)할 필요 없다.
   //쿼리한 결과가 ResultSet으로 반환됨.
   
   //5. 결과 받기
   //resultset은 처음에는 컬럼명에 있음..
   //rs의 위치는  rs-> name       phone           address
   //      rs.next()이순신    010-2222-1111     서울시 노원구 중계동
   //다음줄로 넘길려면 rs.next()
   System.out.println("customers 테이블 정보");
   System.out.printf("%-10s %-16s %-30s\n", "  이름", "|     전화번호", "|       주소");
   System.out.println("-----------------------------------------------------");
   while(rs.next()){
    System.out.printf("%-10s %-16s %-30s\n",
      rs.getString("name"), rs.getString("phone"), rs.getString("address"));
    //컬럼 이름으로 준것, index로 줘서 rs.getString(1) 도 동일
    //rs.getString(2)
    //rs.getString(3)
   }
   System.out.println("-----------------------------------------------------");
      
   
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally{
   //6. 연결끊기 (가장 마지막에 만들어진 객체 부터.. 닫아줌)
   if( rs != null) try { rs.close();} catch (SQLException e) { e.printStackTrace();}
   if( st != null) try { st.close();} catch (SQLException e) { e.printStackTrace();}
   if( con != null) try { con.close();} catch (SQLException e) { e.printStackTrace();}
   
  }
 }
}


customers 테이블 정보
  이름       |     전화번호       |       주소                   
-----------------------------------------------------
김영숙        010-1112-2222    서울시 노원구 중계동                  
홍길동        010-2222-2222    서울시 노원구 중계동                  
이순신        010-3333-2222    서울시 노원구 중계동                  
장동건        010-4444-2222    서울시 노원구 중계동                  
kim        111-1111-1111    서울시 강북                       
하하하        010-1234-5678    서울시 몽땅 우리집                   
호호호        010-1234-5678    서울시 몽땅 우리집                   
흐흐흐        010-1234-5678    서울시 몽땅 우리집                   
흐흐흐2       010-1234-5678    서울시 몽땅 우리집                   
흐흐흐3       010-1234-5678    서울시 몽땅 우리집                   
-----------------------------------------------------
Statement 객체  //사용할 때 쿼리문을 준다.
Statement st = con.createStatement();
st.executeQuery("select * from customer");   //쿼리문은 쿼리 할 때 들어감
//st.executeUpdate("insert....   delete... update...);

PreparedStatement 객체  : 객체를 만들때 쿼리문을 줌
PreparedStatement ps = con.prepareStatment("select ~~~~ ");
ps.executeQuery();  //argument없이
ps.executeUpdate(); //처음에 con.prepareStatement(" ") 할때 insert, delete, update가 들어간 경우..

만약
PreparedStatement ps = con.prepareStatment("insert into table values(?, ?, ?)");
ps.setInt(1,100);
ps.setString(2, "kdkdkd");
ps.executeQuery();





>Prepared Statement 이용하여 데이터 추가하기 (코드)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBTest {
 public static void main(String[] args) {
  
  //DB는 전부다 1521 포드로 연결
  //jdbc:oracle:thin:@117.17.93.103:1521:orcl
  String url = "jdbc:oracle:thin:@117.17.93.103:1521:orcl";
  String username="scott";
  String passwd = "tiger";
  
  String sql = "insert into customers values(?,?,?)";
  Connection con = null;
  PreparedStatement st = null;
 

  try {
   Class.forName("oracle.jdbc.driver.OracleDriver");
   con = DriverManager.getConnection(url, username, passwd); 

   st = con.prepareStatement(sql); // prepareStatement 객체는 만들때 argument를 받는다.
   st.setString(1, "이름1");
   st.setString(2, "전화번호111");
   st.setString(3, "주소2222");
   st.executeUpdate();   //st.execute()해도 됨... 차이는
   //excupteUpdate 하면 integer값이 반환되고,
   //excute()하면 boolean이 반환됨
   
   
   
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally{
   //6. 연결끊기 (가장 마지막에 만들어진 객체 부터.. 닫아줌)
   if( st != null) try { st.close();} catch (SQLException e) { e.printStackTrace();}
   if( con != null) try { con.close();} catch (SQLException e) { e.printStackTrace();}
   
  }
 }
}

Quantun DB 에 가보면 제대로 insert 된 것을 확인할 수 있다.




>이름이 홍길동인 row 검색..
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBTest {
 
 public static void main(String[] args) {
  
  //DB는 전부다 1521 포드로 연결
  //jdbc:oracle:thin:@117.17.93.103:1521:orcl
  String url = "jdbc:oracle:thin:@117.17.93.103:1521:orcl";
  String username="scott";
  String passwd = "tiger";
  
  String sql = "select * from customers where name like ?"; //쿼리문 수행
  Connection con = null;
  PreparedStatement st = null;
  ResultSet rs = null; //쿼리문 이기에 결과를 받아야 한다.
  
  try {
   Class.forName("oracle.jdbc.driver.OracleDriver");
   con = DriverManager.getConnection(url, username, passwd); 
   st = con.prepareStatement(sql); // prepareStatement 객체는 만들때 argument를 받는다.
   st.setString(1, "홍길동%");
   st.executeUpdate();  
   rs = st.executeQuery();
   System.out.println("실행결과");
   while(rs.next()){
    System.out.println(rs.getString(1) + " : " + rs.getString(2) +
      " : " + rs.getString(3));
   }
       
   
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally{
   //6. 연결끊기 (가장 마지막에 만들어진 객체 부터.. 닫아줌)
   if( rs != null) try { rs.close();} catch (SQLException e) { e.printStackTrace();}
   if( st != null) try { st.close();} catch (SQLException e) { e.printStackTrace();}
   if( con != null) try { con.close();} catch (SQLException e) { e.printStackTrace();}
   
  }
 }
}


실행결과
홍길동     : 010-2222-2222    : 서울시 노원구 중계동
name은 char(10)으로 정의되어 있으므로...
like와 "홍길동%"를 써줘야 .... 검색이 가능









DB만 전담하는 object를 만들자.
DAO(Database Access Object)
1) DB를 쓰고 싶으면 DAO를 통해서 하도록 하겠다.
(뒤에오는 DB의 규모가 얼마인지에 따라서 DAO의 규모를 한개로 할건지, 다중으로 할건지...)











Posted by Triany
2011. 1. 12. 21:15



[동아일보] 신청시기-자격요건 지정, 학교-홈피 통해 찾아야

대학 2학년이 되는 김모 씨는 ‘올해는 꼭 외부 장학금을 신청하겠다’는 각오를 다지고 있다. 지난해 학교 장학금을 신청했으나 탈락했던 기억을 떠올리면 지금도 아찔하다. 김 씨는 “장학금을 타지 않으면 350만 원이 넘는 등록금을 혼자 충당하기 어려워 끙끙댔다”고 회상했다. 그때 친구가 “다양한 외부 장학금을 노려 보라”고 조언했다. 그러나 김 씨는 대체 어디서 외부 장학금 정보를 찾아야 할지 몰라 우물쭈물하고 있다.

대부분의 대학생이 장학금을 몰라서 신청하지 못한다. 장학금은 학교에서 주는 것 말고도 국가 장학금, 재단 장학금, 기업 장학금 등 다양하다. 저소득층 장학금, 성적우수 장학금, 해외 유학생을 위한 장학금, 이공계 장학금 등 종류도 많아 그 수만 130개가 넘는 것으로 추정된다.

그러나 문제는 외부 장학금의 종류와 현황을 알 수 있는 곳이 없다는 점이다. 장학금 관련 정보를 얻기에 가장 좋은 곳은 학과 사무실이나 학생복지처다. 대부분 학과장이나 총장 추천을 받아야 해 관련 정보가 학과 사무실이나 학생복지처를 통해서만 공고되는 경우가 많기 때문이다. 적극적으로 스스로 정보를 찾아야 한다. 대부분 신청 시기와 자격이 정해져 있기 때문에 미리 알아두면 목표를 세우고 준비할 수 있어 유리하다.

○ 국가 장학금

‘미래드림 장학금’은 학생 명의의 수급자 증명서를 발급받을 수 있는 기초생활수급자 가정 대학생에게 주는 장학금이다. 입학금 및 수업료, 기성회비 등을 지원해 1인당 연간 450만원을 받는다." 한국장학재단 홈페이지(www.kosaf.go.kr)에서 온라인 신청한 뒤 대학에 수급자 증명서, 장학금 신청서 및 서약서, 성적증명서를 제출하면 대학의 심사 결과에 따라 장학금 지원 여부가 결정된다. 이달에 신청 공고가 날 예정이다.

‘희망드림 장학금’은 차상위 저소득층 가정 대학생에게 주는 장학금으로 올해 1학기 1인당 115만 원을 지원한다. 복지제도 증명서나 보험료 납부 확인서를 발급받고 온라인으로 신청한 뒤 역시 소속 대학에 신청서와 증빙서류를 내면 심사를 거쳐 선정된다. 이달에 신청 공고가 날 예정이다.

학부 성적우수 장학금도 있다. ‘이공계 국가장학생’은 이공계열 학과에 입학한 신입생 중 대학수학능력시험 성적 우수자와 대학별 입학 성적 우수자에게 지원된다. 한국장학재단 홈페이지(www.kosaf.go.kr)에서 신청서를 작성하고 증빙서류를 소속 대학에 제출하면 된다. 대학 4년간 학비 전액을 지원한다. 자세한 일정은 홈페이지를 참조하면 된다.

‘인문사회계 국가장학생’은 4년제 인문사회계열에 입학한 대학생 중 수능 성적 우수자와 대학별 입학 성적 우수자에게 제공한다. 한국장학재단 홈페이지(www.kosaf.go.kr)에서 신청서를 작성한 뒤 증빙서류를 소속 대학에 제출해야 한다. 최대 4년간 등록금 전액을 지원한다. 1666-5114

○ 기업 및 재단 장학금

‘미래에셋 박현주재단’은 성적이 우수하지만 경제적 여건이 어려운 상경(50%), 인문사회(30%), 이공계열(20%) 학부 재학생 300명을 선발한다. 직전 학기 또는 평균 평점이 3.5점 이상인 자로, 선발되면 1년간 등록금 전액을 받을 수 있다. 지원자는 1월 17∼28일 각 학교 장학담당 부서에 지원신청서, 자기소개서, 서약서, 성적증명서, 가족관계증명서, 부모 소득증빙자료 등을 제출하면 된다. 자세한 사항은 홈페이지(foundation.miraeasset.com) 참조.

‘삼성장학금’은 미래를 주도할 글로벌 인재 육성을 위해 2012년 해외 대학 진학 예정자 50명 내외에게 장학금을 지급한다. 장학생에게는 학부 과정부터 최대 박사 과정까지 학비와 현지 생활비를 지원한다. 8월 1∼31일 삼성장학회 홈페이지(www.ssscholarship.com)에 지원서, 자기소개서, 에세이를 제출한 뒤 성적증명서(SAT, GRE 등), 어학검정증명서(토플, JLPT 등), 전국 및 세계 규모 대회 수상 실적 증명서류, 논문과 연구실적, 고등학교 및 대학·대학원 성적증명서를 우편으로 제출하면 된다. 1차 합격자에 한해 면접을 보고 최종 선발한다. 02-2014-6790

‘한국고등교육재단’은 4년제 대학 1∼3학년 1학기에 재학 중인 학생들을 대상으로 대학특별장학생(40명)과 한학연수장학생(10명)을 선발한다. 졸업 때까지 매월 소정의 장학금을 지급한다. 2월 21일∼3월 11일 지원서와 추천서를 홈페이지(www.kfas.or.kr)에서 제출한 뒤 지원서 사본과 대학 성적증명서를 우편 또는 방문 제출해야 한다. 이후 1차 필기시험(3월 19일)과 2차 면접을 통해 선발한다. 02-552-3641

‘앨트웰민초 장학재단’은 4년제 대학 1학년에 재학 중이고 평균 평점 A 이상인 학생 중 향후 공직, 언론, 연구 및 기타 전문직 진출 희망자에게 장학금을 지원한다. 다음 해 1학기부터 졸업할 때까지 등록금 전액과 매월 35만 원의 면학보조금을 제공한다. 1차 서류심사(지원서, 자기소개서, 성적증명서, 수능 성적표, 고교 생활기록부 등) 합격자 중 2차 면접을 거쳐 선발한다. 대개 9월 말∼10월에 홈페이지(www.mincho.or.kr)를 통해 지원 공고한다. 02-508-2168

Posted by Triany