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