Java Database Derby Instance 1
package com.han.ch20.q1; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import com.han.Derby; public class UpdateStu { private static Connection conn; private static PreparedStatement ps; private static ResultSet rs; private static ResultSetMetaData rsmd; // ResultSetMetaData has not the close() method public static void main(String[] rgs){ Derby.loadDriver();// As is said in the class Derby, this action is not necessary with a JRE 1.6 and later. try { // create database "ch20" conn=Derby.createDatabaseAndGetConnection("ch20", "", ""); // drop the table "tb_emp" if it exists if(Derby.isTableExists("tb_emp", conn)){ ps=conn.prepareStatement("drop table tb_emp"); ps.execute(); } // create a table "tb_emp" in this database ps=conn.prepareStatement("create table tb_emp(id int, name varchar(20), department varchar(20))"); ps.execute(); // add elements into the table ps=conn.prepareStatement("insert into tb_emp values(?,?,?)"); ps.setInt(1, 1); ps.setString(2, "Jing LI"); ps.setString(3, "Computer technology"); ps.executeUpdate(); ps.setInt(1, 2); ps.setString(2, "Hao LI"); ps.setString(3, "Sales department"); ps.executeUpdate(); ps.setInt(1, 3); ps.setString(2, "Yuanyuan XIONG"); ps.setString(3, "Copumter technology"); ps.executeUpdate(); ps.setInt(1, 4); ps.setString(2, "Mei LIU"); ps.setString(3, "Sales department"); ps.executeUpdate(); // consult the information associated with the department "Sales department" ps=conn.prepareStatement("select * from tb_emp where department='Sales department'"); rs=ps.executeQuery(); // display the query results on the console rsmd=rs.getMetaData(); int numberOfColumns=rsmd.getColumnCount(); String[] columnNames=new String[numberOfColumns]; String[] columnTypeNames=new String[numberOfColumns]; int[] precisions=new int[numberOfColumns]; for(int i=0;i<numberOfColumns;i++){ columnNames[i]=rsmd.getColumnName(i+1); columnTypeNames[i]=rsmd.getColumnTypeName(i+1); precisions[i]=rsmd.getPrecision(i+1); System.out.println(columnNames[i]+" : " +columnTypeNames[i]+"(" +precisions[i]+")"); } for(int i=0;i<numberOfColumns;i++){ String columnName=columnNames[i]; if(columnName.length()>precisions[i]){ columnName=columnName.substring(0, precisions[i]); } System.out.printf("%-"+precisions[i]+"s|",columnName); } System.out.println(); while(rs.next()){ for(int i=0;i<numberOfColumns;i++){ System.out.printf("%-"+precisions[i]+"s|",rs.getObject(i+1)); } System.out.println(); } // close the opened resources rs.close(); ps.close(); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ // perform a clean database closing Derby.shutdownDatabase("ch20"); Derby.shutdownAll(); } } }
package com.han; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.HashSet; import java.util.Properties; /** * The Embedded mode is limited by that we can't run simultaneously * two programs (two JVM instances) using a same database (databaseName is the same). * <p> * But we can instead use the NetworkServer mode to avoid this case, * it is to say the "Client/Server" mode. * In this mode, you have to first start the NetworkServer by this command : * <pre> * java org.apache.derby.drda.NetworkServerControl start [-h hostIP -p portNumber] * </pre> * Or use the API : * <pre> * NetworkServerControl serverControl = new NetworkServerControl(InetAddress.getByName("myhost"),1621); * serverControl.shutdown(); * </pre> * schema is above the table/view. In MySQL schema is equivalent to database. * So in MySQL, create database==create schema, * but create database is not applicable to Java Derby. * <p> * In Derby, schema is also equivalent to a user name. * @author HAN * */ public class Derby { private static Connection con=null; private static String port=null; private static String ip=null; /** * The port will be set to default: 1527 */ public static void setPortToDefault(){ port="1527"; } public static void setPort(String port){ Derby.port=port; } public static void setServer(String ip){ Derby.ip=ip; } /** * This express loading driver is not necessary for Java 6 and later, JDBC 4.0 and later. * Because it can be added automatically by <code>DriverManager</code> when connecting to a database. */ public static void loadDriver(){ //load the driver if(port==null){ if(ip!=null){ System.out.println("You seem to have set an ip address, if so, you have also to assign a port, or else an embedded database will be automatically used"); } try { Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); System.out.println("The embedded driver is successfully loaded"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ try{ Class.forName("org.apache.derby.jdbc.ClientDriver"); System.out.println("The client driver is successfully loaded"); }catch(ClassNotFoundException e){ e.printStackTrace(); } } } /** * create and connect a database * @param databaseName * @param user * @param password * @return a connection to the URL * @throws SQLException */ public static Connection createDatabaseAndGetConnection(String databaseName, String user, String password) throws SQLException{ //create and connect the database Properties props=new Properties(); props.put("user",user); props.put("password",password); if(port==null){ if(ip!=null){ System.out.println("You seem to have set an ip address, if so, you have also to assign a port before loading the driver, or else an embedded database is automatically used"); } con=DriverManager.getConnection("jdbc:derby:"+databaseName+";create=true", props); System.out.println("Connection is successfully established, it uses an Embedded database"); }else if(ip==null){ con=DriverManager.getConnection("jdbc:derby://localhost:"+port+"/"+databaseName+";create=true", props); System.out.println("Connection is sucessfully established, it uses an network database but stored in the local host via the port: "+port); }else{ con=DriverManager.getConnection("jdbc:derby://"+ip+":"+port+"/"+databaseName+";create=true", props); System.out.println("Connection is sucessfully established, it uses an network database whose host ip is: "+ip+" and via the port: "+port); } return con; } /** * Shut down a specified database. But it doesn't matter that later we could also connect to another database. * Because the Derby engine is not closed. * @param databaseName */ public static void shutdownDatabase(String databaseName){ boolean gotSQLExc = false; if(port==null){ try { DriverManager.getConnection("jdbc:derby:"+databaseName+";shutdown=true"); } catch (SQLException se) { if ( se.getSQLState().equals("08006") ) { gotSQLExc = true; } } if (!gotSQLExc) { System.out.println("Database did not shut down normally"); } else { System.out.println("Database: "+databaseName+" shut down normally"); } }else if(ip==null){ try { DriverManager.getConnection("jdbc:derby://localhost:"+port+"/"+databaseName+";shutdown=true"); } catch (SQLException se) { // TODO Auto-generated catch block if ( se.getSQLState().equals("08006") ) { gotSQLExc = true; } } if (!gotSQLExc) { System.out.println("Database did not shut down normally"); } else { System.out.println("Database: "+databaseName+" shut down normally"); } }else{ try { DriverManager.getConnection("jdbc:derby://"+ip+":"+port+"/"+databaseName+";shutdown=true"); } catch (SQLException se) { if ( se.getSQLState().equals("08006") ) { gotSQLExc = true; } } if (!gotSQLExc) { System.out.println("Database did not shut down normally"); } else { System.out.println("Database: "+databaseName+" shut down normally"); } } } /** * shut down all opened databases and close the Derby engine. * The effect is that after the execution of this method, we will not permitted to use Derby again in the rest of our program. * Or else, an exception of "can't find a suitable driver for [a database URL]" will be thrown. * However, you can still use another approach to resolve this problem: newInstance() * For example, * <pre> * Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance(); * </pre> */ public static void shutdownAll(){ boolean gotSQLExc = false; try { DriverManager.getConnection("jdbc:derby:;shutdown=true"); } catch (SQLException se) { // TODO Auto-generated catch block if ( se.getSQLState().equals("XJ015") ) { gotSQLExc = true; } } if (!gotSQLExc) { System.out.println("Database did not shut down normally"); } else { System.out.println("All databases shut down normally and Derby completely closed"); } } /** * Just connect to a database desired by providing the appropriate parameters. * @param databaseName * @param user * @param password * @return * @throws SQLException */ public static Connection getConnection(String databaseName, String user, String password) throws SQLException{ if(port==null){ if(ip!=null){ System.out.println("You seem to have set an ip address, if so, you have also to assign a port before loading the driver, or else an embedded database is automatically used"); } con=DriverManager.getConnection("jdbc:derby:"+databaseName,user,password); System.out.println("Connection is sucessfully established, it uses an Embedded database"); }else if(ip==null){ con=DriverManager.getConnection("jdbc:derby://localhost:"+port+"/"+databaseName,user,password); System.out.println("Connection is sucessfully established, it uses an network database but stored in the local host via the port: "+port); }else{ con=DriverManager.getConnection("jdbc:derby://"+ip+":"+port+"/"+databaseName,user,password); System.out.println("Connection is sucessfully established, it uses an network database whose host ip is: "+ip+" and via the port: "+port); } return con; } public static HashSet<String> listAllTables(Connection con) throws SQLException{ DatabaseMetaData meta = con.getMetaData(); ResultSet res = meta.getTables(null, null, null, new String[]{"TABLE"}); HashSet<String> set=new HashSet<String>(); while (res.next()) { set.add(res.getString("TABLE_NAME")); //use TABLE_SCHEM to view all users or schemas //set.add(res.getString("TABLE_SCHEM")); } System.out.println("All the tables associated to current connection are :"); System.out.println(set); return set; } public static boolean isTableExists(String table, Connection con) throws SQLException{ if(listAllTables(con).contains(table.toUpperCase())){ return true; }else{ return false; } } public static HashSet<String> listAllSchemas(Connection con) throws SQLException{ DatabaseMetaData meta = con.getMetaData(); ResultSet res = meta.getSchemas(null, null); HashSet<String> set=new HashSet<String>(); while (res.next()) { set.add(res.getString("TABLE_SCHEM")); } System.out.println("All the schemas associated to current connection are :"); System.out.println(set); return set; } public static HashMap<String, String> listAllSchemasAndTables(Connection con) throws SQLException{ DatabaseMetaData meta = con.getMetaData(); ResultSet res = meta.getTables(null, null, null, new String[]{"TABLE"}); HashMap<String, String> map=new HashMap<String, String>(); while (res.next()) { map.put(res.getString("TABLE_SCHEM"),res.getString("TABLE_NAME")); } System.out.println("All the tables and their corresponding schemas associated to current connection are :"); System.out.println(map); return map; } }
posted on 2012-02-09 03:16 java课程设计例子 阅读(214) 评论(0) 编辑 收藏 举报