TypeMapDemo.java Source code

Java tutorial

Introduction

Here is the source code for TypeMapDemo.java

Source

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