Database SQL JDBC Java

/*
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.com/, 1996-2002. All rights
 * reserved. Software written by Ian F. Darwin and others. $Id: LICENSE,v 1.8
 * 2004/02/09 03:33:38 ian Exp $
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer. 2. Redistributions in
 * binary form must reproduce the above copyright notice, this list of
 * conditions and the following disclaimer in the documentation and/or other
 * materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * Java, the Duke mascot, and all variants of Sun's Java "steaming coffee cup"
 * logo are trademarks of Sun Microsystems. Sun's, and James Gosling's,
 * pioneering role in inventing and promulgating (and standardizing) the Java
 * language and environment is gratefully acknowledged.
 * 
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for
 * inventing predecessor languages C and C++ is also gratefully acknowledged.
 */
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;
import java.util.Properties;
/*
 * Following up on the javadoc for java.sql.Connection, make a TypeMap that maps
 * a *structured* UDT into a MusicRecording "automatically". @author Ian Darwin
 */
public class TypeMapDemo {
  public static void main(String[] args) throws IOException,
      ClassNotFoundException, SQLException {
    Properties p = new Properties();
    p.load(new FileInputStream("db.properties"));
    Class c = Class.forName(p.getProperty("db.driver"));
    System.out.println("Loaded driverClass " + c.getName());
    Connection con = DriverManager.getConnection(p.getProperty("db.url"),
        "student", "student");
    System.out.println("Got Connection " + con);
    Statement s = con.createStatement();
    int ret;
    try {
      s.executeUpdate("drop table MR");
      s.executeUpdate("drop type MUSICRECORDING");
    } catch (SQLException andDoNothingWithIt) {
      // Should use "if defined" but not sure it works for UDTs...
    }
    ret = s.executeUpdate("create type MUSICRECORDING as object ("
        + "  id integer," + "  title varchar(20), "
        + "  artist varchar(20) " + ")");
    System.out.println("Created TYPE! Ret=" + ret);
    ret = s.executeUpdate("create table MR of MUSICRECORDING");
    System.out.println("Created TABLE! Ret=" + ret);
    int nRows = s
        .executeUpdate("insert into MR values(123, 'Greatest Hits', 'Ian')");
    System.out.println("inserted " + nRows + " rows");
    // Put the data class into the connection's Type Map
    // If the data class were not an inner class,
    // this would likely be done with Class.forName(...);
    Map map = con.getTypeMap();
    map.put("MUSICRECORDING", MusicRecording.class);
    con.setTypeMap(map);
    ResultSet rs = s.executeQuery("select * from MR where id = 123");
    //"select musicrecording(id,artist,title) from mr");
    rs.next();
    for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
      Object o = rs.getObject(i);
      System.out.print(o + "(Type " + o.getClass().getName() + ")\t");
    }
    System.out.println();
  }
  /**
   * Simplified local copy of MusicRecording, so this pgm can stand alone.
   * This is an inner class just for illustrative purposes; it would normally
   * be an unrelated data class.
   */
  public class MusicRecording {
    int id;
    String title;
    String artist;
    public String toString() {
      return "MusicRecording#" + id + "[" + artist + "--" + title + "]";
    }
  }
}
//File: db.properties
/*
# JDBC Properties for various connections.
# DEFAULT
default.db.driver=oracle.jdbc.driver.OracleDriver
default.db.url=jdbc:oracle:thin:@server:1521:db570
default.db.user=student
default.db.password=student
# RainForest: Connection information for the Oracle database on the server
rain.oracle.db.driver=oracle.jdbc.driver.OracleDriver
rain.oracle.db.url=jdbc:oracle:thin:@server:1521:db570
rain.oracle.db.user=student
rain.oracle.db.password=student
# RainForest: Connection for the Access database on the local machine
rain.access.db.driver=sun.jdbc.odbc.JdbcOdbcDriver
rain.access.db.url=jdbc:odbc:RainForestDSN
rain.access.db.user=student
rain.access.db.password=student
*/