DB Programming - JDBC

Overview

• DB Programming - Oracle

- SQL

- PL/SQL: Oracle의 procedure, function, package 등을 생성하는데 사용.

- Pro*C/C++: Oracle에서 제공하는 pre-compiler

⇒ C/C++ program에서 SQL, PL/SQL을 사용하면 이를 C/C++로 compile해줌.

- JDBC: Java program에서 SQL문을 사용하여 DB의 데이터를 access.

Java Overview

• Write-Once, Run-Everywhere: bytecode on JVM

• Object-oriented programming language:

• javac: Java compiler	- Java code (*.java) → bytecode (*.class)

java : Java interpreter  - run bytecode (*.class)

jar   : Java archive tool - compress class files into a *.jar file

javac

*.java

*.class

network

class loader

bytecode checker

class library

interpreter

JVM

result

• *.java program - class & object, c.f. functions in C

- class: 객체(object)를 만들기 위해 사용되는 형판(template).

⇒ 객체를 만들기 위한 [public/private] variable들과 method들이 미리 정해져 있음.

variables

methods

class

hierarchy

inheritance

variables

methods

variables

methods

……

- object: class로부터 생성되는 instance.

⇒ 동일 class로부터 여러 개의 객체를 생성할 수 있음.

⇒ class로부터 생성된 각 객체는 동일한 variable들과 method들을 가지나, variable의 값들은 다를 수 있음.

- class variable: object reference

⇒ object는 생성자(constructor)를 이용하여 메모리에 생성됨.

Ex)

// IMPORT other classes in packages... (CLASSPATH에서 설정)

package	Mypackage1;

import	java.io.*;

…	…

import	java.sql.*;

import	com.ibm.xml.parser.*;

// DEFINE my classes...

[public/final/private] class MyClass1 extends UpperClass1

implements InterfaceA, InterfaceB, … {

// [static/final] type var1=val	; global variables

// [public/private/protected] type var2=val	; member variables

// [public] MyClass1(arg1, ...)	; constructor

// [public/private/protected] [static/final/abstract/synchronized] ret_val	Method1(arg1, )

// implements methods in Interfaces

}

// DEFINE a main class...

class MainClass {

// constants

private static final	CONST1 = 10;

public static void main (String args[]) {

// local variables

// MyClass1 obj1	; object reference variables

try {

// USE objects from classes in packages...

// USE objects from MyClasses...

obj1   = new MyClass1(arg1, … )	// Constructor

ret_val = obj1.method1(arg1, … )	// Method

obj1.var1 = value	// variables in a class

… … …

}

catch(Exception1 e1){

// DEAL with errors...

e1.printStackTrace();

}

}// End of main

- class/variable/method의 접근한정자: Encapsulation과 information hiding 제공

①public: 항상 접근가능.

②protected: 소속된 class의 하위 class와 소속된 class와 같은 package에 있는 다른 class에서만 접근가능.

③private: 소속된 class내에서만 접근가능.

⇒ 하위 class에도 상속되지 않음.

*접근한정자가 없는 경우: 같은 package와 하위 class에서 접근가능.

- class/variable/method의 종류

①static: (object가 아니고) class에 속한 'global' variable/method.

⇒ object를 통해서는 접근할 수 없고, class이름을 통하여 접근.

②final: 단 한 번 초기화한 후 변경할 수 없는 variable이나 subclass에서 overloading될 수 없는 method.

③abstract: 선언부분만 가지고 몸체부분은 가지지 않는 method이며 몸체 부분은 subclass에서 치환됨.

④synchronized: 임계영역을 사용하여 여러 thread들을 동기화해주는 method.

Swing Overview

∙• GUI Interface

JDBC Overview

• Write-Once, Run-EveryDB

• JDBC (Java Database Connectivity) Driver

① Type 1 : Java 개발 tool인 JDK2와 연결하기 위해 ODBC API로의 software gateway (bridge)를 제공한다. 이 드라이버를 사용하기 위해서는 클라이언트쪽에 이 드라이버가 설치되어 있어야 한다.

② Type 2 : DBMS에서 사용되는(DBMS-native) API 드라이버로 각각의 DBMS 업체들이 제공하는 C 혹은 C++ method를 Java codes가 호출하는 방식이다. 이 유형도 클라이언트쪽에 드라이버가 설치되어 있어야 한다.

③ Type 3 : 클라이언트에서 일반적인 network API를(net-protocol) 통해 보낸 정보를 서버가 DBMS에 맞는 형태로 변환하는 방식이다. 즉, 클라이언트에 존재하는 JDBC 드라이버는 socket을 사용하여 서버에 존재하는 미들웨어(middleware)  애플리케이션에 연결하고, 이 애플리케이션은 클라이언트의 요청을 사용하고자 하는 DBMS에 맞는 API로 전환한다. 클라이언트쪽에 드라이버를 설치할 필요가 없으므로 편리하다.

④ Type 4 : DBMS에서 사용되는(DBMS-native) network protocol을 통하여 Java socket으로 직접 DBMS와 정보를 주고받을 수 있는 방법이다. 가장 직접적인 순수(fully) Java 기법으로서 이런 형태의 드라이버는 DBMS 제조 업체에서 제공해 주어야 한다.

- JDBC driver types

Type 1	Type 2

JDBC1 driver

DBMS1 API

DBMS1 driver

DBMS1 protocol

DBMS2 protocol

Network

DBMS1 protocol

DBMS2 protocol

JDBC API

Application

DBMS1

DBMS2

DB1

DB2

DBMS2 API

DBMS2 driver

JDBC2 driver

JDBC driver

ODBC API

ODBC driver

DBMS1 protocol

DBMS2 protocol

Network

DBMS1 protocol

DBMS2 protocol

JDBC API

Application

DBMS1

DBMS2

DB1

DB2

Type 3	Type 4

JDBC1 driver

JDBC API

Application

DBMS1 protocol

DBMS2 protocol

Network

DBMS1 protocol

DBMS2 protocol

DBMS1

DBMS2

DB1

DB2

JDBC2 driver

JDBC driver

Indep. protocol

Network

DBMS1 protocol

DBMS2 protocol

JDBC API

Application

DBMS1

DBMS2

DB1

DB2

Middleware

DBMS1 protocol

DBMS2 protocol

Indep. protocol

Network

JDBC Driver Installation

• DB Connectivity by using Java

(http://java.sun.com/products/jdbc/driverdesc.html)

Type	Name	JDBC-API- Translated-into	DB Access- through	Codes-used	Provide-by
1	JDBC-ODBC bridge	ODBC API	Client-side ODBC driver	Depends on the ODBC driver	Sun etc.
2	Native-API Partly Java	DBMS dependent client-side API	Client-side DB driver	Partly Java	DBMS vendor
3	Net-Protocol Fully Java	DBMS independent protocol	Translated into the server-side protocol	Fully Java	Middleware vendor
4	Native-Protocol Fully Java	DBMS dependent protocol	Direct connection to the server	Fully Java	DBMS vendor

Ex) Oracle 8/8i & Java 1.1.X on Linux

- JDBC driver: http://otn.oracle.com/

- /etc/profile: export CLASSPATH=".:$ORACLE_HOME/jdbc/lib/classes111.zip"

Ex) MySQL

- http://dev.mysql.com/usingmysql/java/

JDBC Programming

• Program Overview

① loading a JDBC driver

② connecting DB

③ statement object를 만듬

④ SQL문 전송

- 결과값을 받는 경우 (SELECT) - executeQuery

- 결과값이 없는 경우 (CREAT, INSERT, DELETE, UPDATE) - executeUpdate

- return value

SQL	method	return value
CREATE TABLE	executeUpdate()	0
INSERT	executeUpdate()	insert한 tuple 수
UPDATE	executeUpdate()	update한 tuple 수
DELETE	executeUpdate()	delete한 tuple 수
SELECT	executeQuery()	ResultSet

⑤ 결과값(result set) 처리

⑥ close and disconnect

Ex)

// JDBC interface, No implementation...

import java.sql.*;

class JdbcTest {

public static void main (String args[]) throws SQLException {

if(args.length<2){

System.out.println("\nUsage: java JdbcTest db_user_id db_user_passwd\n");

System.exit(0);

}

String DB_URL    = "jdbc:oracle:thin:@comedu.knue.ac.kr:1521:COMORA1";

String DB_USER   = args[0];

String DB_PASSWD = args[1];

String QUERY_DEPT="select * from dept";

// JDBC classes...

Connection conn;

Statement stmt;

ResultSet rset;

try{

// Implementation classes are loaded from CLASSPATH at run time...

Class.forName("oracle.jdbc.driver.OracleDriver");

// OR DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

System.out.println("\nDriver Loaded...");

conn = DriverManager.getConnection(DB_URL,DB_USER,DB_PASSWD);

System.out.println("\nConnection Created...");

stmt = conn.createStatement();

System.out.println("\nDB Connected...\n");

rset = stmt.executeQuery(QUERY_DEPT);

// void setQueryTimeOut(int sec) - 주어진 시간만큼만 기다린 후

//	SQLException 발생.

// ex) setQueryTimeOut(2);

while(rset.next()){	// return true/false...

String deptno	= rset.getString(1);

String dname	= rset.getString(2);

String loc	= rset.getString(3);

// OR String deptno	= rset.getString("deptno");

// OR String dname	= rset.getString("dname");

// OR String loc	= rset.getString("loc");

System.out.println(deptno+" "+dname+" "+loc);

}

rset.close();

stmt.close();

conn.close();

}catch(Exception e){ e.printStackTrace(); }

}

}

• CREATE/INSERT/UPDATE/DELETE

- executeUpdate() 사용

Ex)

import java.io.*;

import java.sql.*;

class JdbcTest1{

public static void main (String args[]) throws SQLException {

if(args.length<2){

System.out.println("\nUsage: java JdbcTest1 db_user_id db_user_passwd\n");

System.exit(0);

}

String DB_URL    = "jdbc:oracle:thin:@comedu.knue.ac.kr:1521:COMORA1";

String DB_USER   = args[0];

String DB_PASSWD = args[1];

String QUERY_CRT="create table test(name varchar2(10), tel varchar2(15))";

String QUERY_IST1="insert into test values('mypark', '(310)209-3348')";

String QUERY_IST2="insert into test values('tykim', '(310)825-0272')";

String QUERY_UPT="update test set tel='(310)825-3348' where name='mypark'";

String QUERY_DRP="drop table test";

String mode="";

Connection conn;

Statement stmt;

try{

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

System.out.println("\nDriver Loaded...");

conn = DriverManager.getConnection(DB_URL,DB_USER,DB_PASSWD);

System.out.println("\nConnection Created...");

stmt = conn.createStatement();

System.out.println("\nDB Connected...\n");

Usage usg = new Usage();

usg.printUsage();

BufferedReader ir=new BufferedReader(new InputStreamReader(System.in));

Display dly = new Display();

do{

System.out.print("command> ");

mode = ir.readLine();

// SELECT ...

if (mode.equals("s")){

dly.displayResult(stmt);

}

// CREATE TABLE...

else if (mode.equals("c")){

try{

stmt.executeUpdate(QUERY_CRT);

System.out.println("Table created... \n");

}

catch(SQLException e){

System.out.println("ERROR: Table already exists... \n");

e.printStackTrace();

System.out.println("");

}

}

// INSERT...

else if (mode.equals("i")){

stmt.executeUpdate(QUERY_IST1);

stmt.executeUpdate(QUERY_IST2);

System.out.println("Tuples inserted... \n");

dly.displayResult(stmt);

}

// UPDATE...

else if (mode.equals("u")){

stmt.executeUpdate(QUERY_UPT);

System.out.println("Tuples updated... \n");

dly.displayResult(stmt);

}

// DROP TABLE...

else if (mode.equals("d")){

stmt.executeUpdate(QUERY_DRP);

System.out.println("Table droped... \n");

}

else if (mode.equals("q")){

System.out.println("Bye... \n");

break;

}

else{

usg.printUsage();

}

}while(!mode.equals("q"));

stmt.close();

conn.close();

}catch(Exception e){ e.printStackTrace(); }

}// End of main

}// End of class

class Usage{

public void printUsage(){

System.out.println("\n--- Usage ---");

System.out.println("'c' - create table test");

System.out.println("'i' - insert");

System.out.println("'s' - select");

System.out.println("'u' - update");

System.out.println("'d' - drop table test");

System.out.println("'q' - quit\n");

}

}// End of class

class Display{

ResultSet	rset;

ResultSetMetaData rsmd;

String QUERY_SLT="select * from test";

String BLANK    ="          ";

public void displayResult(Statement stmt){

int rowno=1;

int colsize=0;

int i;

String header ="";

String colname="";

try{

rset = stmt.executeQuery(QUERY_SLT);

rsmd	= rset.getMetaData();

colsize = rsmd.getColumnCount();

for(i=1;i<=colsize;i++){

colname=rsmd.getColumnLabel(i);

header=header+BLANK+colname;

}

System.out.println(header);

while(rset.next()){

String name = rset.getString(1);

String tel	= rset.getString(2);

System.out.println("Row "+rowno+" : "+name+BLANK+tel);

rowno++;

}

System.out.println("");

rset.close();

}

catch(SQLException e){

System.out.println("ERROR: Table not exists... \n");

e.printStackTrace();

System.out.println("");

}

}

}// End of class

• PreparedStatement

- SQL 문을 미리 compile하여 전송하므로 performance 향상.

- variable 사용 가능.

Ex)

import java.io.*;

import java.sql.*;

class JdbcPrepStmt{

public static void main (String args[]) throws SQLException {

if(args.length<3){

System.out.println("\nUsage: java JdbcPrepStmt db_id db_passwd table_name\n");

System.exit(0);

}

String DB_URL    = "jdbc:oracle:thin:@comedu.knue.ac.kr:1521:COMORA1";

String DB_USER   = args[0];

String DB_PASSWD = args[1];

String DB_TABLE  = args[2];

String QUERY_CRT="create table "+DB_TABLE+"(name varchar2(10), tel varchar2(15))";

String QUERY_IST="insert into "+DB_TABLE+" values(?, ?)";	// input variables...

String[] name	= {"kim", "lee", "park", "chung", "choi"};

String[] tel	= {"1111", "2222", "3333", "4444", "5555"};

String QUERY_DRP="drop table "+DB_TABLE;

String mode="";

int    i;

int    len;

long   start;

long   end;

Connection conn;

Statement	stmt;

PreparedStatement pstmt;	// USE PreparedStatement...

try{

…

do{

// CREATE...

// INSERT...

else if (mode.equals("i")){

pstmt = conn.prepareStatement(QUERY_IST);

len   = name.length;

start=System.currentTimeMillis();

for(i=0; i<len; i++){

pstmt.setString(1,name[i]);	// OR setXXX... (ex) setInt

pstmt.setString(2,tel[i]);

pstmt.executeUpdate();

}

end=System.currentTimeMillis();

System.out.println(i+" Tuples inserted... ");

System.out.println("Total time elapsed (PreparedStatement): "+(end-start)+"	msec\n");

pstmt.close();

}

// DROP...

… …

}while(!mode.equals("q"));

}catch(Exception e){ e.printStackTrace(); }

stmt.close();

conn.close();

}// End of main

}// End of class

• Batch Processing

- Performance 향상

Ex)

import oracle.jdbc.driver.*;

……

PreparedStatement ps =

conn.prepareStatement ("insert into dept values (?, ?, ?)");

//Change batch size for this statement to 3

((OraclePreparedStatement)ps).setExecuteBatch (3);

ps.setInt (1, 23);

ps.setString (2, "Sales");

ps.setString (3, "USA");

ps.executeUpdate ();	//JDBC queues this for later execution

ps.setInt (1, 24);

ps.setString (2, "Blue Sky");

ps.setString (3, "Montana");

ps.executeUpdate ();	//JDBC queues this for later execution

ps.setInt (1, 25);

ps.setString (2, "Applications");

ps.setString (3, "India");

ps.executeUpdate ();	//The queue size equals the batch value of 3

//JDBC 'sends' the requests to the database

ps.setInt (1, 26);

ps.setString (2, "HR");

ps.setString (3, "Mongolia");

ps.executeUpdate ();	//JDBC queues this for later execution

((OraclePreparedStatement)ps).sendBatch ();

//JDBC 'sends' the queued request

ps.close();

• Transaction

- JDBC에서는 ‘하나의’ SQL문을 transaction으로 가정.

⇒ 하나의 SQL마다 auto-commit을 실행.

- 여러개의 SQL들을 transaction으로 묶는 경우

⇒ auto-commit mode를 false로 한 후, 모든 unit operation들이 성공적으로 종료 되었을 때commit을 수행.

Ex)	conn.setAutoCommit (false);

try{

while(!end_of_transaction){	// <transaction>

unit_operation_i;

if (unit_operation_i fails)

throw new SQLException();

}

conn.commit();	// transaction committed...

}catch(SQLException e){

conn.rollback();	// transaction rollbacked...

}

Ex) Transaction example

import java.io.*;

import java.sql.*;

class JdbcTran{

public static void main (String args[]){

String QUERY_CRT="create table account(name varchar2(10), bal number)";

String QUERY_IST="insert into account values(?, ?)";

String[] name    = {"kim", "park"};

String[] bal = {"1000", "2000"};

String QUERY_UPT[]={"update account set bal=bal-100 where name='kim'",

"update account set bal=bal+100 where name='park'"};

int    i;

int    len;

int    flag;

Connection conn;

Statement	stmt;

PreparedStatement pstmt;	// USE PrepareStatement...

try{

…  …

do{

System.out.print("command> ");

mode = ir.readLine();

// CREATE TABLE...

if (mode.equals("c")){

try{

stmt.executeUpdate(QUERY_CRT);

System.out.println("Table created... \n");

}

catch(SQLException e){

System.out.println("ERROR: Table already exists... \n");

e.printStackTrace();

System.out.println("");

}

}

// INSERT...

else if (mode.equals("i")){

conn.setAutoCommit(false);

pstmt = conn.prepareStatement(QUERY_IST);

len   = name.length;

for(i=0; i<len; I++){	// insert transaction...

pstmt.setString(1,name[i]);

pstmt.setString(2,bal[i]);

pstmt.executeUpdate();

}

conn.commit();

System.out.println(i+" Tuples inserted...\n");

pstmt.close();

}

// UPDATE...

else if (mode.equals("u")){

try{

conn.setAutoCommit(false);

len   = QUERY_UPT.length;

for(i=0; i<len; I++){	// update transaction...

pstmt = conn.prepareStatement(QUERY_UPT[i]);

flag = pstmt.executeUpdate();

if (flag!=1)	// if the no. of rows updated (return val) is not 1...

throw new SQLException();

}

conn.commit();

System.out.println("UPDATE: Trans committed...\n");

}catch(SQLException e){

conn.rollback();

System.out.println("ERROR: Trans rollbacked... \n");

System.out.println("ERROR Code: "+e.getSQLState());

e.printStackTrace();

System.out.println("");

}

}

…  …

}while(!mode.equals("q"));

stmt.close();

conn.close();

}catch(Exception e){ e.printStackTrace(); }

}// End of main

}// End of class

⇒ SQL> delete from account where name='park';

SQL> commit;

수행 후에 update를 수행하면 SQLException이 발생.

⇒ Transaction이 원래의 상태로 ‘rollback'함.

Stored Procedure

• PL/SQL (Oracle) Overview

- 구조: *.sql file

DECLARE	: 사용될 변수들 정의

BEGIN	: 실행할 SQL문들, for loop 등 실행 문장

EXCEPTION	: 에러 처리

END

- Data type

NUMBER	: 숫자	(10-38 ～ 1038)

CHAR(size): 고정길이 문자열 (나머지는 blank로 채움, ～ 2KB)

VARCHAR2(size): 가변길이 문자열 (～ 4KB)

LONG	: 가변길이 문자열 (～ 2GB)

DATE	: 날짜

RAW(size)	: 가변길이 Binary type

LONG RAW: 가변길이 Binary type (～ 2GB)

ROWID	: Oracle의 row id 형식의 data type

table.col%TYPE	: 특정 table의 특정 column의 data type

table%ROWTYPE: 특정 table의 row data type

- Stored procedure 작성 및 compile

Ex)	① storeddemo.sql 작성

CREATE or REPLACE PROCEDURE StoredDemo(cust_name IN VARCHAR,

customer	OUT account.name%TYPE,

bal	OUT account.balance%TYPE)  IS

BEGIN

SELECT  name, balance	INTO customer, bal

FROM	account

WHERE	name = cust_name;

DBMS_OUTPUT.PUT(customer);

DBMS_OUTPUT.PUT(bal);

END;

/

② Compile

# sqlplus tykim/*****

SQL>@storeddemo;

Procedure created.	// tykim.StoredDemo가 생성됨.

③ Check compile errors

SQL> SHOW ERRORS PROCEDURE StoredDemo;

- JDBC program에서의 호출: Callable statement 사용

Ex) storedproc.java

import java.io.*;

import java.sql.*;

class StoredProc{

public static void main (String args[]){

String DB_URL = "jdbc:oracle:thin:@comedudb2.cs.ucla.edu:1521:COMORA2";

String DB_USER   = "";

String DB_PASSWD = "";

Connection conn;

CallableStatement	cstmt;

String customer;

int    bal;

try{

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

System.out.println("\nDriver Loaded...");

System.out.println("\nTYPE db_user_id AND db_passwd");

BufferedReader ir=new BufferedReader(new InputStreamReader(System.in));

System.out.print("user  > ");

DB_USER = ir.readLine();

System.out.print("passwd> ");

DB_PASSWD = ir.readLine();

conn = DriverManager.getConnection(DB_URL,DB_USER,DB_PASSWD);

System.out.println("\nConnection Created...\n");

cstmt = conn.prepareCall("{ call StoredDemo(?, ?, ?) }");

cstmt.setString(1, "lee");

cstmt.registerOutParameter(2, Types.VARCHAR);

cstmt.registerOutParameter(3, Types.INTEGER);

System.out.println("register parameter...\n");

cstmt.executeUpdate();

customer = cstmt.getString(2);

bal      = cstmt.getInt(3);

System.out.println("StoredDemo: "+customer+" "+bal);

cstmt.close();

conn.close();

}catch(SQLException e){

System.out.println("ERROR: SQLException... \n");

e.printStackTrace();

System.out.println("");

}catch(Exception e){

e.printStackTrace();

}

}// End of main

}// End of class

JDBC 관련 Class 정리

• Summary of Connection methods

- Statement	createStatement()

⇒ Statement object를 생성하여 return.

- CallableStatement	prepareCall(String sql)

⇒ CallableStatement object를 생성하여 return.

- PrepareStatement	prepareStatement(String sql)

⇒ PrepareStatement object를 생성하여 return.

- boolean	getAutoCommit()

⇒ 현재의 auto-commit 상태를 return.

- void	setAutoCommit(boolean autoCommit)

⇒ auto-commit mode를 set.

- void	commit()

⇒ auto-commit mode에서 commit를 실행하고, DB lock을 해제.

- void	rollback()

⇒ auto-commit mode에서 rollback을 실행하고, DB lock을 해제.

- boolean	isReadOnly()

⇒ Connection이 read-only인지를 return.

- void	setReadOnly(boolean	readOnly)

⇒ Connection을 read-only로 set.

- void	close()

⇒ Connection object의 사용을 종료.

• Summary of Statement methods

- ResultSet	executeQuery(String sql)

⇒ ResultSet object를 생성하고 sql을 실행하여 return.

- int	executeUpdate(String sql)

⇒ INSERT/UPDATE/DELETE SQL 문 실행.

- boolean	execute(String sql)

⇒ 다수의 ResultSet 또는 update count를 return.

- ResultSet	getResultSet()

⇒ 현재 사용 중인 ResultSet object를 return.

- boolean	getMoreResults()

⇒ 다음의 결과로 이동.

- int	getUpdateCount()

⇒ 현재 update count value를 return.

- int	getMaxFieldSize()

⇒ 최대 column size를 return. (byte)

- int	getMaxRows()

⇒ ResultSet에 포함된 max. row 수를 return.

- Connection	getConnection()

⇒ 현재 Statement object를 만든 Connection object를 return.

- int	getQueryTimeout()

⇒ SQL 문의 실행을 기다리는 max. time을 return.

- void	setQueryTimeout(int seconds)

⇒ SQL 문의 실행을 기다리는 max. time을 set.

- void	cancel()

⇒ 현재 Statement object의 사용을 중지. (보통 다른 thread가 호출함.)

- viod	close()

⇒ 현재 Statement object의 사용을 종료.

• Summary of ResultSet methods

- int	getRow()

⇒ 현재 cursor의 위치를 return.

- boolean	next()

⇒ cursor를 다음 row로 move.

- boolean	previous()

⇒ cursor를 앞 row로 move.

- boolean	absolute(int row)

⇒ cursor를 row 위치로 move. (row가 -이면 뒤에서부터의 위치로 move)

- boolean	first()

⇒ cursor를 첫 row로 move.

- int	findColumn(String Name)

⇒ Name의 column 위치를 return.

- boolean	getBoolean(int Index)

⇒ Index 위치의 boolean column을 read.

- byte	getByte(int Index)

⇒ Index 위치의 byte column을 read.

- byte[]	getBytes(int Index)

⇒ Index 위치의 byte array column을 read.

- String	getString(int Index)

⇒ Index 위치의 String column을 read.

- Date	getDate(int Index)

⇒ Index 위치의 Date column을 read.

- Time	getTime(int Index)

⇒ Index 위치의 Time column을 read.

- short	getShort(int Index)

⇒ Index 위치의 short column을 read.

- int	getInt(int Index)

⇒ Index 위치의 int column을 read.

- float	getFloat(int Index)

⇒ Index 위치의 float column을 read.

- double	getDouble(int Index)

⇒ Index 위치의 double column을 read.

- void	updateRow()

⇒ row와 DB를 모두 update.

- void	deleteRow()

⇒ 현재의 row를 ResultSet과 DB에서 delete.

- void	updateString(int Index, String str)

⇒ ResultSet 내용의 Index 위치 column만 str로 update. (DB는 그대로)

- void	updateInt(int Index, int x)

⇒ ResultSet 내용의 Index 위치 column만 x로 update. (DB는 그대로)

- ResultSetMetaData	getMetaData()

⇒ Meta data를 retun.

• Summary of ResultSetMetaData methods

- String	getTableName()

⇒ 현재 사용 중인 table 명을 return.

- int	getColumnCount()

⇒ column 수를 return.

- String	getColumnName(int column)

⇒ column의 name을 return.

- String	getColumnTypeName(int column)

⇒ column의 type을 return.

- boolean	isWritable(int column)

⇒ 이 column에 write할 수 있는지를 return.