Saving Java objects into database and read it back from database using JDBC
Question:- How we can write binary objects into a database table, for that what type of data type should we use for the creation of database tables?
To Map an object with relational databases and vice versa is always a difficult task.
Very good solutions for that are serialize each Java object using the object stream and preserve the result into a database as a binary blob. As this is a valid scenario and the JDBC explicitly supports to perform this.
Questions: - What is Blob data type?
Answer:-
Binary large object or basic large object: - Large object data types store data ranging in size from 0 bytes to 2 GB. A BLOB is a collection of binary data stored as a single entity in a database. This data type can store binary data larger than VARBINARY (32K limit). Blobs are typically any objects, images, audio, other multimedia objects or other types of business or application-specific data. A BLOB is a varying-length binary string that can be up to 2,147,483,647 characters long.
For storing java objects into the database we can use BLOB
datatype in the table.We can create a table using below CREATE TABLE command in
MYSQL database.
Table Structure for MySql Database:-
CREATE TABLE persist_java_objects (
System Requirements:-
jdk1.5 and above(I am using jdk1.7)
Eclipse Editor or other(I am using Eclipse Helios).
Required Jars:-
mysql-connector-java-5.0.4-bin.jar
CREATE TABLE persist_java_objects (
object_id int(14) NOT NULL auto_increment,
object_name varchar(30) default NULL,
java_object blob,
PRIMARY KEY 
(object_id)
)
System Requirements:-
jdk1.5 and above(I am using jdk1.7)
Eclipse Editor or other(I am using Eclipse Helios).
Required Jars:-
mysql-connector-java-5.0.4-bin.jar
Sample Example to save a List of Objects into database and read back from database :-
SaveObject2Database.java 
package
com.gaurav.persistjavaobjects;
import
java.io.ByteArrayInputStream;
import
java.io.ByteArrayOutputStream;
import
java.io.IOException;
import
java.io.ObjectInputStream;
import
java.io.ObjectOutputStream;
import
java.sql.Blob;
import
java.sql.Connection;
import
java.sql.DriverManager;
import
java.sql.PreparedStatement;
import
java.sql.ResultSet;
import
java.sql.SQLException;
import
java.util.ArrayList;
import
java.util.Date;
import
java.util.List;
public
class SaveObject2Database {
            /** This method will help to get mysql connection from database*/    
            private static Connection getConnection() throws Exception {
                        String
driver = "com.mysql.jdbc.Driver";
                        String
url = "jdbc:mysql://localhost:3306/test";
                        String
username = "root";
                        String
password = "root";
                        Class.forName(driver);
                        Connection
con = DriverManager.getConnection(url, username, password);
                        return con;
            }
                    /** This method will help to convert any object into byte array*/              
                   private static byte[] convertObjectToByteArray(Object obj) throws IOException {
                        ByteArrayOutputStream
byteArrayOutputStream = new ByteArrayOutputStream();
                        ObjectOutputStream
objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
                        objectOutputStream.writeObject(obj);
                        return
byteArrayOutputStream.toByteArray();
            }
                        /** This method will help to save java objects into database*/             
                         private static long saveBlob(Connection con, Object javaObject2Persist) {
                        byte[]
byteArray = null;
                        PreparedStatement
preparedStatement = null;
                        String
SQLQUERY_TO_SAVE_JAVAOBJECT = "INSERT INTO
persist_java_objects(object_name, java_object) VALUES (?, ?)";
                        int persistObjectID = -1;
                        try {
                                    byteArray
= convertObjectToByteArray(javaObject2Persist);
                                    preparedStatement
= con.prepareStatement(
                                                            SQLQUERY_TO_SAVE_JAVAOBJECT,
                                                            PreparedStatement.RETURN_GENERATED_KEYS);
                                    preparedStatement.setString(1,
javaObject2Persist.getClass()
                                                            .getName());
                                    preparedStatement.setBytes(2,
byteArray);
                                    preparedStatement.executeUpdate();
                                    System.out
                                                            .println("Query
- "
                                                                                    +
SQLQUERY_TO_SAVE_JAVAOBJECT
                                                                                    +
" is successfully executed for Java object serialization ");
                                    //Trying
to get the Generated Key
                                    ResultSet
rs = preparedStatement.getGeneratedKeys();
                                    if
(rs.next()) {
                                                persistObjectID
= rs.getInt(1);
                                                System.out
                                                                        .println("Object
ID while saving the binary object is->"
                                                                                                +
persistObjectID);
                                    }
                                    preparedStatement.close();
                        } catch (SQLException e) {
                                    e.printStackTrace();
                        }
catch (Exception e) {
                                    e.printStackTrace();
                        }
                        return persistObjectID;
            }
/** This method will help to read java objects from database*/                
private static byte[] getBlob(Connection con, long objectId) {
                        String
SQLQUERY_TO_READ_JAVAOBJECT= "SELECT java_object FROM persist_java_objects
WHERE object_id = ?;";
                        PreparedStatement
pstmt = null;
                        ResultSet
resultSet = null;
                        Blob
blob = null;
                        byte[]
bytes = null;
                        try {
                                    pstmt
= con.prepareStatement(SQLQUERY_TO_READ_JAVAOBJECT);
                                    System.out.println("Reading
the saved Object from the database where the object Id is:->" +
objectId);
                                    pstmt.setLong(1,
objectId);
                                    resultSet
= pstmt.executeQuery();
                                    while
(resultSet.next()) {
                                                blob
= resultSet.getBlob(1);
                                    }
                                    bytes
= blob.getBytes(1, (int) (blob.length()));
                        }
catch (SQLException e) {
                                    e.printStackTrace();
                        }
catch (Exception e) {
                                    e.printStackTrace();
                        }
                        return bytes;
            }
            @SuppressWarnings("unchecked")
            public static void main(String args[]) throws Exception {
                        Connection
connection = null;
                        byte[]
retrievedArrayObject = null;
                        try
{
                                    connection
= getConnection();
                                    List<Object>
listToSaveInDB = new ArrayList<Object>();
                                    listToSaveInDB.add(new
Date());
                                    listToSaveInDB.add(new
String("KUMAR GAURAV"));
                                    listToSaveInDB.add(new
Integer(55));
                                    long
persistObjectID = saveBlob(connection, listToSaveInDB);
                                    System.out.println(listToSaveInDB
+ " Object is saved sucessfully");
                                    retrievedArrayObject
= getBlob(connection, persistObjectID);
                                    ObjectInputStream
objectInputStream = null;
                                    if
(retrievedArrayObject != null)
                                                objectInputStream
= new ObjectInputStream(
                                                                        new
ByteArrayInputStream(retrievedArrayObject));
                                    Object
retrievingObject = objectInputStream.readObject();
                                    List<Object>
dataListFromDB = (List<Object>) retrievingObject;
                                    for
(Object object : dataListFromDB) {
                                                System.out.println("Retrieved
Data is :->" + object.toString());
                                    }
                                    System.out
                                                            .println("Successfully
retrieved java Object from Database");
                        }
catch (Exception e) {
                                    e.printStackTrace();
                        }
finally {
                                    connection.close();
                        }
            }
}
Result:->
Query - INSERT INTO persist_java_objects(object_name, java_object) VALUES (?, ?) is successfully executed for Java object serialization 
Object ID while saving the binary object is->13
[Fri Aug 02 07:17:26 IST 2013, KUMAR GAURAV, 10055] Object is saved sucessfully
Reading the saved Object from the database where the object Id is:->13
Retrieved Data is :->Fri Aug 02 07:17:26 IST 2013
Retrieved Data is :->KUMAR GAURAV
Retrieved Data is :->10055
Successfully retrieved java Object from Database
 
Object ID while saving the binary object is->13
[Fri Aug 02 07:17:26 IST 2013, KUMAR GAURAV, 10055] Object is saved sucessfully
Reading the saved Object from the database where the object Id is:->13
Retrieved Data is :->Fri Aug 02 07:17:26 IST 2013
Retrieved Data is :->KUMAR GAURAV
Retrieved Data is :->10055
Successfully retrieved java Object from Database
Table Status after insertion java objects into database:- 
 
No comments:
Post a Comment