일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 다음 API
- 외판원 순회
- upper_bound
- Segment Tree
- 다이나믹 프로그래밍
- 삼성 코딩테스트
- 언어의 온도
- 영어회화 100일의 기적
- 그리디 알고리즘
- MST
- 백트레킹
- lower_bound
- BFS
- DP
- 성화봉송
- 성화봉송주자
- 이분탐색
- 비트마스크
- 창훈쓰다
- multiset
- 생활코딩
- 인간이 그리는 무늬
- 안드로이드 스튜디오
- 다음 지도 api
- 위상정렬
- boj
- BOJ 2098
- 캘리그라피
- yolo
- 평창동계올림픽
- Today
- Total
Hoon222y
[JSP & Servlet] 8장. 데이터베이스와 JDBC 본문
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 |
이벤트 등록
# 등록 목록
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 |
'코딩 > 교육' 카테고리의 다른 글
[JSP & Servlet] 7장. JSP와 자바 빈즈 (1) | 2019.01.16 |
---|---|
[JSP & Servlet] 6장. JSP 내장 객체 (1) | 2019.01.16 |
[JSP & Servlet] 5장. JSP 기본 문법 (0) | 2019.01.16 |
[JSP & Servlet] 3장. JSP 와의 첫 만남 (1) | 2019.01.15 |
[JSP & Servlet] 사전문제 & 2장 (1) | 2019.01.15 |