JSP 17スチールデータベースプログラミング(JDBC、DBPP)
54648 ワード
データベースのプログラミング順序
完了するまで2~3回目の処理を繰り返します.
DBはコンセプトです!
<条件>
1.共有
2.通行
3.保存
4.運営
JDBC(Java Database Connectivity)
JavaでDBプログラミングを行うためのAPI
JDBC APIアプリケーションの基本構成
Javaは、DBMSタイプを考慮することなく、データベース操作を処理するためにJDBC APIを使用することができる.
JDBCドライバ
DBMSとの通信を担当するJavaクラス
各DBMSには適切なJDBCドライバが必要です
->通常jarファイルとして提供
JDBCドライバのロード
**ロード?HDDからメモリへのアップロード
Class.forName(「JDBCドライバクラスのフルネーム」);
メインDBMSのJDBCドライバ
->jdbc:[DBMS]:[データベース識別子]
Oracle: jdbc:oracle:thin:@HOST:PORT:SID
MySQL : jdbc:mysql://HOST[:PORT]/DBNAME[?param=value& param1...]
MS SQL : jdbc:sqlserver://HOST[:PORT];databaseName=DB
JDBCプログラミングコード順
JDBCドライバのロード
Class.forName("oracle.jdbc.driver.OracleDriver");
->バック・メソッド:Oracle JDBCドライバはOracle~
データベース接続の作成(接続オブジェクト)
->順序:1)jdbcDriver 2)アカウントID 3)パスワード
String jdbcDriver = "jdbc:oracle:thin:@localhost:1521:xe";
String dbUser=「ユーザーアカウント名」
String dbPass="パスワード";
conn = DriverManager.getConnection(jdbcDriver,dbUser,dbPass);
作成ステータス
stmt = conn.createStatement();
クエリーの実行
rs = stmt.excuteQuery(query);
クエリ実行結果出力{{くえりじっこうけっか:しゅつりょく}}
->while(rs.next()の使用
使用したStatementオブジェクトを終了
重要だ!オフにしないと、メモリがいっぱいになり、接続オブジェクトが切断されます.
if(rs!=null)try{rs.close();}catch(SQLException ex){}
if(stmt!=null)try{stmt.close();}catch(SQLException ex){}
コネクタオブジェクトを終了
if(conn!=null)try{conn.close();}catch(SQLException ex){}
viewMemberList.jsp
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>회원 목록</title>
</head>
<body>
MEMBER 테이블의 내용<br>
<table width="100%" border="1">
<tr>
<th>이름</th><th>아이디</th><th>이메일</th>
</tr>
<%
//1.JDBC 드라이버 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
//-->오라클 JDBC 드라이버는 오라클꺼다~~
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
//2.데이터베이스 커넥션(연결 객체) 생성
//jdbcDriver? 2)계정아이디? 3)비밀번호?
String jdbcDriver = "jdbc:oracle:thin:@localhost:1521:xe";
String dbUser = "jspexam";
String dbPass = "java";
String query = "SELECT MEMBERID,PASSWORD,NAME,EMAIL FROM MEMBER";
conn = DriverManager.getConnection(jdbcDriver,dbUser,dbPass);
//Connection 객체에 위에서 만든 세개 담기
//3.Statement 생성
stmt = conn.createStatement();
//4.쿼리 실행
rs = stmt.executeQuery(query);
//5.쿼리 실행 결과 출력
while(rs.next()){
out.print("<tr>");
out.print("<td><a href='viewMember_pool.jsp?memberId="+rs.getString("MEMBERID")+"'>"+rs.getString("NAME")+"</td>");
out.print("<td>"+rs.getString("MEMBERID")+"</td>");
out.print("<td>"+rs.getString("EMAIL")+"</td>");
out.print("</tr>");
}
}catch(SQLException ex){
out.print(ex.getMessage());
ex.printStackTrace();
}finally{
//6.사용한 Statement객체 종료 (중요!!! 닫지않으면 메모리 꽉차서 Connection객체와 연결 끊어짐)
if(rs!=null)try{rs.close();}catch(SQLException ex){}
if(stmt!=null)try{stmt.close();}catch(SQLException ex){}
//7.커넥션 객체 종료
if(conn!=null)try{conn.close();}catch(SQLException ex){}
}
%>
</table>
</body>
</html>
updateForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>이름 변경 폼</title>
</head>
<body>
<form method="post" action="update.jsp">
<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>
</form>
</body>
</html>
Statementオブジェクトを使用したクエリーの実行->insert、update、delete文の実行時にint executeUpdate(String query)メソッドを使用する
===>実行結果変更のレコード数を返します.
===>ResultSetは結果値を返します!
ResultSetでの値の検索
next()メソッドを使用してデータをクエリーするかどうかを確認します(カーソルが移動しています)
データ・クエリーの主な方法
->ResultSetは、現在のカーソルがある行からデータを取得するget~~()形式の方法を提供します.
ex) getString(), getInt(),getLong()...
stmt = conn.prepareStatement(
"insert into MEMBER (MEMBERID, NAME, EMAIL) values (?, ?, ?)");
pstmt.setString(1, “a001”);//最初の疑問符の値の指定
Pstmt.setString(2,金銀台);//2番目の疑問符の値を指定
pstmt.executeUpdate()
update.jsp
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
//파라미터 목록 중 memberId 및 name을 get함
String memberId = request.getParameter("memberId");
String name = request.getParameter("name");
out.print("memberId : "+ memberId + ", name : " + name + "<br>");
//jdbc 드라이버 로딩(메모리에 올림)
Class.forName("oracle.jdbc.driver.OracleDriver");
//커넥션 객체 선언
Connection conn = null;
//Statement 객체 선언
Statement stmt = null;
String query = "UPDATE MEMBER SET NAME = '"+name+"' WHERE MEMBERID = '"+memberId+"'";
int updateCount = 0;
try{
String jdbcDriver = "jdbc:oracle:thin:@localhost:1521:xe";
String dbUser = "jspexam";
String dbPass = "java";
//커넥션 객체 생성
conn = DriverManager.getConnection(jdbcDriver,dbUser,dbPass);
//Statement 객체 생성
stmt = conn.createStatement();
//insert,update,delete --> executeUpdate()
//select --> executeQuery()
updateCount = stmt.executeUpdate(query);
}catch(SQLException ex){
out.print(ex.getMessage());
}finally{
if(stmt!=null)try{stmt.close();}catch(SQLException ex){}
if(conn!=null)try{conn.close();}catch(SQLException ex){}
}
if(updateCount>0){
out.print(memberId + "의 이름을 " + name + "(으)로 변경");
}else{
out.print(memberId + " 아이디가 없음");
}
%>
insertForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>MEMBER 테이블에 레코드 입력</title>
</head>
<body>
<form method="post" action="insert.jsp">
<table border="1">
<tr>
<th>아이디</th>
<td><input type="text" name="memberid" size="10"></td>
<th>비밀번호</th>
<td><input type="password" name="password" size="10"></td>
</tr>
<tr>
<th>이름</th>
<td><input type="text" name="name" size="10"></td>
<th>이메일</th>
<td><input type="text" name="email" size="10"></td>
</tr>
<tr>
<td colspan="4"><input type="submit" value="입력" /></td>
</tr>
</table>
</form>
</body>
</html>
insert.jsp
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
String memberid = request.getParameter("memberid");
String password = request.getParameter("password");
String name = request.getParameter("name");
String email = request.getParameter("email");
out.print(memberid + ", " + password + ", " + name + ", " + email);
Class.forName("oracle.jdbc.driver.OracleDriver");
//커넥션 객체 선언
Connection conn = null;
//Statement 객체 선언
PreparedStatement pstmt = null;
String query = "INSERT INTO MEMBER(MEMBERID,PASSWORD,NAME,EMAIL) "
+ " VALUES(?,?,?,?)";
try{
String jdbcDriver = "jdbc:oracle:thin:@localhost:1521:xe";
String dbUser = "jspexam";
String dbPass = "java";
//커넥션 객체 생성
conn = DriverManager.getConnection(jdbcDriver,dbUser,dbPass);
//Statement 객체 생성
pstmt = conn.prepareStatement(query);
pstmt.setString(1, memberid);
pstmt.setString(2, password);
pstmt.setString(3, name);
pstmt.setString(4, email);
//insert,update,delete --> executeUpdate()
//select --> executeQuery()
pstmt.executeUpdate();
}catch(SQLException ex){
out.print(ex.getMessage());
}finally{
if(pstmt!=null)try{pstmt.close();}catch(SQLException ex){}
if(conn!=null)try{conn.close();}catch(SQLException ex){}
}
%>
<!DOCTYPE html>
<html>
<head>
<title>입력</title>
</head>
<body>
MEMBER 테이블에 새로운 레코드를 입력했습니다.
</body>
</html>
作成Mem.java
package dto;
//자바빈 클래스
public class Mem {
private String memberid;
private String password;
private String name;
private String email;
//기본생성자
public Mem() {
super();
}
public String getMemberid() {
return memberid;
}
public void setMemberid(String memberid) {
this.memberid = memberid;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
接続プール
1つの方法は、データベースに関連付けられたコネクタを事前に作成してプールに格納し、必要に応じてプールから書き込み、使用終了後にプールに戻すことです.
特長
あらかじめインタフェースが作成されているため、ユーザはDBを使用するたびに、毎回作成するよりも高速であることを保証することができる.
また、コネクタの最大作成数を制御することもできるので、多くのユーザーが集まっても過負荷を防止できます.
DBCAPI接続プールの使用
1.デマンド・ライブラリ
インストール方法
https://mvnrepository.com/から
commons-dbcp検索
Apache Commons DBPP-2.9.0をクリック
jarをクリックしてダウンロード
commons-pool検索
Apache Commons Pool-2.90をクリックします
jarをクリックしてダウンロード
commons-ログ検索
Apache Commons Logging-1.2をクリック
jarをクリックしてダウンロード
ダウンロードしたファイルをコピーしてWEB-INFlibに貼り付ける
2.データベースの設定
1)アカウントの作成と承認
2)テーブルの作成
DBCPInit.java
package jdbc;
import java.sql.DriverManager;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.commons.dbcp2.ConnectionFactory;
import org.apache.commons.dbcp2.DriverManagerConnectionFactory;
import org.apache.commons.dbcp2.PoolableConnection;
import org.apache.commons.dbcp2.PoolableConnectionFactory;
import org.apache.commons.dbcp2.PoolingDriver;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
//서블릿 클래스
public class DBCPInit extends HttpServlet {
@Override
public void init() throws ServletException{
//JDBC Driver를 로딩
loadJDBCDriver();
//커넥션풀을 초기화
initConnectionPool();
}
//JDBC Driver를 로딩
private void loadJDBCDriver() {
try {
//커넥션풀이 내부에서 사용할 JDBC Driver를 로딩함
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch(ClassNotFoundException ex){
throw new RuntimeException("fail to load JDBC Driver", ex);
}
}
//커넥션풀을 초기화
private void initConnectionPool() {
try {
//의국에서 새로운 외과 의사를 생성할 때 필요한 외과가 있어야 함
//커넥션풀에서 새로운 커넥션을 생성할 때 사용할 커넥션 팩토리를 생성
ConnectionFactory connFactory =
new DriverManagerConnectionFactory(
"jdbc:oracle:thin:@localhost:1521:xe"
,"jspexam"
,"java"
);
//DBCP는 커넥션풀에 커넥션을 보관할 때 PoolableConnection을 사용
//이 Class는 내부적으로 실제 Connection을 담고 있음
//커넥션풀을 관리
PoolableConnectionFactory poolableConnFactory =
new PoolableConnectionFactory(connFactory, null);
//커넥션이 유효한지 여부 검사 시 사용할 쿼리
poolableConnFactory.setValidationQuery("select 1");
//커넥션 풀의 설정 정보 생성
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
//유휴 커넥션 검사 주기(1/1000초)
//놀고 있는 커넥션을 풀에서 제거하는 시간 기준 (5분)
poolConfig.setTimeBetweenEvictionRunsMillis(1000L * 60L * 5L);
//풀에 보관중인 커넥션이 유효한지 검사할지 여부
poolConfig.setTestWhileIdle(true);
//커넥션 최소 개수
poolConfig.setMinIdle(4);
//커넥션 최대 개수
poolConfig.setMaxTotal(50);
//커넥션풀의 설정 정보를 생성. 팩토리와 커넥션풀 설정을 파라미터로 받음
GenericObjectPool<PoolableConnection> connectionPool =
new GenericObjectPool<>(poolableConnFactory, poolConfig);
//풀러블커넥션팩토리에도 생성이 된 커넥션 풀을 연결
poolableConnFactory.setPool(connectionPool);
//커넥션풀을 제공하는 JDBC 드라이버를 등록함
Class.forName("org.apache.commons.dbcp2.PoolingDriver");
PoolingDriver driver = (PoolingDriver)DriverManager.getDriver("jdbc:apache:commons:dbcp:");
//커넥션 풀 드라이버에 생성된 커넥션풀을 등록
//jdbc:apache:commons:dbcp:ddit
driver.registerPool("ddit", connectionPool);
}catch(Exception e) {
throw new RuntimeException(e);
}//end try
}//end initConnectionPool();
}
ConnectionProvider.java
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
//커넥션을 제공해주는 클래스
public class ConnectionProvider {
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection("jdbc:apache:commons:dbcp:ddit");
}
}
JDBCUtil.java
package jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//하나의 클래스에 같은 이름의 메소드를 여러번 사용 가능?
//오버로딩
public class JdbcUtil {
public static void close(ResultSet rs) {
if(rs!=null) try {rs.close();}catch(SQLException ex) {}
}
public static void close(Statement stmt) {
if(stmt!=null) try {stmt.close();}catch(SQLException ex) {}
}
public static void close(Connection conn) {
if(conn!=null) try {conn.close();}catch(SQLException ex) {}
}
public static void close(PreparedStatement pstmt) {
if(pstmt!=null) try {pstmt.close();}catch(SQLException ex) {}
}
public static void rollback(Connection conn) {
if(conn!=null) try {conn.close();}catch(SQLException ex) {}
}
}
JSP Servlet
DBCPを使用してリストを出力する
viewMemberUsingPool.jsp
<%@page import="jdbc.ConnectionProvider"%>
<%@page import="jdbc.JdbcUtil"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
MEMBER 테이블의 내용<br>
<table width="100%" border="1">
<tr>
<th>이름</th><th>아이디</th><th>이메일</th>
</tr>
<%
//1.JDBC 드라이버 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
//-->오라클 JDBC 드라이버는 오라클꺼다~~
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
//2.데이터베이스 커넥션(연결 객체) 생성
//1)jdbcDriver? 2)계정아이디? 3)비밀번호?
String jdbcDriver = "jdbc:apache:commons:dbcp:ddit";
String query = "SELECT MEMBERID,PASSWORD,NAME,EMAIL FROM MEMBER";
// conn = DriverManager.getConnection(jdbcDriver); 이제 이거 안씀
conn = ConnectionProvider.getConnection();
//3.Statement 생성
stmt = conn.createStatement();
//4.쿼리 실행
rs = stmt.executeQuery(query);
//5.쿼리 실행 결과 출력
while(rs.next()){
out.print("<tr>");
out.print("<td><a href='viewMember.jsp?memberId="+rs.getString("MEMBERID")+"'>"+rs.getString("NAME")+"</td>");
out.print("<td>"+rs.getString("MEMBERID")+"</td>");
out.print("<td>"+rs.getString("EMAIL")+"</td>");
out.print("</tr>");
}
}catch(SQLException ex){
out.print(ex.getMessage());
ex.printStackTrace();
}finally{
//6.사용한 Statement객체 종료
JdbcUtil.close(rs);
JdbcUtil.close(stmt);
//7.커넥션 객체 종료 -> dbcp이니까 커넥션 객체를 커넥션 풀로 반환
JdbcUtil.close(conn);
}
%>
</table>
</body>
</html>
上のリストのaラベルをクリックすると詳細画面が移動しますviewMember.jsp
<%@page import="dto.Mem"%>
<%@page import="jdbc.ConnectionProvider"%>
<%@page import="jdbc.JdbcUtil"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String memberId = request.getParameter("memberId");
%>
<!DOCTYPE html>
<html>
<head>
<title>회원 정보</title>
</head>
<body>
<%
//jdbc 드라이버 로딩(메모리에 올림)
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
Mem memVO = new Mem();
String query = "SELECT MEMBERID,PASSWORD,NAME,EMAIL FROM MEMBER "
+ " WHERE MEMBERID = '"+memberId+"'";
try{
// conn = DriverManager.getConnection(
// "jdbc:oracle:thin:@localhost:1521:xe",
// "jspexam",
// "java");
conn = ConnectionProvider.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(query);
if(rs.next()){
memVO.setMemberid(rs.getString("MEMBERID"));
memVO.setName(rs.getString("NAME"));
memVO.setPassword(rs.getString("PASSWORD"));
memVO.setEmail(rs.getString("EMAIL"));
}
out.print("memVO : " + memVO.toString());
}catch(SQLException ex){
out.print(ex.getMessage());
}finally{
//6.사용한 Statement객체 종료
JdbcUtil.close(rs);
JdbcUtil.close(stmt);
//7.커넥션 객체 종료 -> dbcp이니까 커넥션 객체를 커넥션 풀로 반환
JdbcUtil.close(conn);
}
%>
<c:set var="memVO" value="<%=memVO%>" scope="request" />
<!-- scope="request" 면 하나의 객체를 공유해서 쓸수있다 -->
<table border="1">
<tr>
<th>아이디 </th><td>${memVO.memberid}</td>
</tr>
<tr>
<th>비밀번호 </th><td>${memVO.password}</td>
</tr>
<tr>
<th>이름</th><td>${memVO.name}</td>
</tr>
<tr>
<th>이메일</th><td>${memVO.email}</td>
</tr>
</table>
</body>
</html>
Reference
この問題について(JSP 17スチールデータベースプログラミング(JDBC、DBPP)), 我々は、より多くの情報をここで見つけました https://velog.io/@hazel_jo/JSP-스프링-17강-데이터베이스-프로그래밍JDBC-DBCP-방명록-만들기1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol