-
[JAVA] JDK 실습 (2)Studying/Java 2022. 8. 16. 23:27
JDK 데이터 주고받기 실습
DB 연결 방법
- 웹 jsp 문서 + 오라클 데이터베이스
- java 문서 + 오라클 데이터베이스
- jsp 문서 + java 문서 + 오라클 데이터베이스
- xml + java문서 + 오라클 데이터베이스
MySQL 테이블 생성
- cmd 오픈 > mysql system/****(비밀번호)
- test 테이블 생성
drop table test; create table test( title varchar2(10) not null, pay number(3) not null );
- wdate 필드 date 타입 추가
- alter table test add(wdate date);
- code 필드 number(4) primary key 추가
- alter table test add(code number(4) primary key);
- commit;
자바 문서에 대한 전역 변수 선언
<%@ page import="java.util.Date" %> <%@ page import="java.sql.Connection"%> <%@ page import="java.sql.DriverManager"%> <%@ page import="java.sql.*"%> <%! Connection CN=null; Statement ST=null; PreparedStatement PST=null; ResultSet RS=null; int Grn, Gcode, Gsabun, Gpay, Ghit; String Gname, Gtitle, Gconent, Gwriter, Gemail; java.util.Date Gwdate, hiredate, Gbirth; boolean Ggender, Gflag; int Gtotal=0, total=0, Stotal=0; String Gdata, data, Gmsg, msg; %>
eclipse 실행
testWrite.jsp - 제목, 급여, 코드를 입력하는 페이지
<form name="myform" method="get" action="testWriteSave.jsp"> 제목: <input type="text" name="title" id="title"><br> 급여: <input type="text" name="pay" id="pay"><br> 코드: <input type="text" name="code" id="code"><br> <input type="submit" value="데이터 저장"> <input type="reset" value="입력 취소"> </form>
- <form method="get" action="testWriteSave.jsp"> - input 태그에서 전달받은 값을 get 요청으로 testWriteSave.jsp에 전달한다.
- method : 전송 방식
- GET : 속도가 빠르고 보안은 x, 전송량 제한적
- POST : 속도가 느리고 보안은 o, 전송량 제한 없음
- action : 전달 대상, 이동할 페이지
- method : 전송 방식
-   - 공백을 넣는다.
(예시)
testWriteSave.jsp - 제목, 급여, 코드를 전달 받음 (추후 데이터 베이스에 저장하는 기능)
<% out.println("<h2>데이터 받기 request 내장 객체</h2>"); String Gtitle = request.getParameter("title"); int Gpay = Integer.parseInt(request.getParameter("pay")); int Gcode = Integer.parseInt(request.getParameter("code")); out.println("<h2>제목 데이터 = " + Gtitle + "</h2>"); out.println("<h2>급여 데이터 = " + Gpay + "</h2>"); out.println("<h2>코드 데이터 = " + Gode + "</h2>"); out.println("<h2>데이터 받기 성공입니다.</h2>"); %>
- request.getParameter("title") - 클라이언트가 서버(웹페이지)에 요청(request)하면, 요청을 받은 서버가 요청의 파라미터(parameter) 값을 얻기 위해 사용. 클라이언트가 입력하는 input 태그의 name 속성을 파라미터 이름으로 함.
- Integer.parseInt - String을 Int 형으로 변환. request를 통한 파라미터 데이터는 무조건 문자열로 전달 됨.
(* 깨알 팁) 이클립스 Window > Show View > Others > General > Problems 클릭하면 에러 코드를 볼 수 있다!
이제 맨 위에 다음 코드를 선언한다.
<%@ page import="java.util.Date" %> <%@ page import="java.sql.Connection"%> <%@ page import="java.sql.DriverManager"%> <%@ page import="java.sql.*"%>
그 다음 전역변수를 선언한다.
<%! Connection CN = null; Statement ST = null; PreparedStatement PST = null; ResultSet RS = null; int Grn, Gcode, Gsabun, Gpay, Ghit; String Gname, Gtitle, Gconent, Gwriter, Gemail; java.util.Date Gwdate, hiredate, Gbirth; boolean Ggender, Gflag; int Gtotal=0, total=0, Stotal=0; String Gdata, data, Gmsg, msg; %>
- <%! !> : member filed 영역. 여기서 선언한 변수는 전역변수.
- <% %> : 여기서 선언한 변수는 service methode에서만 사용하는 local 변수로 인식한다.
- Connection : JAVA에서 DB와 연결하기 위해 사용하는 객체. 파라미터는 URL(데이터의 위치) 및 기타 정보(DB접속 아이디, 패스워드, 포트 번호). DriveManager의 getConnection() 메소드를 호출하여 생성할 수 있음.
- Connection의 메소드
- createStatement() : SQL문을 DB에 전달하기 위한 Statement 객체를 생성
- preparedStatement(String sql) : 파라미터가 포함 된 SQL문을 DB에 전달하기 위한 객체를 생성
- prepareCall(String sql) : DB의 Stored Procedure를 호출하기 위한 객체를 생성
- close() : 현재 커넥션 객체에 할당 된 시스템 리소스를 즉시 반환
- Connection의 메소드
- Statement : DB와의 연결로부터 SQL문을 실행할 수 있도록 해주는 객체(Connection이 먼저 연결되어 있어야 한다)
- Statement의 메소드
- executeQuery() : SELECT 문을 수행할 때 사용. 반환 값은 Resultset 클래스의 인스턴스. 해당 SELECT문의 결과에 해당하는 데이터에 접근할 수 있는 방법을 제공
- excuteUpdate() : UPDATE, DELETE와 같은 문을 수행할 때 사용(수정), 반환 값은 int형으로 처리 된 데이터의 수를 반환
- close() : Statement 객체를 반환
- Ex.
- Statement의 메소드
Statement st = conn.createStatement(); st.executeUpdate("insert into test values ('" + request.getParameter("username") + "', '" + request.getParameter("email") + "')");
- PreparedStatement : SQL문을 미리 만들어두고 변수를 따로 입력하는 방식. 효율성이나 유지보수에 Good. Statement의 메서드를 모두 상속 받기 때문에 Statement클래스 메서드를 모두 사용 가능.
- Ex.
PreparedStatement ps = conn.prepareStatement("insert into test values(?,?)"); ps.setString(1, request.getParameter("username"); ps.setString(2, request.getParameter("email"); ps.executeUpdate();
- ResultSet : executeQuery() 메서드를 사용하여 SELECT 쿼리문을 실행 후, 실행 결과를 java.sql.ResultSet 형으로 반환. 그걸 담기 위한 ResultSet 객체 변수 RS를 선언.
- ResultSet의 메소드
- next() : 결과 리스트의 다음 행으로 커서를 이동 (없으면 false 리턴)
- getXxx(int column_index) - column_index 번째 칼럼 값을 Xxx 타입으로 가져온다.
- getXxx(String columName) - columnName 컬럼의 값을 Xxx 타입으로 가져온다.
- close() : ResultSet 객체를 반환
- ResultSet의 메소드
ResultSet.next() 메서드 커서의 이동은 다음과 같다.
전역변수를 선언 했으므로 int Gpay, int Gcode, String Gtitle 을 그냥 Gpay, Ccode, Gtitle로 수정한다.
testList.jsp - 입력한 데이터 리스트를 테이블로 보여주는 페이지
testWrite.jsp, testList.jsp 파일에 아래 import 선언 & 마찬가지로 전역변수를 선언한다.
<%@ page import="java.util.Date" %> <%@ page import="java.sql.Connection"%> <%@ page import="java.sql.DriverManager"%> <%@ page import="java.sql.*"%> <%! Connection CN=null; Statement ST=null; PreparedStatement PST=null; ResultSet RS=null; int Grn, Gcode, Gsabun, Gpay, Ghit; String Gname, Gtitle, Gconent, Gwriter, Gemail; java.util.Date Gwdate, hiredate, Gbirth; boolean Ggender, Gflag; int Gtotal=0, total=0, Stotal=0; String Gdata, data, Gmsg, msg; %>
오라클 DB 문서가 있는 서버 정보를 연결한다. testList.jsp, testWriteSave.jsp에 아래 코드를 추가한다.
<% try{ Class.forName("oracle.jdbc.driver.OracleDriver"); String url="jdbc:oracle:thin:@127.0.0.1:1521:XE"; CN = DriverManager.getConnection(url, "system", "1234"); System.out.println("오라클 db서버 연결 성공"); out.println("<h1>오라클 db서버 연결 성공</h1><p>"); } catch(Exception ex){System.out.println("db에러" + ex);} %>
testWriteSave.jsp
testWrite.jsp 에서 보낸 데이터를 이제 진짜 DB 서버에 저장해야 한다. 위에서 서버를 연결했으니까, 아래와 같이 사용해보자.
<% out.println("<h2>데이터 받기 request 내장 객체</h2>"); Gtitle = request.getParameter("title"); Gpay = Integer.parseInt(request.getParameter("pay")); Gcode = Integer.parseInt(request.getParameter("code")); out.println("<h2>제목 데이터 = " + Gtitle + "</h2>"); out.println("<h2>급여 데이터 = " + Gpay + "</h2>"); out.println("<h2>코드 데이터 = " + Gcode + "</h2>"); out.println("<h2>데이터 받기 성공입니다.</h2>"); // msg = "insert into test values('snow', 24, sysdate, 7700)"; msg = "insert into test values('" + Gtitle + "'," + Gpay + ",sysdate," + Gcode + ")"; // msg가 잘 완성 되었는지 테스트 System.out.println(msg); try{ ST = CN.createStatement(); ST.executeUpdate(msg); out.println(Gcode +"코드 데이터 성공처리"); System.out.println(Gcode +"코드 데이터 성공처리"); response.sendRedirect("testList.jsp"); } catch(Exception ex){ System.out.println("test테이블 저장실패 에러 " + ex); out.println("<h1>test테이블 저장에러실패 " + ex + "</h1>") ; } %>
- response.sendRedirect("testList.jsp") - testList.jsp 페이지로 화면 이동
이제 오라클 mySQL을 실행하여 select * from test; 를 하면 입력한 데이터가 테이블에 저장되어 있다!!!
testList.jsp
<%@ page import="java.util.Date" %> <%@ page import="java.sql.Connection"%> <%@ page import="java.sql.DriverManager"%> <%@ page import="java.sql.*"%>
사용되는 전역변수는 다음과 같다.
<body> <%! Connection CN = null; Statement ST = null; PreparedStatement PST = null; ResultSet RS = null; int Grn, Gcode, Gsabun, Gpay, Ghit; // hit : 조회수, sabun : 사번 String Gname, Gtitle, Gconent, Gwriter, Gemail; java.util.Date Gwdate, hiredate, Gbirth; boolean Ggender, Gflag; int Gtotal=0, total=0, Stotal=0; String Gdata, data, Gmsg, msg; %>
오라클 DB 문서가 있는 서버 정보를 연결한다.
<% try{ Class.forName("oracle.jdbc.driver.OracleDriver"); String url="jdbc:oracle:thin:@127.0.0.1:1521:XE"; CN=DriverManager.getConnection(url, "system", "qazwsx311"); out.println("<h1>오라클 db서버 연결 성공</h1><p>"); } catch(Exception ex){System.out.println("db에러"+ex);} %>
출력할 테이블 형태는 다음과 같다.
<p> <h2>testList.jsp</h2> <table border="1" width="1200" cellspacing="0"> <tr bgcolor="yellow"> <td>코 드</td> <td>제 목</td> <td>날 짜</td> <td>급 여</td> </tr>
제목, 급여, 날짜, 코드 데이터를 DB에서 가져오는 쿼리문을 작성한다.
<% msg = "select title, pay, wdate, code from test "; ST = CN.createStatement(); // 명령어생성 RS = ST.executeQuery(msg); // 생성된 명령(ST)에 쿼리문(msg)을 실행, 결과를 RS에 기억 while(RS.next()==true){ // select 결과를 순회하면서 testList 테이블을 그림 Gtitle = RS.getString("title"); Gpay = RS.getInt("pay"); Gwdate = RS.getDate("wdate"); Gcode = RS.getInt("code"); %>
데이터가 존재하면 4개의 데이터를 변수에 저장한 뒤 차례로 반복문을 돌며
데이터를 출력한다.
<tr> <td> <%= Gcode %> </td> <td> <%= Gtitle %> </td> <td> <%= Gwdate %> </td> <td> <%= Gpay %> </td> </tr> <% }//while end %> </table> <p> <a href="testWrite.jsp">[게시판입력화면]</a> <a href="testList.jsp">[게시판전체출력]</a> <a href="index.jsp">[index]</a> <p><br><br> </body>
testDetail.jsp (testList.jsp > Save as... > testDefault.jsp) - 항목 상세보기 페이지
<%@ page import="java.util.Date" %> <%@ page import="java.sql.Connection" %> <%@ page import="java.sql.DriverManager" %> <%@ page import="java.sql.*" %>
사용되는 전역변수는 다음과 같다.
<body> <%! Connection CN=null ; Statement ST=null ; PreparedStatement PST=null; ResultSet RS=null; int Grn, Gcode, Gsabun, Gpay, Ghit ; String Gname, Gtitle, Gconent, Gwriter, Gemail; java.util.Date Gwdate, hiredate, Gbirth ; // 날짜타입 boolean Ggender, Gflag ; int Gtotal=0, total=0, Stotal=0 ; String Gdata, data, Gmsg, msg ; %>
- <%= %> : 문자열, 변수값, 함수 리턴 값
- 그 외
- <%! 선언부 %> : 전역변수, 함수
- <% 스크립릿 %> : 코딩, 지역변수
- <%= 출력부 %>
- <%-- JSP 주석 --%>
- 그 외
마찬가지로 서버 연결을 하고
<% try{ Class.forName("oracle.jdbc.driver.OracleDriver"); String url="jdbc:oracle:thin:@127.0.0.1:1521:XE"; CN=DriverManager.getConnection(url, "system", "1234"); System.out.println("testDetail 오라클 db서버 연결 성공") ; }catch(Exception ex){ System.out.println("testDetail db에러 " + ex); } %>
코드가 ****인 데이터 한 건을 조회하는 DB 쿼리문을 작성한다.
<% msg = "select * from test where code = 2234"; ST = CN.createStatement(); RS = ST.executeQuery(msg); if(RS.next()==true){ Gtitle = RS.getString("title"); Gpay = RS.getInt("pay"); Gwdate = RS.getDate("wdate"); Gcode = RS.getInt("code"); } %>
데이터가 존재하면
다음과 같은 형태로 출력한다.
<p> <table width="900" border="1" cellspacing="0" cellpadding="7"> <tr align="center"> <td colspan="2"> testDetail.jsp</br> </td> </tr> <tr> <td rowspan="4" align="center"> <img src="images/pic6.png" width="500" height="300" > </td> <td width="400"> 코드: <%= Gcode %> </td> </tr> <tr> <td> 제목: <%= Gtitle %> </td> </tr> <tr> <td> 날짜: <%= RS.getDate("wdate") %> </td> </tr> <tr> <td> 급여: <%= RS.getInt("pay") %> </td> </tr> <tr align="center"> <td colspan="2"> <a href="#">[수정]</a> <a href="testWrite.jsp">[등록]</a> <a href="#">[삭제]</a> <a href="index.jsp">[index]</a> <a href="testList.jsp">[전체출력]</a> </td> </tr> </table> </body>
index.jsp - 메인 화면 페이지
<body> <div align="center"> <h2>index.jsp</h2> <img src="./images/tulips.png" width=450 height=350> <p> <a id="testWriteBtn" href="testWrite.jsp">[게시판입력화면]</a> <a id="testListBtn" href="#" onclick="listPageMove()">[게시판전체출력]</a> <a id="indexBtn" href="index.jsp">[index]</a> </div> <p><br><br> <script type="text/javascript"> setTimeout("location.href='testList.jsp'", 3000); </script> </body>
- 문서 이동 태그
- <a herf=""> </a>
- <form action=""> </form>
ssi.jsp
지금까지 testWrite, testWriteSave, testList, testDetail... 에서 전역변수 선언 및 오라클 서버 연결 코드를 "똑같이 반복" 해왔다...
코드 중복은 세상에서 제일 끔찍한 것이다. 공통적으로 사용 되는 코드부를 ssi 파일에 별도 저장한 뒤 각 파일에서 ssi 파일을 import 하도록 하자.
<%@ page import="java.util.Date" %> <%@ page import="java.sql.Connection" %> <%@ page import="java.sql.DriverManager" %> <%@ page import="java.sql.*" %>
<body> <!-- ssi.jsp = server side include문서 --> <%! Connection CN=null ; Statement ST=null ; PreparedStatement PST=null; ResultSet RS=null; int Grn, Gcode, Gsabun, Gpay, Ghit ; String Gname, Gtitle, Gconent, Gwriter, Gemail; java.util.Date Gwdate, hiredate, Gbirth ; boolean Ggender, Gflag ; int Gtotal=0, total=0, Stotal=0 ; String Gdata, data, Gmsg, msg ; %> <% try{ Class.forName("oracle.jdbc.driver.OracleDriver"); String url="jdbc:oracle:thin:@127.0.0.1:1521:XE"; CN=DriverManager.getConnection(url, "system", "1234"); System.out.println("오라클 db서버 연결 성공") ; }catch(Exception ex){ System.out.println("db에러 " + ex); } %> </body>
ssi.jsp 를 import 한 파일들의 전체 코드
더보기testWrite.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ include file="./ssi.jsp" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> [testWrite.jsp=입력화면get방식]</title> </head> <body> <p/> <h2>testWrite.jsp</h2> <form name="myform" method="get" action="testWriteSave.jsp"> 제목: <input type="text" name="title" id="title"><br> 급여: <input type="text" name="pay" id="pay"><br> 코드: <input type="text" name="code" id="code"><br> <input type="submit" value="데이터저장"> <input type="reset" value="입력취소"> </form> <p> <a href="testWrite.jsp">[게시판입력화면]</a> <a href="testList.jsp">[게시판전체출력]</a> <a href="index.jsp">[index]</a> </body> </html>
testWriteSave.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ include file="./ssi.jsp" %> <%@ page import="java.util.Date" %> <%@ page import="java.sql.Connection"%> <%@ page import="java.sql.DriverManager"%> <%@ page import="java.sql.*"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>[testWriteSave.jsp]</title> </head> <body> <p> <img src="./images/bear.gif"> <h2>testWriteSave.jsp</h2> <% out.println("<h2>데이터 받기 request 내장 객체</h2>"); Gtitle = request.getParameter("title"); Gpay = Integer.parseInt(request.getParameter("pay")); Gcode = Integer.parseInt(request.getParameter("code")); out.println("<h2>제목 데이터 = " + Gtitle + "</h2>"); out.println("<h2>급여 데이터 = " + Gpay + "</h2>"); out.println("<h2>코드 데이터 = " + Gcode + "</h2>"); out.println("<h2>데이터 받기 성공입니다.</h2>"); msg = "insert into test values('"+Gtitle+"',"+Gpay+",sysdate,"+Gcode+")"; System.out.println(msg); try{ ST = CN.createStatement(); ST.executeUpdate(msg); out.println(Gcode +"코드 데이터 성공처리 "); System.out.println(Gcode +"코드 데이터 성공처리 "); response.sendRedirect("testList.jsp"); }catch(Exception ex){ System.out.println("test테이블 저장실패 에러 " + ex); out.println("<h1>test테이블 저장에러실패 " + ex + "</h1>") ; } %> <p> <a href="testWrite.jsp">[게시판입력화면]</a> <a href="testList.jsp">[게시판전체출력]</a> <a href="index.jsp">[index]</a> <p><br><br> </body> </html>
testList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ include file="ssi.jsp" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> [testList.jsp]</title> </head> <body> <p> <h1>testList.jsp</h1> <table border="1" width="1200" cellspacing="0"> <tr bgcolor="yellow"> <td>코 드</td> <td>제 목</td> <td>날 짜</td> <td>급 여</td> </tr> <% msg = "select * from test order by code"; ST = CN.createStatement(); RS = ST.executeQuery(msg); while(RS.next()==true){ Gtitle = RS.getString("title"); Gpay = RS.getInt("pay"); Gwdate = RS.getDate("wdate"); Gcode = RS.getInt("code"); System.out.println(Gcode + " " + Gtitle + " " + Gwdate + " " + Gpay); %> <tr> <td> <%= Gcode %> </td> <td> <%= Gtitle %> </td> <td> <%= Gwdate %> </td> <td> <%= Gpay %> </td> </tr> <% }//while end %> </table> <p> <a href="testWrite.jsp">[게시판입력화면]</a> <a href="testList.jsp">[게시판전체출력]</a> <a href="index.jsp">[index]</a> </body> </html>
testDetail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ include file="./ssi.jsp" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> [testDetail.jsp]</title> </head> <body> <% msg = "select * from test where code = 2234"; ST = CN.createStatement(); RS = ST.executeQuery(msg); if(RS.next()==true){ Gtitle = RS.getString("title"); Gpay = RS.getInt("pay"); Gwdate = RS.getDate("wdate"); Gcode = RS.getInt("code"); } %> <p> <table width="900" border="1" cellspacing="0" cellpadding="7"> <tr align="center"> <td colspan="2"> testDetail.jsp</br> </td> </tr> <tr> <td rowspan="4" align="center"> <img src="images/pic6.png" width="500" height="300" > </td> <td width="400"> 코드: <%= Gcode %> </td> </tr> <tr> <td> 제목: <%= Gtitle %> </td> </tr> <tr> <td> 날짜: <%= RS.getDate("wdate") %> </td> </tr> <tr> <td> 급여: <%= RS.getInt("pay") %> </td> </tr> <tr align="center"> <td colspan="2"> <a href="#">[수정]</a> <a href="testWrite.jsp">[등록]</a> <a href="#">[삭제]</a> <a href="index.jsp">[index]</a> <a href="testList.jsp">[전체출력]</a> </td> </tr> </table> </body> </html>
다음 게시글에 이어서...
'Studying > Java' 카테고리의 다른 글
[JAVA] JDK 실습 (5) (0) 2022.08.21 [JAVA] JDK 실습 (4) (0) 2022.08.21 [JAVA] JDK 배포 파일 만들기/실행하기 (0) 2022.08.21 [JAVA] JDK 실습 (3) (0) 2022.08.21 [Java] JSP 실습 (1) (0) 2022.08.16