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
는 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
이란 Statement 객체 또는 PreparedStatement 객체로 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>