Mega Code Archive

 
Categories / Java / Database SQL JDBC
 

Following up on the javadoc for java sql Connection, make a TypeMap

/*  * 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 */