/*
Code revised from
JDBC Recipes: A Problem-Solution Approach
# By Mahmoud Parsian
# ISBN: 1-59059-520-3
# 664 pp.
# Published: Sep 2005
publisher: apress.com
*/
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import oracle.sql.BLOB;
/****
CREATE TABLE java_objects (object_id NUMBER, object_name varchar(128), object_value BLOB DEFAULT empty_blob(), primary key (object_id));
SQL> desc java_objects;
Name Null? Type
----------------------------------------- -------- ----------------------------
OBJECT_ID NOT NULL NUMBER
OBJECT_NAME VARCHAR2(128)
OBJECT_VALUE BLOB
SQL> select SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, INCREMENT_BY, LAST_NUMBER from user_sequences;
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER
------------------------------ ---------- ---------- ------------ -----------
ID_SEQ 1 1.0000E+27 1 21
JAVA_OBJECT_SEQUENCE 1 1.0000E+27 1 1
*/
public class Main {
public static void main(String[] args) throws Exception {
String WRITE_OBJECT_SQL = "BEGIN "
+ " INSERT INTO java_objects(object_id, object_name, object_value) "
+ " VALUES (?, ?, empty_blob()) " + " RETURN object_value INTO ?; " + "END;";
String READ_OBJECT_SQL = "SELECT object_value FROM java_objects WHERE object_id = ?";
Connection conn = getOracleConnection();
conn.setAutoCommit(false);
List<Object> list = new ArrayList<Object>();
list.add("This is a short string.");
list.add(new Integer(1234));
list.add(new java.util.Date());
// write object to Oracle
long id = 0001;
String className = list.getClass().getName();
CallableStatement cstmt = conn.prepareCall(WRITE_OBJECT_SQL);
cstmt.setLong(1, id);
cstmt.setString(2, className);
cstmt.registerOutParameter(3, java.sql.Types.BLOB);
cstmt.executeUpdate();
BLOB blob = (BLOB) cstmt.getBlob(3);
OutputStream os = blob.getBinaryOutputStream();
ObjectOutputStream oop = new ObjectOutputStream(os);
oop.writeObject(list);
oop.flush();
oop.close();
os.close();
// Read object from oracle
PreparedStatement pstmt = conn.prepareStatement(READ_OBJECT_SQL);
pstmt.setLong(1, id);
ResultSet rs = pstmt.executeQuery();
rs.next();
InputStream is = rs.getBlob(1).getBinaryStream();
ObjectInputStream oip = new ObjectInputStream(is);
Object object = oip.readObject();
className = object.getClass().getName();
oip.close();
is.close();
rs.close();
pstmt.close();
conn.commit();
// de-serialize list a java object from a given objectID
List listFromDatabase = (List) object;
System.out.println("[After De-Serialization] list=" + listFromDatabase);
conn.close();
}
private static Connection getHSQLConnection() throws Exception {
Class.forName("org.hsqldb.jdbcDriver");
System.out.println("Driver Loaded.");
String url = "jdbc:hsqldb:data/tutorial";
return DriverManager.getConnection(url, "sa", "");
}
public static Connection getMySqlConnection() throws Exception {
String driver = "org.gjt.mm.mysql.Driver";
String url = "jdbc:mysql://localhost/demo2s";
String username = "oost";
String password = "oost";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
public static Connection getOracleConnection() throws Exception {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:databaseName";
String username = "userName";
String password = "password";
Class.forName(driver); // load Oracle driver
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
}
|