Struct examples
The complete versions of all of the examples in this section are in the demo/complex-types directory where you installed the driver. For more information, see Sample code files.
CREATE TABLE teachers
(
person row(
id int,
name row(first char(20), last char(20)),
age int
),
dept char(20)
);
INSERT INTO teachers VALUES ("row(100, row('Bill', 'Smith'), 27)", "physics");
PreparedStatement pstmt;
ResultSet rs;
pstmt = conn.prepareStatement("select person from teachers");
System.out.println("prepare ...ok");
rs = pstmt.executeQuery();
System.out.println("executetQuery()...ok");
rs.next();
Struct person = (Struct) rs.getObject(1);
System.out.println("getObject()...ok");
System.out.println("\nData fetched:");
Integer id;
Struct name;
Integer age;
Object[] elements;
/* Get the row description */
String personRowType = person.getSQLTypeName();
System.out.println("person row description: " + personRowType);
System.out.println("");
/* Convert each element into a Java object */
elements = person.getAttributes();
/*
* Run through the array of objects in 'person' getting out each structure
* field. Use the class Integer instead of int, because int is not an object.
*/
id = (Integer) elements[0];
name = (Struct) elements[1];
age = (Integer) elements[2];
System.out.println("person.id: " + id);
System.out.println("person.age: " + age);
System.out.println("");
/* Convert 'name' as well. */
/* get the row definition for 'name' */
String nameRowType = name.getSQLTypeName();
System.out.println("name row description: " + nameRowType);
/* Convert each element into a Java object */
elements = name.getAttributes();
/*
* run through the array of objects in 'name' getting out each structure
* field.
*/
String first = (String) elements[0];
String last = (String) elements[1];
System.out.println("name.first: " + first);
System.out.println("name.last: " + last);
pstmt.close();
The Struct person = (Struct) rs.getObject(1) statement instantiates a Struct object if column 1 is a ROW type and there is no extended data type name (if it is a named row).
- Allocates an array of java.lang.Object objects with the correct number of elements
- Converts each element in the row into a Java™ object
If the element is an opaque type, you must provide type mapping in the Connection object or pass in a java.util.Map object in the call to the getAttributes() method.
The String personrowType = person.getSQLTypeName(); statement returns the row type information. If this type is a named row, the statement returns the name. Because the type is not a named row, the statement returns the row definition: row(int id, row(first char(20), last char(20)) name, int age).
The example then goes through the same steps for the unnamed row name as it did for the unnamed row person.
import java.sql.*;
import java.util.*;
public class GenericStruct implements java.sql.Struct
{
private Object [] attributes = null;
private String typeName = null;
/*
* Constructor
*/
GenericStruct() { }
GenericStruct(String name, Object [] obj)
{
typeName = name;
attributes = obj;
}
public String getSQLTypeName()
{
return typeName;
}
public Object [] getAttributes()
{
return attributes;
}
public Object [] getAttributes(Map map) throws SQLException
{
// this class shouldn't be used if there are elements
// that need customized type mapping.
return attributes;
}
public void setAttributes(Object [] objArray)
{
attributes = objArray;
}
public void setSQLTypeName(String name)
{
typeName = name;
}
}
PreparedStatement pstmt;
ResultSet rs;
GenericStruct gs;
String rowType;
pstmt = conn.prepareStatement("insert into teachers values (?, 'Math')");
System.out.println("prepare insert...ok\n");
System.out.println("Populate name struct...");
Object[] name = new Object[2];
// populate inner row first
name[0] = new String("Jane");
name[1] = new String("Smith");
rowType = "row(first char(20), last char(20))";
gs = new GenericStruct(rowType, name);
System.out.println("Instantiate GenericStructObject...okay\n");
System.out.println("Populate person struct...");
// populate outer row next
Object[] person = new Object[3];
person[0] = new Integer(99);
person[1] = gs;
person[2] = new Integer(56);
rowType = "row(id int, " +
"name row(first char(20), last char(20)), " +
"age int)";
gs = new GenericStruct(rowType, person);
System.out.println("Instantiate GenericStructObject...okay\n");
pstmt.setObject(1, gs);
System.out.println("setObject()...okay");
pstmt.executeUpdate();
System.out.println("executeUpdate()...okay");
pstmt.close();
At the pstmt.setObject(1, gs) statement in this example, HCL Informix® JDBC Driver determines that the information is to be transported from the client to the database server as a ROW column, because the GenericStruct object is an instance of the java.sql.Struct interface.
Each element in the array is serialized, verifying that each element matches the type as defined by the getSQLTypeName() method.