데이터베이스는 오라클을 사용중이어서 그냥 오라클로 사용하겠습니다.
[File]->[New]->[Dynamic web Project] 메뉴를 실행합니다.
project name은 본인이 원하는 이름으로 해주시고
Target Runtime : Apache Tomcat v~(본인이 사용하는)
Dynamic web moudle version : 3.1
자바에서 데이터베이스 프로그래밍을 할 때에는 JDBC API를 사용합니다. JDBC는 Java DataBase Connectivity의 약자로서 자바에서 데이터베이스와 관련된 작업을 할 때 사용하는 API입니다.
JDBC 구조
JSP를 포함한 자바 어플리케이션에서 데이터베이스를 사용할 때에는 데이터베이스 종류에 상관없이 JDBC API를 이용해서 데이터베이스에 접근합니다. DMBS는 자신에게 알맞은 JDBC 드라이버를 제공하고 있습니다.
밑에 사진에 있는 jar 파일을 나중에 프로젝트 폴더 [Web-INF]에 [lib] 안에 넣어주시면 됩니다.
JDBC 프로그램의 전형적인 실행 순서
- JDBC 드라이버 로딩
- 데이터베이스 커넥션 구함
- 쿼리 실행의 위한 Statement 객체 생성
- 쿼리 실행
- 쿼리 실행 결과 사용
- Statement 종료
- 데이터베이스 커넥션 종료
위의 손서에 맞춰서 테이블로부터 정보를 읽어와 출력하는 JSP예제를 만들어 보겠습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.Statement" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%@ page import = "java.sql.ResultSet" %>
<%@ page import = "java.sql.SQLException" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
MEMBER 테이블의 내용
<table width="100%" border="1">
<tr>
<td>이름</td><td>아이디</td><td>이메일</td>
</tr>
<%
// 1.JDBC 드라이버 로딩
Class.forName("oracle.jdbc.OracleDriver");
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
String jdbcDriver = "jdbc:oracle:thin:@localhost:1521:xe";
String dbUser = "java";
String dbPass = "1234";
String query = "select * from MEMBER_TBL order by MEMBERID";
// 2. 데이터베이스 커넥션 생성
conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
// 3. Statement 생성
stmt = conn.createStatement();
// 4. 쿼리 실행
rs = stmt.executeQuery(query);
// 5. 쿼리 실행 결과 출력
while(rs.next()) {
%>
<tr>
<td><%= rs.getString("NAME") %></td>
<td><%= rs.getString("MEMBERID") %></td>
<td><%= rs.getString("EMAIL") %></td>
</tr>
<%
}
}catch(SQLException ex) {
out.println(ex.getMessage());
ex.printStackTrace();
} finally {
// 6. 사용한 Statement 종료
if (rs !=null) try { rs.close(); } catch(SQLException ex) {}
// if (stmt != null) try { stmt.close(); } catch(SQLException ex) {}
// 6-1. 사용한 PreparedStatement 종료
if (stmt != null) try { stmt.close(); } catch(SQLException ex) {}
// 7. 커넥션 종료
if (conn != null) try { conn.close(); } catch(SQLException ex) {}
}
%>
</table>
</body>
</html>
JDBC 프로그래밍의 코드는 대부분 위와 비슷하게 사용되어 진다고 합니다.
그리고 이제 오라클에서 테이블을 만들어 주겠습니다.
CREATE TABLE member_tbl (
memberid VARCHAR2(10 CHAR) NOT NULL PRIMARY KEY,
password VARCHAR2(10 CHAR) NOT NULL,
name VARCHAR2(10 CHAR) NOT NULL,
email VARCHAR2(20));
DROP TABLE member_tbl;
INSERT INTO MEMBER_TBL
VALUES('jsp1234', '123456', '김자바', 'kimjava@java.com');
INSERT INTO MEMBER_TBL
VALUES('jsp1235', '123456', '홍자바', 'hongjava@java.com');
INSERT INTO MEMBER_TBL
VALUES('jsp1236', '123456', '박자바', 'parkjava@java.com');
SELECT * FROM member_tbl;
SELECT * FROM member_tbl WHERE memberid='jsp1234';
DELETE member_tbl WHERE memberid='jsp1234';
COMMIT;
또한 JSP 에서도 실행 시켜보면 똑같이 잘나옵니다.
*포트번호*
데이터베이스 user/pw 잘입력했는지 확인 (권한도 부여 해두었는지)
데이터베이스 jar lib에 임포트 시켰는지 확인
DBMS와의 통신을 위한 JDBC 드라이버
JDBC 드라이버는 DBMS와의 통신을 담당하는 자바 클래스로서 밑에 그림에서 설명했듯이 DBMS마다 별도의 JDBC 드라이버가 필요합니다. 각 DBMS 는 JDBC 드라이버를 jar 파일 형태로 제공합니다.
JDBC 드라이버를 로딩해야 데이터베이스에 연결해서 원하는 작업을 수행할 수 있습니다.
JDBC 로딩 방법
try {
Class.forName("JDBC 드라이버 클래스의 완전한 이름");
} catch(ClassNotFoundException ex) {
// 저장한 클래스가 존재하지 않는 경우 에러가 발생
}
데이터베이스의 JDBC 드라이버에 해당하는 클래스
- MYSQL : conn.mysql.jdbc.Driver
- 오라클 : oracle.jdbc.driver.OracleDriver
- MS SQL 서버 : com.microsoft.sqlserver.jdbc.SQLServerDriver
* Class.forName() 메서드는 지정한 클래스 정보를 담고 있는 Class 인스턴스를 구해주는 기능만들 제공합니다. JDBC 드라이버에 해당하는 클래스들은Class.forName() 메서드를 통해서 로딩될 때 자동으로 JDBC 드라이버로 등록합니다.
데이터 식별을 위한 JDBC URL
웹 주소를 구분할 때 http://www.google.com이나 나 http://s-tudyprogramming.tistory.com
과 같은 URL 을 사용하는 것처럼, 데이터 베이스를 구분할 때에도 URL과 비슷한 형식을 갖는 JDBC URL을 사용합니다.
JDBC URL
jdbc:[DBMS]:[데이터베이스 식별자]
MYSQL을 예로들면(오라클은 위에꺼 그냥 봐주세용)
jdbc:mysql://HOST[:PORT]/DBNAME[?param=value¶ml=value2$...]
여기서 host는 mysql 서버의 호스트 주소를 나타냅니다. DBNAME은 데이터 베이스 이름이구요
port는 MySQL 서버가 사용하는 포트 번호를 나타냅니다.(MySQL은 기본적으로 3306)
로컬 pc에서 실행중인 MySQL 서버의 20220718 데이터베이스를 나타낼 때에는 다음과 같은 JDBC URL 을 사용하면 됩니다.
jdbc:mysql://localhost3306/20220718
또한 한글로 데이터를 올바르게 넣기 위해서는 추가 파라미터를 이용해서 캐릭터 셋을 넣어주어야 합니다.
jdbc:mysql://localhost3306/20220718useUnicode=true&characterEncoding=utf8
JDBC를 이용해서 데이터베이스를 사용하라면 데이터베이스와 연결된 커넥션을 구해야 합니다. java.sql.Connection 타입이 데이터베이스 커넥션을 나타내며, java.sql.DriverManager 클래스가 제공하는 getConnection()메서드를 사용해서 커넥션을 할 수 있습니다.
- DriverManager.getConnection(Strng jdbcURL)
- DriverManager.getConnection(Strng jdbcURL, String user, String password)
getConnection() 메서드의 jdbcURL은 데이터베이스에 연결할 때 사용할 JDBC URL을 나타냅니다.
user와 password는 데이터베이스의 계정과 암호를 나타냅니다.
커넥션을 구하지 못하면 SQLException이 발생합니다.
Connection 객체를 다 사용한 뒤에는 close() 메서드를 호출해서 Connection 객체가 사용한 시스템 자원을 반환 해줘야 합니다. 그렇지 않으면 시스템 자원이 불필요하게 소모되어 커넥션을 구할 수 없는 살황이 발생하게 됩니다.
이렇게 finally 블록에서 close() 메서드를 호출해서 사용한 자원을 반환하고 있습니다. 위에 코드들이 익셉션을 발생시킬 경우 객체가 할당되지 않으므로, null 인지의 여부를 판단한 후에 close() 메서드를 호출해야합니다.
Statement를 사용한 쿼리 실행
Connection 객체를 생성한 후에는 Connection 객체로부터 Statement를 생성하고 쿼리를 실행할 수 있습니다. Statement는 다음과 같이 Connection의 createStatement() 메서드를 사용하여 생성합니다.
Statement 객체를 사용하면 쿼리를 실행 할 수 있습니다. 밑에는 쿼리를 실행할 때 사용하는 메서드 입니다.
- ResultSet executeQuery(String query) : SELECT 쿼리를 실행합니다.
- int executeUpdate(String query) : INSERT, UPDATE, DELETE 쿼리를 실행합니다.
executeQuery() 메서드는 SELECT 쿼리의 결과값을 java.sql.ResultSet 객체제 저장해서 리턴해줍니다.
두번째 excuteUpdate() 메서드는 INSERT, UPDATE, DELETE 쿼리를 실행하고, 그 결과로 변경된 레코드의 개수를 리턴해줍니다.
MEMBER 테이블의 NAME 칼럼 값을 변경하는 JSP 코드를 써보겠습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>이름 변경</title>
</head>
<body>
<from action="/20220718/update/update_Oracle.jsp" method="post">
<table border="1">
<tr>
<td>아이디</td>
<td><input type="text" name="memberID" size=10;></td>
<td>이름</td>
<td><input type="text" name="name" size=10;></td>
</tr>
<tr>
<td colspan="4"><input type="submit" value="변경"></td>
</tr>
</table>
</from>
</body>
</html>
위의 폼을 처리해주는 update.jsp는 파라미터로 부터 회원 아이디와 이름을 입력 받아 MEMBER 테이블의 NAME 칼럼 값을 변경합니다.
<%@ page contentType = "text/html; charset=utf-8" %>
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.Statement" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%@ page import = "java.sql.SQLException" %>
<%
request.setCharacterEncoding("utf-8");
String memberID = request.getParameter("memberID");
String name = request.getParameter("name");
// 12,13행은 memberID 파라미터와 password 파라미터 값을 구합니다.
int updateCount = 0;
// Class.forName("com.mysql.jdbc.Driver");
Class.forName("oracle.jdbc.OracleDriver");
Connection conn = null;
// Statement stmt = null;
PreparedStatement stmt = null;
try {
// String jdbcDriver = "jdbc:mysql://localhost:3306/chap14?" +
// "useUnicode=true&characterEncoding=utf8";
// String dbUser = "jspexam";
// String dbPass = "jsppw";
String jdbcDriver = "jdbc:oracle:thin:@localhost:1521:XE";
String dbUser = "java";
String dbPass = "1234";
/* String query = "update MEMBER set NAME = '"+name+"' "+
"where MEMBERID = '"+memberID+"'"; */
/* String query = "update MEMBER_TBL set NAME = '"+name+"' "+
"where MEMBERID = '"+memberID+"'"; */
// member테이블의 name 칼럼을 변경하는 update 쿼리를 생성합니다.
String query = "update MEMBER_TBL set NAME = ? "+
"where MEMBERID = ?";
// 데이텁 베이스와 연결된 connection을 생성합니다.
conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
// stmt = conn.createStatement();
// Connection 으로부터 Statement를 생성합니다.
stmt = conn.prepareStatement(query); // PreparedStatement
// 인자 처리 : PrepareedStatment
stmt.setString(1, name);
stmt.setString(2, memberID);
// updateCount = stmt.executeUpdate(query);
// Statement의 executeUpdate() 메서드를 사용하여 쿼리를 실행합니다.
// 실행 결과로 변경된 레코드 개수를 updateCount 변수에 저장합니다.
updateCount = stmt.executeUpdate(); // PreparedStatement
} finally {
// Statement의 사용이 끝나면 close() 메소드를 호출하여 사용한 자운을 시스템에 반환해줍니다.
if (stmt != null) try { stmt.close(); } catch(SQLException ex) {}
if (conn != null) try { conn.close(); } catch(SQLException ex) {}
}
%>
<html>
<head><title>이름 변경</title></head>
<body>
// updateCount 가 0 보다 크면 변경된 값이 존재 하는것으로 간주합니다.
<% if (updateCount > 0) { %>
<%= memberID %>의 이름을 <%= name %>(으)로 변경
<% } else { %>
<%= memberID %> 아이디가 존재하지 않음
<% } %>
</body>
</html>
'JSP' 카테고리의 다른 글
JSP 서블릿(어노테이션으로 매핑) (0) | 2022.07.20 |
---|---|
JSP 서블릿 (0) | 2022.07.20 |
JSP JSTL 연동하기 (0) | 2022.07.15 |
JSP EL (0) | 2022.07.15 |
JSP <jsp:useBean> (0) | 2022.07.14 |