diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/App.java b/jdbc-tutorial/src/main/java/com/supwisdom/App.java
index d4069da..6cc4735 100644
--- a/jdbc-tutorial/src/main/java/com/supwisdom/App.java
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/App.java
@@ -1,16 +1,11 @@
 package com.supwisdom;
 
-import java.sql.Connection;
-import java.sql.DriverManager;
 
 public class App {
   
-  public static void main(String[] args) throws Exception {
-    Class.forName("org.h2.Driver");
-    Connection conn = DriverManager.getConnection("jdbc:h2:tcp://localhost/test", "sa", "");
-    // add application code here
-    
-    conn.close();
-  }
+  public static final String JDBC_DRIVER = "org.h2.Driver";
+  public static final String JDBC_URL = "jdbc:h2:tcp://localhost/test";
+  public static final String DB_USERNAME = "sa";
+  public static final String DB_PASSWORD = "";
   
 }
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/BatchUpdate.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/BatchUpdate.java
new file mode 100644
index 0000000..8c9e106
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/BatchUpdate.java
@@ -0,0 +1,81 @@
+package com.supwisdom.jdbc;
+
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class BatchUpdate {
+
+  public static void main(String args[]) throws SQLException {
+
+    ResultSet rs = null;
+    PreparedStatement ps = null;
+
+    Connection con;
+    Statement stmt;
+    try {
+
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+      con.setAutoCommit(false);
+
+      stmt = con.createStatement();
+
+      stmt.addBatch("INSERT INTO COFFEES " + "VALUES('Amaretto', 49, 9.99, 0, 0)");
+      stmt.addBatch("INSERT INTO COFFEES " + "VALUES('Hazelnut', 49, 9.99, 0, 0)");
+      stmt.addBatch("INSERT INTO COFFEES " + "VALUES('Amaretto_decaf', 49, 10.99, 0, 0)");
+      stmt.addBatch("INSERT INTO COFFEES " + "VALUES('Hazelnut_decaf', 49, 10.99, 0, 0)");
+
+      int[] updateCounts = stmt.executeBatch();
+      con.commit();
+      con.setAutoCommit(true);
+
+      ResultSet uprs = stmt.executeQuery("SELECT * FROM COFFEES");
+
+      System.out.println("Table COFFEES after insertion:");
+      while (uprs.next()) {
+        String name = uprs.getString("COF_NAME");
+        int id = uprs.getInt("SUP_ID");
+        float price = uprs.getFloat("PRICE");
+        int sales = uprs.getInt("SALES");
+        int total = uprs.getInt("TOTAL");
+        System.out.print(name + "   " + id + "   " + price);
+        System.out.println("   " + sales + "   " + total);
+      }
+
+      uprs.close();
+      stmt.close();
+      con.close();
+
+    } catch (BatchUpdateException b) {
+      System.err.println("-----BatchUpdateException-----");
+      System.err.println("SQLState:  " + b.getSQLState());
+      System.err.println("Message:  " + b.getMessage());
+      System.err.println("Vendor:  " + b.getErrorCode());
+      System.err.print("Update counts:  ");
+      int[] updateCounts = b.getUpdateCounts();
+      for (int i = 0; i < updateCounts.length; i++) {
+        System.err.print(updateCounts[i] + "   ");
+      }
+      System.err.println("");
+
+    } catch (SQLException ex) {
+      System.err.println("-----SQLException-----");
+      System.err.println("SQLState:  " + ex.getSQLState());
+      System.err.println("Message:  " + ex.getMessage());
+      System.err.println("Vendor:  " + ex.getErrorCode());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateCoffees.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateCoffees.java
new file mode 100644
index 0000000..2aa46c0
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateCoffees.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class CreateCoffees {
+
+  public static void main(String args[]) {
+
+    
+    Connection con;
+    String createString;
+    createString = "create table COFFEES " + "(COF_NAME varchar(32), " + "SUP_ID int, " + "PRICE float, "
+        + "SALES int, " + "TOTAL int)";
+    Statement stmt;
+
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+      stmt.executeUpdate(createString);
+
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateNewTable.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateNewTable.java
new file mode 100644
index 0000000..114d1c8
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateNewTable.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import java.util.*;
+import static com.supwisdom.App.*;
+
+public class CreateNewTable {
+
+  public static void main(String[] args) {
+
+    Connection con;
+    Statement stmt;
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+
+      Vector dataTypes = getDataTypes(con);
+
+      String tableName;
+      String columnName;
+      String sqlType;
+      String prompt = "Enter the new table name and hit Return: ";
+      tableName = getInput(prompt);
+      String createTableString = "create table " + tableName + " (";
+
+      String commaAndSpace = ", ";
+      boolean firstTime = true;
+      while (true) {
+        System.out.println("");
+        prompt = "Enter a column name " + "(or nothing when finished) \nand hit Return: ";
+        columnName = getInput(prompt);
+        if (firstTime) {
+          if (columnName.length() == 0) {
+            System.out.print("Need at least one column;");
+            System.out.println(" please try again");
+            continue;
+          } else {
+            createTableString += columnName + " ";
+            firstTime = false;
+          }
+        } else if (columnName.length() == 0) {
+          break;
+        } else {
+          createTableString += commaAndSpace + columnName + " ";
+        }
+
+        String localTypeName = null;
+        String paramString = "";
+        while (true) {
+          System.out.println("");
+          System.out.println("LIST OF TYPES YOU MAY USE:  ");
+          boolean firstPrinted = true;
+          int length = 0;
+          for (int i = 0; i < dataTypes.size(); i++) {
+            DataType dataType = (DataType) dataTypes.get(i);
+            if (!dataType.needsToBeSet()) {
+              if (!firstPrinted) System.out.print(commaAndSpace);
+              else firstPrinted = false;
+              System.out.print(dataType.getSQLType());
+              length += dataType.getSQLType().length();
+              if (length > 50) {
+                System.out.println("");
+                length = 0;
+                firstPrinted = true;
+              }
+            }
+          }
+          System.out.println("");
+
+          int index;
+          prompt = "Enter a column type " + "from the list and hit Return:  ";
+          sqlType = getInput(prompt);
+          for (index = 0; index < dataTypes.size(); index++) {
+            DataType dataType = (DataType) dataTypes.get(index);
+            if (dataType.getSQLType().equalsIgnoreCase(sqlType) && !dataType.needsToBeSet()) {
+              break;
+            }
+          }
+
+          localTypeName = null;
+          paramString = "";
+          if (index < dataTypes.size()) { // there was a match
+            String params;
+            DataType dataType = (DataType) dataTypes.get(index);
+            params = dataType.getParams();
+            localTypeName = dataType.getLocalType();
+            if (params != null) {
+              prompt = "Enter " + params + ":  ";
+              paramString = "(" + getInput(prompt) + ")";
+            }
+            break;
+          } else { // use the name as given
+            prompt = "Are you sure?  " + "Enter 'y' or 'n' and hit Return:  ";
+            String check = getInput(prompt) + " ";
+            check = check.toLowerCase().substring(0, 1);
+            if (check.equals("n")) continue;
+            else {
+              localTypeName = sqlType;
+              break;
+            }
+          }
+        }
+
+        createTableString += localTypeName + paramString;
+
+      }
+
+      createTableString += ")";
+      System.out.println("");
+      System.out.print("Your CREATE TABLE statement as ");
+      System.out.println("sent to your DBMS:  ");
+      System.out.println(createTableString);
+      System.out.println("");
+
+      stmt.executeUpdate(createTableString);
+
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+    }
+  }
+
+  private static Vector getDataTypes(Connection con) throws SQLException {
+    String structName = null, distinctName = null, javaName = null;
+
+    // create a vector of class DataType initialized with
+    // the SQL code, the SQL type name, and two null entries
+    // for the local type name and the creation parameter(s)
+
+    Vector dataTypes = new Vector();
+    dataTypes.add(new DataType(java.sql.Types.BIT, "BIT"));
+    dataTypes.add(new DataType(java.sql.Types.TINYINT, "TINYINT"));
+    dataTypes.add(new DataType(java.sql.Types.SMALLINT, "SMALLINT"));
+    dataTypes.add(new DataType(java.sql.Types.INTEGER, "INTEGER"));
+    dataTypes.add(new DataType(java.sql.Types.BIGINT, "BIGINT"));
+    dataTypes.add(new DataType(java.sql.Types.FLOAT, "FLOAT"));
+    dataTypes.add(new DataType(java.sql.Types.REAL, "REAL"));
+    dataTypes.add(new DataType(java.sql.Types.DOUBLE, "DOUBLE"));
+    dataTypes.add(new DataType(java.sql.Types.NUMERIC, "NUMERIC"));
+    dataTypes.add(new DataType(java.sql.Types.DECIMAL, "DECIMAL"));
+    dataTypes.add(new DataType(java.sql.Types.CHAR, "CHAR"));
+    dataTypes.add(new DataType(java.sql.Types.VARCHAR, "VARCHAR"));
+    dataTypes.add(new DataType(java.sql.Types.LONGVARCHAR, "LONGVARCHAR"));
+    dataTypes.add(new DataType(java.sql.Types.DATE, "DATE"));
+    dataTypes.add(new DataType(java.sql.Types.TIME, "TIME"));
+    dataTypes.add(new DataType(java.sql.Types.TIMESTAMP, "TIMESTAMP"));
+    dataTypes.add(new DataType(java.sql.Types.BINARY, "BINARY"));
+    dataTypes.add(new DataType(java.sql.Types.VARBINARY, "VARBINARY"));
+    dataTypes.add(new DataType(java.sql.Types.LONGVARBINARY, "LONGVARBINARY"));
+    dataTypes.add(new DataType(java.sql.Types.NULL, "NULL"));
+    dataTypes.add(new DataType(java.sql.Types.OTHER, "OTHER"));
+    dataTypes.add(new DataType(java.sql.Types.BLOB, "BLOB"));
+    dataTypes.add(new DataType(java.sql.Types.CLOB, "CLOB"));
+
+    DatabaseMetaData dbmd = con.getMetaData();
+    ResultSet rs = dbmd.getTypeInfo();
+    while (rs.next()) {
+      int codeNumber = rs.getInt("DATA_TYPE");
+      String dbmsName = rs.getString("TYPE_NAME");
+      String createParams = rs.getString("CREATE_PARAMS");
+
+      if (codeNumber == Types.STRUCT && structName == null) structName = dbmsName;
+      else if (codeNumber == Types.DISTINCT && distinctName == null) distinctName = dbmsName;
+      else if (codeNumber == Types.JAVA_OBJECT && javaName == null) javaName = dbmsName;
+      else {
+        for (int i = 0; i < dataTypes.size(); i++) {
+          // find entry that matches the SQL code,
+          // and if local type and params are not already set,
+          // set them
+          DataType type = (DataType) dataTypes.get(i);
+          if (type.getCode() == codeNumber) {
+            type.setLocalTypeAndParams(dbmsName, createParams);
+          }
+        }
+      }
+    }
+
+    int[] types = { Types.STRUCT, Types.DISTINCT, Types.JAVA_OBJECT };
+    rs = dbmd.getUDTs(null, "%", "%", types);
+    while (rs.next()) {
+      String typeName = null;
+      DataType dataType = null;
+
+      if (dbmd.isCatalogAtStart()) typeName = rs.getString(1) + dbmd.getCatalogSeparator() + rs.getString(2) + "."
+          + rs.getString(3);
+      else typeName = rs.getString(2) + "." + rs.getString(3) + dbmd.getCatalogSeparator() + rs.getString(1);
+
+      switch (rs.getInt(5)) {
+      case Types.STRUCT:
+        dataType = new DataType(Types.STRUCT, typeName);
+        dataType.setLocalTypeAndParams(structName, null);
+        break;
+      case Types.DISTINCT:
+        dataType = new DataType(Types.DISTINCT, typeName);
+        dataType.setLocalTypeAndParams(distinctName, null);
+        break;
+      case Types.JAVA_OBJECT:
+        dataType = new DataType(Types.JAVA_OBJECT, typeName);
+        dataType.setLocalTypeAndParams(javaName, null);
+        break;
+      }
+      dataTypes.add(dataType);
+    }
+
+    return dataTypes;
+  }
+
+  private static String getInput(String prompt) throws SQLException {
+
+    System.out.print(prompt);
+    System.out.flush();
+
+    try {
+      java.io.BufferedReader bin;
+      bin = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
+
+      String result = bin.readLine();
+      return result;
+
+    } catch (java.io.IOException ex) {
+      System.out.println("Caught java.io.IOException:");
+      System.out.println(ex.getMessage());
+      return "";
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateNewType.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateNewType.java
new file mode 100644
index 0000000..23b3746
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateNewType.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import java.util.*;
+import static com.supwisdom.App.*;
+
+public class CreateNewType {
+
+  public static void main(String[] args) {
+
+    Connection con;
+    Statement stmt;
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+
+      String typeToCreate = null;
+      String prompt = "Enter 's' to create a structured type " + "or 'd' to create a distinct type\n"
+          + "and hit Return: ";
+      do {
+        typeToCreate = getInput(prompt) + " ";
+        typeToCreate = typeToCreate.toLowerCase().substring(0, 1);
+      } while (!(typeToCreate.equals("s") || typeToCreate.equals("d")));
+
+      Vector dataTypes = getDataTypes(con, typeToCreate);
+
+      String typeName;
+      String attributeName;
+      String sqlType;
+      prompt = "Enter the new type name and hit Return: ";
+      typeName = getInput(prompt);
+      String createTypeString = "create type " + typeName;
+      if (typeToCreate.equals("d")) createTypeString += " as ";
+      else createTypeString += " (";
+
+      String commaAndSpace = ", ";
+      boolean firstTime = true;
+      while (true) {
+        System.out.println("");
+        prompt = "Enter an attribute name " + "(or nothing when finished) \nand hit Return: ";
+        attributeName = getInput(prompt);
+        if (firstTime) {
+          if (attributeName.length() == 0) {
+            System.out.print("Need at least one attribute;");
+            System.out.println(" please try again");
+            continue;
+          } else {
+            createTypeString += attributeName + " ";
+            firstTime = false;
+          }
+        } else if (attributeName.length() == 0) {
+          break;
+        } else {
+          createTypeString += commaAndSpace + attributeName + " ";
+        }
+
+        String localTypeName = null;
+        String paramString = "";
+        while (true) {
+          System.out.println("");
+          System.out.println("LIST OF TYPES YOU MAY USE:  ");
+          boolean firstPrinted = true;
+          int length = 0;
+          for (int i = 0; i < dataTypes.size(); i++) {
+            DataType dataType = (DataType) dataTypes.get(i);
+            if (!dataType.needsToBeSet()) {
+              if (!firstPrinted) System.out.print(commaAndSpace);
+              else firstPrinted = false;
+              System.out.print(dataType.getSQLType());
+              length += dataType.getSQLType().length();
+              if (length > 50) {
+                System.out.println("");
+                length = 0;
+                firstPrinted = true;
+              }
+            }
+          }
+          System.out.println("");
+
+          int index;
+          prompt = "Enter an attribute type " + "from the list and hit Return:  ";
+          sqlType = getInput(prompt);
+          for (index = 0; index < dataTypes.size(); index++) {
+            DataType dataType = (DataType) dataTypes.get(index);
+            if (dataType.getSQLType().equalsIgnoreCase(sqlType) && !dataType.needsToBeSet()) {
+              break;
+            }
+          }
+
+          localTypeName = null;
+          paramString = "";
+          if (index < dataTypes.size()) { // there was a match
+            String params;
+            DataType dataType = (DataType) dataTypes.get(index);
+            params = dataType.getParams();
+            localTypeName = dataType.getLocalType();
+            if (params != null) {
+              prompt = "Enter " + params + ":  ";
+              paramString = "(" + getInput(prompt) + ")";
+            }
+            break;
+          } else { // use the name as given
+            prompt = "Are you sure?  " + "Enter 'y' or 'n' and hit Return:  ";
+            String check = getInput(prompt) + " ";
+            check = check.toLowerCase().substring(0, 1);
+            if (check.equals("n")) continue;
+            else {
+              localTypeName = sqlType;
+              break;
+            }
+          }
+        }
+
+        createTypeString += localTypeName + paramString;
+
+        if (typeToCreate.equals("d")) break;
+      }
+
+      if (typeToCreate.equals("s")) createTypeString += ")";
+      System.out.println("");
+      System.out.print("Your CREATE TYPE statement as ");
+      System.out.println("sent to your DBMS:  ");
+      System.out.println(createTypeString);
+      System.out.println("");
+
+      stmt.executeUpdate(createTypeString);
+
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+    }
+  }
+
+  private static Vector getDataTypes(Connection con, String typeToCreate) throws SQLException {
+    String structName = null, distinctName = null, javaName = null;
+
+    // create a vector of class DataType initialized with
+    // the SQL code, the SQL type name, and two null entries
+    // for the local type name and the creation parameter(s)
+
+    Vector dataTypes = new Vector();
+    dataTypes.add(new DataType(java.sql.Types.BIT, "BIT"));
+    dataTypes.add(new DataType(java.sql.Types.TINYINT, "TINYINT"));
+    dataTypes.add(new DataType(java.sql.Types.SMALLINT, "SMALLINT"));
+    dataTypes.add(new DataType(java.sql.Types.INTEGER, "INTEGER"));
+    dataTypes.add(new DataType(java.sql.Types.BIGINT, "BIGINT"));
+    dataTypes.add(new DataType(java.sql.Types.FLOAT, "FLOAT"));
+    dataTypes.add(new DataType(java.sql.Types.REAL, "REAL"));
+    dataTypes.add(new DataType(java.sql.Types.DOUBLE, "DOUBLE"));
+    dataTypes.add(new DataType(java.sql.Types.NUMERIC, "NUMERIC"));
+    dataTypes.add(new DataType(java.sql.Types.DECIMAL, "DECIMAL"));
+    dataTypes.add(new DataType(java.sql.Types.CHAR, "CHAR"));
+    dataTypes.add(new DataType(java.sql.Types.VARCHAR, "VARCHAR"));
+    dataTypes.add(new DataType(java.sql.Types.LONGVARCHAR, "LONGVARCHAR"));
+    dataTypes.add(new DataType(java.sql.Types.DATE, "DATE"));
+    dataTypes.add(new DataType(java.sql.Types.TIME, "TIME"));
+    dataTypes.add(new DataType(java.sql.Types.TIMESTAMP, "TIMESTAMP"));
+    dataTypes.add(new DataType(java.sql.Types.BINARY, "BINARY"));
+    dataTypes.add(new DataType(java.sql.Types.VARBINARY, "VARBINARY"));
+    dataTypes.add(new DataType(java.sql.Types.LONGVARBINARY, "LONGVARBINARY"));
+    dataTypes.add(new DataType(java.sql.Types.NULL, "NULL"));
+    dataTypes.add(new DataType(java.sql.Types.OTHER, "OTHER"));
+    dataTypes.add(new DataType(java.sql.Types.BLOB, "BLOB"));
+    dataTypes.add(new DataType(java.sql.Types.CLOB, "CLOB"));
+
+    DatabaseMetaData dbmd = con.getMetaData();
+    ResultSet rs = dbmd.getTypeInfo();
+    while (rs.next()) {
+      int codeNumber = rs.getInt("DATA_TYPE");
+      String dbmsName = rs.getString("TYPE_NAME");
+      String createParams = rs.getString("CREATE_PARAMS");
+
+      if (codeNumber == Types.STRUCT && structName == null) structName = dbmsName;
+      else if (codeNumber == Types.DISTINCT && distinctName == null) distinctName = dbmsName;
+      else if (codeNumber == Types.JAVA_OBJECT && javaName == null) javaName = dbmsName;
+      else {
+        for (int i = 0; i < dataTypes.size(); i++) {
+          // find entry that matches the SQL code,
+          // and if local type and params are not already set,
+          // set them
+          DataType type = (DataType) dataTypes.get(i);
+          if (type.getCode() == codeNumber) {
+            type.setLocalTypeAndParams(dbmsName, createParams);
+          }
+        }
+      }
+    }
+
+    if (typeToCreate.equals("s")) {
+      int[] types = { Types.STRUCT, Types.DISTINCT, Types.JAVA_OBJECT };
+      rs = dbmd.getUDTs(null, "%", "%", types);
+      while (rs.next()) {
+        String typeName = null;
+        DataType dataType = null;
+
+        if (dbmd.isCatalogAtStart()) typeName = rs.getString(1) + dbmd.getCatalogSeparator() + rs.getString(2) + "."
+            + rs.getString(3);
+        else typeName = rs.getString(2) + "." + rs.getString(3) + dbmd.getCatalogSeparator() + rs.getString(1);
+
+        switch (rs.getInt(5)) {
+        case Types.STRUCT:
+          dataType = new DataType(Types.STRUCT, typeName);
+          dataType.setLocalTypeAndParams(structName, null);
+          break;
+        case Types.DISTINCT:
+          dataType = new DataType(Types.DISTINCT, typeName);
+          dataType.setLocalTypeAndParams(distinctName, null);
+          break;
+        case Types.JAVA_OBJECT:
+          dataType = new DataType(Types.JAVA_OBJECT, typeName);
+          dataType.setLocalTypeAndParams(javaName, null);
+          break;
+        }
+        dataTypes.add(dataType);
+      }
+    }
+
+    return dataTypes;
+  }
+
+  private static String getInput(String prompt) throws SQLException {
+
+    System.out.print(prompt);
+    System.out.flush();
+
+    try {
+      java.io.BufferedReader bin;
+      bin = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
+
+      String result = bin.readLine();
+      return result;
+
+    } catch (java.io.IOException ex) {
+      System.out.println("Caught java.io.IOException:");
+      System.out.println(ex.getMessage());
+      return "";
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateRef.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateRef.java
new file mode 100644
index 0000000..45036cc
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateRef.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class CreateRef {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    Statement stmt;
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      String createManagers = "CREATE TABLE MANAGERS OF MANAGER " + "(OID REF(MANAGER) VALUES ARE SYSTEM GENERATED)";
+
+      String insertManager1 = "INSERT INTO MANAGERS " + "(MGR_ID, LAST_NAME, FIRST_NAME, PHONE) VALUES "
+          + "(000001, 'MONTOYA', 'ALFREDO', '8317225600')";
+
+      String insertManager2 = "INSERT INTO MANAGERS " + "(MGR_ID, LAST_NAME, FIRST_NAME, PHONE) VALUES "
+          + "(000002, 'HASKINS', 'MARGARET', '4084355600')";
+
+      String insertManager3 = "INSERT INTO MANAGERS " + "(MGR_ID, LAST_NAME, FIRST_NAME, PHONE) VALUES "
+          + "(000003, 'CHEN', 'HELEN', '4153785600')";
+
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+      stmt.executeUpdate(createManagers);
+
+      con.setAutoCommit(false);
+
+      stmt.addBatch(insertManager1);
+      stmt.addBatch(insertManager2);
+      stmt.addBatch(insertManager3);
+      int[] updateCounts = stmt.executeBatch();
+
+      con.commit();
+
+      System.out.println("Update count for:  ");
+      for (int i = 0; i < updateCounts.length; i++) {
+        System.out.print("    command " + (i + 1) + " = ");
+        System.out.println(updateCounts[i]);
+      }
+
+      stmt.close();
+      con.close();
+
+    } catch (BatchUpdateException b) {
+      System.err.println("-----BatchUpdateException-----");
+      System.err.println("Message:  " + b.getMessage());
+      System.err.println("SQLState:  " + b.getSQLState());
+      System.err.println("Vendor:  " + b.getErrorCode());
+      System.err.print("Update counts for successful commands:  ");
+      int[] rowsUpdated = b.getUpdateCounts();
+      for (int i = 0; i < rowsUpdated.length; i++) {
+        System.err.print(rowsUpdated[i] + "   ");
+      }
+      System.err.println("");
+    } catch (SQLException ex) {
+      System.err.println("------SQLException------");
+      System.err.println("Error message:  " + ex.getMessage());
+      System.err.println("SQLState:  " + ex.getSQLState());
+      System.err.println("Vendor:  " + ex.getErrorCode());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateStores.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateStores.java
new file mode 100644
index 0000000..bd504a3
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateStores.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class CreateStores {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    String createTable;
+    String createArray;
+    createArray = "CREATE TYPE COF_ARRAY AS ARRAY(10) OF VARCHAR(40)";
+    createTable = "CREATE TABLE STORES ( " + "STORE_NO INTEGER, LOCATION ADDRESS, "
+        + "COF_TYPES COF_ARRAY, MGR REF MANAGER )";
+    Statement stmt;
+
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+
+      stmt.executeUpdate(createArray);
+      stmt.executeUpdate(createTable);
+
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateSuppliers.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateSuppliers.java
new file mode 100644
index 0000000..b5c15e3
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateSuppliers.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.net.URL;
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class CreateSuppliers {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    String createString;
+    createString = "create table SUPPLIERS " + "(SUP_ID int, " + "SUP_NAME varchar(40), " + "STREET varchar(40), "
+        + "CITY varchar(20), " + "STATE char(2), ZIP char(5))";
+
+    Statement stmt;
+
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+      stmt.executeUpdate(createString);
+
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateUDTs.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateUDTs.java
new file mode 100644
index 0000000..cdfdce7
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/CreateUDTs.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class CreateUDTs {
+  public static void main(String args[]) {
+
+    Connection con;
+    Statement stmt;
+
+    String createAddress = "CREATE TYPE ADDRESS (NUM INTEGER, " + "STREET VARCHAR(40), CITY VARCHAR(40), "
+        + "STATE CHAR(2), ZIP CHAR(5))";
+
+    String createManager = "CREATE TYPE MANAGER (MGR_ID INTEGER, " + "LAST_NAME VARCHAR(40), FIRST_NAME VARCHAR(40), "
+        + "PHONE char(10))";
+
+    try {
+
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+
+      stmt.executeUpdate(createAddress);
+      stmt.executeUpdate("CREATE TYPE PHONE_NO AS CHAR(10)");
+      stmt.executeUpdate(createManager);
+
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("-----SQLException-----");
+      System.err.println("SQLState:  " + ex.getSQLState());
+      System.err.println("Message:  " + ex.getMessage());
+      System.err.println("Vendor:  " + ex.getErrorCode());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/DataType.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/DataType.java
new file mode 100644
index 0000000..f795d56
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/DataType.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+public class DataType {
+
+  private int code;
+  private String SQLType;
+  private String localType = null;
+  private String params = null;
+  private boolean needsSetting = true;
+
+  public DataType(int code, String SQLType) {
+    this.code = code;
+    this.SQLType = SQLType;
+
+  }
+
+  public boolean needsToBeSet() {
+    return needsSetting;
+  }
+
+  public int getCode() {
+    return code;
+  }
+
+  public String getSQLType() {
+    return SQLType;
+  }
+
+  public String getLocalType() {
+    return localType;
+  }
+
+  public String getParams() {
+    return params;
+  }
+
+  public void setLocalTypeAndParams(String local, String p) {
+    if (needsSetting) {
+      localType = local;
+      params = p;
+      needsSetting = false;
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/ForeignKeysCoffees.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/ForeignKeysCoffees.java
new file mode 100644
index 0000000..886bd00
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/ForeignKeysCoffees.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class ForeignKeysCoffees {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    String createString = "create table COFFEESFK " + "(COF_NAME varchar(32) NOT NULL, " + "SUP_ID int, "
+        + "PRICE float, " + "SALES int, " + "TOTAL int, " + "primary key(COF_NAME), "
+        + "foreign key(SUP_ID) references SUPPLIERSPK)";
+    Statement stmt;
+
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+      stmt.executeUpdate(createString);
+
+      DatabaseMetaData dbmd = con.getMetaData();
+
+      ResultSet rs = dbmd.getImportedKeys(null, null, "COFFEESFK");
+      while (rs.next()) {
+        String pkTable = rs.getString("PKTABLE_NAME");
+        String pkColName = rs.getString("PKCOLUMN_NAME");
+        String fkTable = rs.getString("FKTABLE_NAME");
+        String fkColName = rs.getString("FKCOLUMN_NAME");
+        short updateRule = rs.getShort("UPDATE_RULE");
+        short deleteRule = rs.getShort("DELETE_RULE");
+        System.out.println("primary key table name :  " + pkTable);
+        System.out.print("primary key column name :  ");
+        System.out.println(pkColName);
+        System.out.println("foreign key table name :  " + fkTable);
+        System.out.print("foreign key column name :  ");
+        System.out.println(fkColName);
+        System.out.println("update rule:  " + updateRule);
+        System.out.println("delete rule:  " + deleteRule);
+        System.out.println("");
+      }
+
+      rs.close();
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.print("SQLException: ");
+      System.err.println(ex.getMessage());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/GetParamMetaData.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/GetParamMetaData.java
new file mode 100644
index 0000000..9db7100
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/GetParamMetaData.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class GetParamMetaData {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    PreparedStatement pstmt;
+    ParameterMetaData pmd;
+
+    String sql = "UPDATE COFFEES SET SALES = ? " + "WHERE COF_NAME = ?";
+
+    try {
+
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      pstmt = con.prepareStatement(sql);
+
+      pmd = pstmt.getParameterMetaData();
+
+      int totalDigits = pmd.getPrecision(1);
+      int digitsAfterDecimal = pmd.getScale(1);
+      boolean b = pmd.isSigned(1);
+      System.out.println("The first parameter ");
+      System.out.println("    has precision " + totalDigits);
+      System.out.println("    has scale " + digitsAfterDecimal);
+      System.out.println("    may be a signed number " + b);
+
+      int count = pmd.getParameterCount();
+      System.out.println("count is " + count);
+
+      for (int i = 1; i <= count; i++) {
+        int type = pmd.getParameterType(i);
+        String typeName = pmd.getParameterTypeName(i);
+        System.out.println("Parameter " + i + ":");
+        System.out.println("    type is " + type);
+        System.out.println("    type name is " + typeName);
+      }
+
+      pstmt.close();
+      con.close();
+
+    } catch (Exception e) {
+      e.printStackTrace();
+
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertCoffees.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertCoffees.java
new file mode 100644
index 0000000..b3735e4
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertCoffees.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class InsertCoffees {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    Statement stmt;
+    String query = "select COF_NAME, PRICE from COFFEES";
+
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+
+      stmt.executeUpdate("insert into COFFEES " + "values('Colombian', 00101, 7.99, 0, 0)");
+
+      stmt.executeUpdate("insert into COFFEES " + "values('French_Roast', 00049, 8.99, 0, 0)");
+
+      stmt.executeUpdate("insert into COFFEES " + "values('Espresso', 00150, 9.99, 0, 0)");
+
+      stmt.executeUpdate("insert into COFFEES " + "values('Colombian_Decaf', 00101, 8.99, 0, 0)");
+
+      stmt.executeUpdate("insert into COFFEES " + "values('French_Roast_Decaf', 00049, 9.99, 0, 0)");
+
+      ResultSet rs = stmt.executeQuery(query);
+
+      System.out.println("Coffee Break Coffees and Prices:");
+      while (rs.next()) {
+        String s = rs.getString("COF_NAME");
+        float f = rs.getFloat("PRICE");
+        System.out.println(s + "   " + f);
+      }
+
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertRow.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertRow.java
new file mode 100644
index 0000000..579075e
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertRow.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class InsertRow {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    Statement stmt;
+    String query = "select COF_NAME, PRICE from COFFEES";
+
+    try {
+
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
+      ResultSet uprs = stmt.executeQuery("SELECT * FROM COFFEES");
+
+      uprs.moveToInsertRow();
+
+      uprs.updateString("COF_NAME", "Kona");
+      uprs.updateInt("SUP_ID", 150);
+      uprs.updateFloat("PRICE", 10.99f);
+      uprs.updateInt("SALES", 0);
+      uprs.updateInt("TOTAL", 0);
+
+      uprs.insertRow();
+      uprs.beforeFirst();
+
+      System.out.println("Table COFFEES after insertion:");
+      while (uprs.next()) {
+        String s = uprs.getString("COF_NAME");
+        int sup = uprs.getInt("SUP_ID");
+        float f = uprs.getFloat("PRICE");
+        int sales = uprs.getInt("SALES");
+        int t = uprs.getInt("TOTAL");
+        System.out.print(s + "   " + sup + "   " + f + "   ");
+        System.out.println(sales + "   " + t);
+      }
+
+      uprs.close();
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertRows.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertRows.java
new file mode 100644
index 0000000..1d14c3a
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertRows.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class InsertRows {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    Statement stmt;
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
+
+      ResultSet uprs = stmt.executeQuery("SELECT * FROM COFFEES");
+
+      uprs.moveToInsertRow();
+
+      uprs.updateString("COF_NAME", "Kona");
+      uprs.updateInt("SUP_ID", 150);
+      uprs.updateFloat("PRICE", 10.99f);
+      uprs.updateInt("SALES", 0);
+      uprs.updateInt("TOTAL", 0);
+
+      uprs.insertRow();
+
+      uprs.updateString("COF_NAME", "Kona_Decaf");
+      uprs.updateInt("SUP_ID", 150);
+      uprs.updateFloat("PRICE", 11.99f);
+      uprs.updateInt("SALES", 0);
+      uprs.updateInt("TOTAL", 0);
+
+      uprs.insertRow();
+
+      uprs.beforeFirst();
+
+      System.out.println("Table COFFEES after insertion:");
+      while (uprs.next()) {
+        String name = uprs.getString("COF_NAME");
+        int id = uprs.getInt("SUP_ID");
+        float price = uprs.getFloat("PRICE");
+        int sales = uprs.getInt("SALES");
+        int total = uprs.getInt("TOTAL");
+        System.out.print(name + "   " + id + "   " + price);
+        System.out.println("   " + sales + "   " + total);
+      }
+
+      uprs.close();
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertStores.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertStores.java
new file mode 100644
index 0000000..cd9d99f
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertStores.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class InsertStores {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    Statement stmt;
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+      con.setAutoCommit(false);
+
+      String insertStore1 = "INSERT INTO STORES VALUES (" + "100001, "
+          + "ADDRESS(888, 'Main_Street', 'Rancho_Alegre', " + "'CA', '94049'), "
+          + "COF_ARRAY('Colombian', 'French_Roast', 'Espresso', " + "'Colombian_Decaf', 'French_Roast_Decaf'), "
+          + "(SELECT OID FROM MANAGERS WHERE MGR_ID = 000001))";
+
+      stmt.addBatch(insertStore1);
+
+      String insertStore2 = "INSERT INTO STORES VALUES (" + "100002, " + "ADDRESS(1560, 'Alder', 'Ochos_Pinos', "
+          + "'CA', '94049'), " + "COF_ARRAY('Colombian', 'French_Roast', 'Espresso', "
+          + "'Colombian_Decaf', 'French_Roast_Decaf', " + "'Kona', 'Kona_Decaf'), "
+          + "(SELECT OID FROM MANAGERS WHERE MGR_ID = 000001))";
+
+      stmt.addBatch(insertStore2);
+
+      String insertStore3 = "INSERT INTO STORES VALUES (" + "100003, " + "ADDRESS(4344, 'First_Street', 'Verona', "
+          + "'CA', '94545'), " + "COF_ARRAY('Colombian', 'French_Roast', 'Espresso', "
+          + "'Colombian_Decaf', 'French_Roast_Decaf', " + "'Kona', 'Kona_Decaf'), "
+          + "(SELECT OID FROM MANAGERS WHERE MGR_ID = 000002))";
+
+      stmt.addBatch(insertStore3);
+
+      String insertStore4 = "INSERT INTO STORES VALUES (" + "100004, " + "ADDRESS(321, 'Sandy_Way', 'La_Playa', "
+          + "'CA', '94544'), " + "COF_ARRAY('Colombian', 'French_Roast', 'Espresso', "
+          + "'Colombian_Decaf', 'French_Roast_Decaf', " + "'Kona', 'Kona_Decaf'), "
+          + "(SELECT OID FROM MANAGERS WHERE MGR_ID = 000002))";
+
+      stmt.addBatch(insertStore4);
+
+      String insertStore5 = "INSERT INTO STORES VALUES (" + "100005, " + "ADDRESS(1000, 'Clover_Road', 'Happyville', "
+          + "'CA', '90566'), " + "COF_ARRAY('Colombian', 'French_Roast', 'Espresso', "
+          + "'Colombian_Decaf', 'French_Roast_Decaf'), " + "(SELECT OID FROM MANAGERS WHERE MGR_ID = 000003))";
+
+      stmt.addBatch(insertStore5);
+
+      int[] updateCounts = stmt.executeBatch();
+
+      ResultSet rs = stmt.executeQuery("SELECT * FROM STORES");
+
+      System.out.println("Table STORES after insertion:");
+      System.out.println("STORE_NO  LOCATION          COF_TYPE     MGR");
+      while (rs.next()) {
+        int storeNo = rs.getInt("STORE_NO");
+        Struct location = (Struct) rs.getObject("LOCATION");
+        Object[] locAttrs = location.getAttributes();
+        Array coffeeTypes = rs.getArray("COF_TYPE");
+        String[] cofTypes = (String[]) coffeeTypes.getArray();
+
+        Ref managerRef = rs.getRef("MGR");
+        PreparedStatement pstmt = con.prepareStatement("SELECT MANAGER FROM MANAGERS WHERE OID = ?");
+        pstmt.setRef(1, managerRef);
+        ResultSet rs2 = pstmt.executeQuery();
+        rs2.next();
+        Struct manager = (Struct) rs2.getObject("MANAGER");
+        Object[] manAttrs = manager.getAttributes();
+
+        System.out.print(storeNo + "   ");
+        System.out.print(locAttrs[0] + " " + locAttrs[1] + " " + locAttrs[2] + ", " + locAttrs[3] + "  " + locAttrs[4]
+            + " ");
+        for (int i = 0; i < cofTypes.length; i++)
+          System.out.print(cofTypes[i] + " ");
+        System.out.println(manAttrs[1] + ", " + manAttrs[2]);
+
+        rs2.close();
+        pstmt.close();
+      }
+
+      rs.close();
+      stmt.close();
+      con.close();
+
+    } catch (BatchUpdateException b) {
+      System.err.println("-----BatchUpdateException-----");
+      System.err.println("SQLState:  " + b.getSQLState());
+      System.err.println("Message:  " + b.getMessage());
+      System.err.println("Vendor:  " + b.getErrorCode());
+      System.err.print("Update counts:  ");
+      int[] updateCounts = b.getUpdateCounts();
+      for (int i = 0; i < updateCounts.length; i++) {
+        System.err.print(updateCounts[i] + "   ");
+      }
+      System.err.println("");
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+      System.err.println("SQLState:  " + ex.getSQLState());
+      System.err.println("Message:  " + ex.getMessage());
+      System.err.println("Vendor:  " + ex.getErrorCode());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertSuppliers.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertSuppliers.java
new file mode 100644
index 0000000..1c2eaaa
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/InsertSuppliers.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class InsertSuppliers {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    Statement stmt;
+    String query = "select SUP_NAME, SUP_ID from SUPPLIERS";
+
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+
+      stmt.executeUpdate("insert into SUPPLIERS " + "values(49, 'Superior Coffee', '1 Party Place', "
+          + "'Mendocino', 'CA', '95460')");
+
+      stmt.executeUpdate("insert into SUPPLIERS " + "values(101, 'Acme, Inc.', '99 Market Street', "
+          + "'Groundsville', 'CA', '95199')");
+
+      stmt.executeUpdate("insert into SUPPLIERS " + "values(150, 'The High Ground', '100 Coffee Lane', "
+          + "'Meadows', 'CA', '93966')");
+
+      ResultSet rs = stmt.executeQuery(query);
+
+      System.out.println("Suppliers and their ID Numbers:");
+      while (rs.next()) {
+        String s = rs.getString("SUP_NAME");
+        int n = rs.getInt("SUP_ID");
+        System.out.println(s + "   " + n);
+      }
+
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/Join.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/Join.java
new file mode 100644
index 0000000..8fe63e6
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/Join.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class Join {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    String query = "select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " + "from COFFEES, SUPPLIERS "
+        + "where SUPPLIERS.SUP_NAME like 'Acme, Inc.' and " + "SUPPLIERS.SUP_ID = COFFEES.SUP_ID";
+    Statement stmt;
+
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+
+      ResultSet rs = stmt.executeQuery(query);
+      System.out.println("Supplier, Coffee:");
+      while (rs.next()) {
+        String supName = rs.getString(1);
+        String cofName = rs.getString(2);
+        System.out.println("    " + supName + ", " + cofName);
+      }
+
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.print("SQLException: ");
+      System.err.println(ex.getMessage());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/OutputApplet.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/OutputApplet.java
new file mode 100644
index 0000000..d6a4d75
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/OutputApplet.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+
+/**
+ * This is a demonstration JDBC applet.
+ * It displays some simple standard output from the Coffee database.
+ */
+package com.supwisdom.jdbc;
+
+import java.applet.Applet;
+import java.awt.Graphics;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Enumeration;
+import java.util.Vector;
+import static com.supwisdom.App.*;
+
+public class OutputApplet extends Applet implements Runnable {
+  private Thread worker;
+  private Vector queryResults;
+  private String message = "Initializing";
+
+  public synchronized void start() {
+    // Every time "start" is called we create a worker thread to
+    // re-evaluate the database query.
+    if (worker == null) {
+      message = "Connecting to database";
+      worker = new Thread(this);
+      worker.start();
+    }
+  }
+
+  /**
+   * The "run" method is called from the worker thread. Notice that
+   * because this method is doing potentially slow databases accesses
+   * we avoid making it a synchronized method.
+   */
+
+  public void run() {
+
+    String query = "select COF_NAME, PRICE from COFFEES";
+
+    try {
+      Class.forName(JDBC_DRIVER);
+    } catch (Exception ex) {
+      setError("Can't find Database driver class: " + ex);
+      return;
+    }
+
+    try {
+      Vector results = new Vector();
+      Connection con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+      Statement stmt = con.createStatement();
+      ResultSet rs = stmt.executeQuery(query);
+      while (rs.next()) {
+        String s = rs.getString("COF_NAME");
+        float f = rs.getFloat("PRICE");
+        String text = s + "     " + f;
+        results.addElement(text);
+      }
+
+      stmt.close();
+      con.close();
+
+      setResults(results);
+
+    } catch (SQLException ex) {
+      setError("SQLException: " + ex);
+    }
+  }
+
+  /**
+   * The "paint" method is called by AWT when it wants us to
+   * display our current state on the screen.
+   */
+
+  public synchronized void paint(Graphics g) {
+    // If there are no results available, display the current message.
+    if (queryResults == null) {
+      g.drawString(message, 5, 50);
+      return;
+    }
+
+    // Display the results.
+    g.drawString("Prices of coffee per pound:  ", 5, 10);
+    int y = 30;
+    Enumeration enum1 = queryResults.elements();
+    while (enum1.hasMoreElements()) {
+      String text = (String) enum1.nextElement();
+      g.drawString(text, 5, y);
+      y = y + 15;
+    }
+  }
+
+  /**
+   * This private method is used to record an error message for
+   * later display.
+   */
+
+  private synchronized void setError(String mess) {
+    queryResults = null;
+    message = mess;
+    worker = null;
+    // And ask AWT to repaint this applet.
+    repaint();
+  }
+
+  /**
+   * This private method is used to record the results of a query, for
+   * later display.
+   */
+
+  private synchronized void setResults(Vector results) {
+    queryResults = results;
+    worker = null;
+    // And ask AWT to repaint this applet.
+    repaint();
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/PrimaryKeysSuppliers.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/PrimaryKeysSuppliers.java
new file mode 100644
index 0000000..12b2413
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/PrimaryKeysSuppliers.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */ 
+package com.supwisdom.jdbc;
+import java.sql.*;
+import static com.supwisdom.App.*;
+public class PrimaryKeysSuppliers  {
+
+	public static void main(String args[]) {
+		  
+		
+		Connection con;
+		String createString = "create table SUPPLIERSPK " +
+								"(SUP_ID INTEGER NOT NULL, " +
+								"SUP_NAME VARCHAR(40), " +
+								"STREET VARCHAR(40), " +
+								"CITY VARCHAR(20), " +
+								"STATE CHAR(2), " +
+								"ZIP CHAR(5), " +
+								"primary key(SUP_ID))";
+		Statement stmt;
+	
+		try {
+			Class.forName(JDBC_DRIVER);
+	
+		} catch(java.lang.ClassNotFoundException e) {
+			System.err.print("ClassNotFoundException: "); 
+			System.err.println(e.getMessage());
+		}
+
+		try {
+			con = DriverManager.getConnection(JDBC_URL, 
+									 DB_USERNAME, DB_PASSWORD);
+			
+			stmt  = con.createStatement();
+			stmt.executeUpdate(createString);
+	
+			DatabaseMetaData dbmd = con.getMetaData();
+	
+			ResultSet rs = dbmd.getPrimaryKeys(null, null, "SUPPLIERSPK");
+			while (rs.next()) {
+				String name = rs.getString("TABLE_NAME");
+				String columnName = rs.getString("COLUMN_NAME");
+				String keySeq = rs.getString("KEY_SEQ");
+				String pkName = rs.getString("PK_NAME");
+				System.out.println("table name :  " + name);
+				System.out.println("column name:  " + columnName);
+				System.out.println("sequence in key:  " + keySeq);
+				System.out.println("primary key name:  " + pkName);
+				System.out.println("");
+			}
+		
+			rs.close();
+			con.close();
+	
+		} catch(SQLException ex) {
+			System.err.print("SQLException: ");
+			System.err.println(ex.getMessage());
+		}
+	}
+}
+
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/PrintColumnTypes.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/PrintColumnTypes.java
new file mode 100644
index 0000000..28a55c7
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/PrintColumnTypes.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+
+public class PrintColumnTypes {
+
+  public static void printColTypes(ResultSetMetaData rsmd) throws SQLException {
+    int columns = rsmd.getColumnCount();
+    for (int i = 1; i <= columns; i++) {
+      int jdbcType = rsmd.getColumnType(i);
+      String name = rsmd.getColumnTypeName(i);
+      System.out.print("Column " + i + " is JDBC type " + jdbcType);
+      System.out.println(", which the DBMS calls " + name);
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/PrintColumns.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/PrintColumns.java
new file mode 100644
index 0000000..bf54d47
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/PrintColumns.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */ 
+package com.supwisdom.jdbc;
+import java.sql.*;
+import static com.supwisdom.App.*;
+class PrintColumns  {
+
+	public static void main(String args[]) {
+		  
+		
+		Connection con;
+		String query = "select * from COFFEES";
+		Statement stmt;
+	
+		try {
+			Class.forName(JDBC_DRIVER);
+	
+		} catch(java.lang.ClassNotFoundException e) {
+			System.err.print("ClassNotFoundException: "); 
+			System.err.println(e.getMessage());
+		}
+
+		try {
+			con = DriverManager.getConnection(JDBC_URL, 
+									 DB_USERNAME, DB_PASSWORD);
+	
+			stmt = con.createStatement();							
+	
+			ResultSet rs = stmt.executeQuery(query);
+			ResultSetMetaData rsmd = rs.getMetaData();
+	
+			PrintColumnTypes.printColTypes(rsmd);
+			System.out.println("");
+	
+			int numberOfColumns = rsmd.getColumnCount();
+	
+			for (int i = 1; i <= numberOfColumns; i++) {
+				if (i > 1) System.out.print(",  ");
+				String columnName = rsmd.getColumnName(i);
+				System.out.print(columnName);
+			}
+			System.out.println("");
+	
+			while (rs.next()) {
+				for (int i = 1; i <= numberOfColumns; i++) {
+					if (i > 1) System.out.print(",  ");
+					String columnValue = rs.getString(i);
+					System.out.print(columnValue);
+				}
+				System.out.println("");	
+			}
+	
+			stmt.close();
+			con.close();
+		} catch(SQLException ex) {
+			System.err.print("SQLException: ");
+			System.err.println(ex.getMessage());
+		}	
+	}
+}
+
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/README b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/README
new file mode 100644
index 0000000..b677000
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/README
@@ -0,0 +1,53 @@
+The example code in this directory is taken from the book "JDBC(TM) API Tutorial
+and Reference, Third Edition," by Maydene Fisher, Jon Ellis, and Jonathan Bruce.
+Most of the examples are from the tutorials.
+
+Before you can run the example code, you will need to do the following:
+
+1. Unzip the file containing the sample code.
+
+	   unzip codeExamples.zip
+
+2. Substitute your driver's JDBC URL for the generic JDBC URL 
+   that appears in the code. In other words, put your driver's JDBC URL 
+   between the quotation marks in the follwoing line:
+
+        String url = "jdbc:mySubprotocol:myDataSource";
+
+   The documentation for your driver should give you this URL.
+
+3. Substitute the driver's full class name for "myDriver.ClassName" in
+   the following line:
+
+			Class.forName("myDriver.ClassName");
+
+4. Substitute the username and password you use for your database 
+   in the following:
+
+           "myLogin", "myPassword"
+
+
+Two of the .java files contain method(s) that are used in other files and cannot
+be run by themselves:
+
+	- PrintColumnTypes.java defines a method used in PrintColumns.java
+	- DataType.java defines methods used in CreateNewTable.java
+
+
+
+Note that the following code samples have been compiled but not executed because
+at the time of testing, not all drivers implemented all of the features used in the 
+code:
+
+	  CreateRef.java
+	  CreateStores.java
+	  InsertStores.java
+	  AutoGenKeys.java
+	  GetParamMetaData.java
+
+Note also that the syntax for creating SQL99 types can vary from one DBMS to
+another, so you should be sure to check the documentation to see the exact
+syntax your DBMS expects.
+
+
+
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/RSMetaDataMethods.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/RSMetaDataMethods.java
new file mode 100644
index 0000000..b276fa1
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/RSMetaDataMethods.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class RSMetaDataMethods {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    Statement stmt;
+
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+
+      ResultSet rs = stmt.executeQuery("select * from COFFEES");
+      ResultSetMetaData rsmd = rs.getMetaData();
+
+      int numberOfColumns = rsmd.getColumnCount();
+      for (int i = 1; i <= numberOfColumns; i++) {
+        String colName = rsmd.getColumnName(i);
+        String tableName = rsmd.getTableName(i);
+        String name = rsmd.getColumnTypeName(i);
+        boolean caseSen = rsmd.isCaseSensitive(i);
+        boolean writable = rsmd.isWritable(i);
+        System.out.println("Information for column " + colName);
+        System.out.println("    Column is in table " + tableName);
+        System.out.println("    DBMS name for type is " + name);
+        System.out.println("    Is case sensitive:  " + caseSen);
+        System.out.println("    Is possibly writable:  " + writable);
+        System.out.println("");
+      }
+
+      while (rs.next()) {
+        for (int i = 1; i <= numberOfColumns; i++) {
+          String s = rs.getString(i);
+          System.out.print(s + "  ");
+        }
+        System.out.println("");
+      }
+
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/SQLStatement.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/SQLStatement.java
new file mode 100644
index 0000000..7987cfc
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/SQLStatement.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class SQLStatement {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    String query = "select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " + "from COFFEES, SUPPLIERS "
+        + "where SUPPLIERS.SUP_NAME like 'Acme, Inc.' and " + "SUPPLIERS.SUP_ID = COFFEES.SUP_ID";
+    Statement stmt;
+
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement();
+
+      ResultSet rs = stmt.executeQuery(query);
+      ResultSetMetaData rsmd = rs.getMetaData();
+      int numberOfColumns = rsmd.getColumnCount();
+      int rowCount = 1;
+      while (rs.next()) {
+        System.out.println("Row " + rowCount + ":  ");
+        for (int i = 1; i <= numberOfColumns; i++) {
+          System.out.print("   Column " + i + ":  ");
+          System.out.println(rs.getString(i));
+        }
+        System.out.println("");
+        rowCount++;
+      }
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.print("SQLException: ");
+      System.err.println(ex.getMessage());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/ScrollableResultSet.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/ScrollableResultSet.java
new file mode 100644
index 0000000..8e4f60e
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/ScrollableResultSet.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class ScrollableResultSet {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    Statement stmt;
+    try {
+
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
+
+      ResultSet srs = stmt.executeQuery("SELECT * FROM COFFEES");
+
+      srs.absolute(4);
+      int rowNum = srs.getRow(); // rowNum should be 4
+      System.out.println("rowNum should be 4 " + rowNum);
+      srs.relative(-3);
+      rowNum = srs.getRow(); // rowNum should be 1
+      System.out.println("rowNum should be 1 " + rowNum);
+      srs.relative(2);
+      rowNum = srs.getRow(); // rowNum should be 3
+      System.out.println("rowNum should be 3 " + rowNum);
+
+      srs.absolute(1);
+      System.out.println("after last? " + srs.isAfterLast());
+      if (!srs.isAfterLast()) {
+        String name = srs.getString("COF_NAME");
+        float price = srs.getFloat("PRICE");
+        System.out.println(name + "     " + price);
+      }
+
+      srs.afterLast();
+      while (srs.previous()) {
+        String name = srs.getString("COF_NAME");
+        float price = srs.getFloat("PRICE");
+        System.out.println(name + "     " + price);
+      }
+
+      srs.close();
+      stmt.close();
+      con.close();
+
+    } catch (BatchUpdateException b) {
+      System.err.println("-----BatchUpdateException-----");
+      System.err.println("SQLState:  " + b.getSQLState());
+      System.err.println("Message:  " + b.getMessage());
+      System.err.println("Vendor:  " + b.getErrorCode());
+      System.err.print("Update counts:  ");
+      int[] updateCounts = b.getUpdateCounts();
+      for (int i = 0; i < updateCounts.length; i++) {
+        System.err.print(updateCounts[i] + "   ");
+      }
+      System.out.println("");
+
+    } catch (SQLException ex) {
+      System.err.println("-----SQLException-----");
+      System.err.println("SQLState:  " + ex.getSQLState());
+      System.err.println("Message:  " + ex.getMessage());
+      System.err.println("Vendor:  " + ex.getErrorCode());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/SetSavepoint.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/SetSavepoint.java
new file mode 100644
index 0000000..861ea44
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/SetSavepoint.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class SetSavepoint {
+
+  public static void main(String args[]) {
+
+    try {
+
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+
+      Connection con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+      con.setAutoCommit(false);
+
+      String query = "SELECT COF_NAME, PRICE FROM COFFEES " + "WHERE TOTAL > ?";
+      String update = "UPDATE COFFEES SET PRICE = ? " + "WHERE COF_NAME = ?";
+
+      PreparedStatement getPrice = con.prepareStatement(query);
+      PreparedStatement updatePrice = con.prepareStatement(update);
+
+      getPrice.setInt(1, 7000);
+      ResultSet rs = getPrice.executeQuery();
+
+      Savepoint save1 = con.setSavepoint();
+
+      while (rs.next()) {
+        String cof = rs.getString("COF_NAME");
+        float oldPrice = rs.getFloat("PRICE");
+        float newPrice = oldPrice + (oldPrice * .05f);
+        updatePrice.setFloat(1, newPrice);
+        updatePrice.setString(2, cof);
+        updatePrice.executeUpdate();
+        System.out.println("New price of " + cof + " is " + newPrice);
+        if (newPrice > 11.99) {
+          con.rollback(save1);
+        }
+
+      }
+
+      getPrice = con.prepareStatement(query);
+      updatePrice = con.prepareStatement(update);
+
+      getPrice.setInt(1, 8000);
+
+      rs = getPrice.executeQuery();
+      System.out.println();
+
+      Savepoint save2 = con.setSavepoint();
+
+      while (rs.next()) {
+        String cof = rs.getString("COF_NAME");
+        float oldPrice = rs.getFloat("PRICE");
+        float newPrice = oldPrice + (oldPrice * .05f);
+        updatePrice.setFloat(1, newPrice);
+        updatePrice.setString(2, cof);
+        updatePrice.executeUpdate();
+        System.out.println("New price of " + cof + " is " + newPrice);
+        if (newPrice > 11.99) {
+          con.rollback(save2);
+        }
+      }
+
+      con.commit();
+
+      Statement stmt = con.createStatement();
+      rs = stmt.executeQuery("SELECT COF_NAME, " + "PRICE FROM COFFEES");
+
+      System.out.println();
+      while (rs.next()) {
+        String name = rs.getString("COF_NAME");
+        float price = rs.getFloat("PRICE");
+        System.out.println("Current price of " + name + " is " + price);
+      }
+
+      con.close();
+
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+
+  }
+
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/TableTypes.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/TableTypes.java
new file mode 100644
index 0000000..f6afacf
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/TableTypes.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class TableTypes {
+
+  public static void main(String args[]) {
+
+    Connection con;
+
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      DatabaseMetaData dbmd = con.getMetaData();
+      String dbmsName = dbmd.getDatabaseProductName();
+      ResultSet rs = dbmd.getTableTypes();
+      System.out.print("The following types of tables are ");
+      System.out.println("available in " + dbmsName + ":  ");
+
+      while (rs.next()) {
+        String tableType = rs.getString("TABLE_TYPE");
+        System.out.println("    " + tableType);
+      }
+
+      rs.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.print("SQLException: ");
+      System.err.println(ex.getMessage());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/TransactionPairs.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/TransactionPairs.java
new file mode 100644
index 0000000..3631989
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/TransactionPairs.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class TransactionPairs {
+
+  public static void main(String args[]) {
+
+    Connection con = null;
+    Statement stmt;
+    PreparedStatement updateSales;
+    PreparedStatement updateTotal;
+    String updateString = "update COFFEES " + "set SALES = ? where COF_NAME = ?";
+
+    String updateStatement = "update COFFEES " + "set TOTAL = TOTAL + ? where COF_NAME = ?";
+    String query = "select COF_NAME, SALES, TOTAL from COFFEES";
+
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      updateSales = con.prepareStatement(updateString);
+      updateTotal = con.prepareStatement(updateStatement);
+      int[] salesForWeek = { 175, 150, 60, 155, 90 };
+      String[] coffees = { "Colombian", "French_Roast", "Espresso", "Colombian_Decaf", "French_Roast_Decaf" };
+      int len = coffees.length;
+      con.setAutoCommit(false);
+      for (int i = 0; i < len; i++) {
+        updateSales.setInt(1, salesForWeek[i]);
+        updateSales.setString(2, coffees[i]);
+        updateSales.executeUpdate();
+
+        updateTotal.setInt(1, salesForWeek[i]);
+        updateTotal.setString(2, coffees[i]);
+        updateTotal.executeUpdate();
+        con.commit();
+      }
+
+      con.setAutoCommit(true);
+
+      updateSales.close();
+      updateTotal.close();
+
+      stmt = con.createStatement();
+      ResultSet rs = stmt.executeQuery(query);
+
+      while (rs.next()) {
+        String c = rs.getString("COF_NAME");
+        int s = rs.getInt("SALES");
+        int t = rs.getInt("TOTAL");
+        System.out.println(c + "     " + s + "    " + t);
+      }
+
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+      if (con != null) {
+        try {
+          System.err.print("Transaction is being ");
+          System.err.println("rolled back");
+          con.rollback();
+        } catch (SQLException excep) {
+          System.err.print("SQLException: ");
+          System.err.println(excep.getMessage());
+        }
+      }
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/TypeConcurrency.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/TypeConcurrency.java
new file mode 100644
index 0000000..2c908d3
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/TypeConcurrency.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class TypeConcurrency {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    Statement stmt;
+    try {
+
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
+
+      ResultSet srs = stmt.executeQuery("SELECT * FROM COFFEES");
+
+      int type = srs.getType();
+
+      System.out.println("srs is type " + type);
+
+      int concur = srs.getConcurrency();
+
+      System.out.println("srs has concurrency " + concur);
+      while (srs.next()) {
+        String name = srs.getString("COF_NAME");
+        int id = srs.getInt("SUP_ID");
+        float price = srs.getFloat("PRICE");
+        int sales = srs.getInt("SALES");
+        int total = srs.getInt("TOTAL");
+        System.out.print(name + "   " + id + "   " + price);
+        System.out.println("   " + sales + "   " + total);
+      }
+
+      srs.close();
+      stmt.close();
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("-----SQLException-----");
+      System.err.println("SQLState:  " + ex.getSQLState());
+      System.err.println("Message:  " + ex.getMessage());
+      System.err.println("Vendor:  " + ex.getErrorCode());
+    }
+  }
+}
diff --git a/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/TypeInfo.java b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/TypeInfo.java
new file mode 100644
index 0000000..1da79b7
--- /dev/null
+++ b/jdbc-tutorial/src/main/java/com/supwisdom/jdbc/TypeInfo.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  ALL RIGHTS RESERVED.
+ * Use of this software is authorized pursuant to the terms of the license found at
+ * http://developer.java.sun.com/berkeley_license.html.
+ */
+package com.supwisdom.jdbc;
+
+import java.net.URL;
+import java.sql.*;
+import static com.supwisdom.App.*;
+
+public class TypeInfo {
+
+  public static void main(String args[]) {
+
+    Connection con;
+    DatabaseMetaData dbmd;
+
+    try {
+      Class.forName(JDBC_DRIVER);
+
+    } catch (java.lang.ClassNotFoundException e) {
+      System.err.print("ClassNotFoundException: ");
+      System.err.println(e.getMessage());
+    }
+
+    try {
+      con = DriverManager.getConnection(JDBC_URL, DB_USERNAME, DB_PASSWORD);
+
+      dbmd = con.getMetaData();
+
+      ResultSet rs = dbmd.getTypeInfo();
+      while (rs.next()) {
+        String typeName = rs.getString("TYPE_NAME");
+        short dataType = rs.getShort("DATA_TYPE");
+        String createParams = rs.getString("CREATE_PARAMS");
+        int nullable = rs.getInt("NULLABLE");
+        boolean caseSensitive = rs.getBoolean("CASE_SENSITIVE");
+        System.out.println("DBMS type " + typeName + ":");
+        System.out.println("     java.sql.Types:  " + dataType);
+        System.out.print("     parameters used to create: ");
+        System.out.println(createParams);
+        System.out.println("     nullable?:  " + nullable);
+        System.out.print("     case sensitive?:  ");
+        System.out.println(caseSensitive);
+        System.out.println("");
+
+      }
+
+      con.close();
+
+    } catch (SQLException ex) {
+      System.err.println("SQLException: " + ex.getMessage());
+    }
+  }
+}
