[JAVA] JDK 실습 (2)
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>
다음 게시글에 이어서...