JDBC의 실전 활용

최우정·2022년 5월 25일
0
post-thumbnail

📒 Statement와 PreparedStatement

✏️ Statement

Statement란 실제 데이터베이스에 SQL문을 보내기 위해 필요한 객체이다.
삽입, 수정, 삭제, 검색을 처리하는 DML문을 사용할 때는 이 인터페이스를 사용한다.

  • executeQuery(): SELECT문을 실행할 때 사용된다. 이 메소드는 ResultSet 객체를 반환한다.
  • ResultSet: SELECT문을 이용하여 테이블로부터 얻어온 데이터(레코드)를 담고 있는 객체
  • executeUpdate(): 삽입, 수정, 삭제와 관련된 SQL문 실행에 사용되며 수정된 레코드 수를 반환한다. 반환하는 값으로 모든 레코드가 정상적으로 등록되었는지도 확인할 수 있다.
  • close(): Statement 객체를 모두 사용한 후 메모리에 반환하기 위해 사용한다. 객체를 사용하지 않을 때 반환해주면 메모리가 낭비되는 것을 막을 수 있다.

statementTest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<%
	Connection conn = null;
	String sql="INSERT INTO student (num, name) VALUES (7, '홍길동')";
	Statement stmt = null;

	try {
		Context context = new InitialContext();
		DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/mariaDB");
		conn = ds.getConnection();
		stmt = conn.createStatement();
		
		int result = stmt.executeUpdate(sql);
		if(result!=0){
			out.println("<h3>레코드가 등록되었습니다.</h3>");
		}
	}catch (Exception e){
			out.println("<h3>레코드 등록에 실패하였습니다.</h3>");
			e.printStackTrace();
	}
	finally{
		try{
			stmt.close();
			conn.close();
		}catch (Exception e){
			e.printStackTrace();
		}
	}
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

Statement 인터페이스는 이처럼 SQL문을 실행할 수 있는 기능을 가지고 있다.

✏️ PreparedStatement

  • PreparedStatement는 Statement와 같이 레코드 조작 및 검색 쿼리를 위한 SQL문을 전달하기 위해 쓰인다.
  • PreparedStatement를 이용하게 되면 값 매핑 기능을 사용해서 Statement 인터페이스보다 편리하게 SQL문을 전송할 수 있다.
  • PreparedStatement 객체를 사용하면 객체를 생성할 때만 단 한 번 구문 분석(컴파일)을 거치므로 반복적인 SQL 구문을 실행할 때는 PreparedStatement가 훨씬 효율이 좋다.

preparedStatementTest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<%
	Connection conn = null;
	String sql="INSERT INTO student (num, name) VALUES (?, '홍길동')";
	PreparedStatement pstmt = null;
	
	try {
		Context context = new InitialContext();
		DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/mariaDB");
		conn = ds.getConnection();
		pstmt = conn.prepareStatement(sql);

		for(int i=8; i<=11; i++){
			pstmt.setInt(1, i);
			if(pstmt.executeUpdate()!=0){
				out.println("<h3>"+i+"번 레코드를 등록하였습니다.</h3>");
				}
			}
		}catch(Exception e){
			out.println("<h3>레코드 등록에 실패하였습니다.</h3>");
			e.printStackTrace();
		}finally{
			try{
				pstmt.close();
				conn.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

String sql="INSERT INTO student (num, name) VALUES (?, '홍길동')";
'?' 바인딩 변수는 마치 함수에서의 인수와 같은 역할을 한다.

📒 ResultSet과 ResultSetMetaData

✏️ ResultSet

  • ResultSet이란 Statement 객체 또는 PreparedStatement 객체로 SELECT문을 사용하여 얻어온 레코드 값들을 테이블의 형태로 갖게 되는 객체이다.
  • SELECT문을 통해서 데이터를 얻어온다면 ResultSet 객체에 그 데이터가 저장된다.
  • 즉, ResultSet객체는 SELECT문으로 데이터를 얻어올 때는 반드시 사용해야 하는 객체이다.

  • close(): Connection, PrepareStatement, Statement, CallableStatement 객체에도 존재하는 메소드이다. 객체를 모두 사용했다면 필수적으로 실행해주어야 하는 메소드이며, 이 메소드는 객체를 반환하여 메모리의 낭비를 막는다.

  • getXXX(): ResultSet 객체의 핵심 역할을 하는 메소드이다. ResultSet 객체는 SELECT문으로 가져온 레코드를 테이블 형태로 가지고 있으며, 그 레코드에 있는 특정 컬럼의 값을 가져오기 위해서는 getXXX() 메소드를 사용한다. 레코드 값의 타입에 따라 getString(), getInt()로 달라진다. 또, getXXX() 메소드는 인자를 두 가지 방법으로 전달할 수 있다. 첫 번째 방법은 컬럼 인덱스 값을 사용하는 것이고 두 번째 방법은 컬럼 이름을 사용하는 것이다.

  • next(): 커서를 다음 행으로 이동시키는 메소드이다.

resultSetTest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<%
	Connection conn = null;
	String sql="SELECT * FROM student";
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	
	try {
		Context context = new InitialContext();
		DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/mariaDB");
		conn = ds.getConnection();
		
		pstmt = conn.prepareStatement(sql);
		rs = pstmt.executeQuery();
		
		while(rs.next()){
			out.println("<h3>"+rs.getInt(1)+","+rs.getString(2)+"</h3>");
		}
		
	}catch (Exception e){
			out.println("<h3>데이터 가져오기에 실패하였습니다.</h3>");
			e.printStackTrace();
	}
	finally{
		try{
			rs.close();
			pstmt.close();
			conn.close();
		}catch (Exception e){
			e.printStackTrace();
		}
	}
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

profile
비전공자 Java, JavaScript, Html, Css, C++ 공부중

0개의 댓글