package com.han; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JavaDBUse1 { private static Connection con; private static Statement s; static void createTable(Statement s) throws SQLException{ s.execute("create table table1(" + "id char(6) not null primary key," + "name varchar(40)," + "score int)"); s.execute("insert into table1 values('016954', 'San ZHANG', 86)"); s.execute("insert into table1 values('016934', 'Wu WANG', 45)"); s.execute("insert into table1 values('016908', 'Si LI', 97)"); } public static void main(String[] args){ // Derby.setPort("1526"); // Derby.setServer("129.175.119.162"); /*NetworkServerControl serverControl = new NetworkServerControl(InetAddress.getByName("myhost"),1621); serverControl.shutdown();*/ Derby.loadDriver(); try { con=Derby.createDatabaseAndGetConnection("dbName1", "", ""); // con=Derby.getConnection("dbName3", "user2", ""); con.setAutoCommit(false); s=con.createStatement(); if(Derby.isTableExists("table1", con)){ ResultSet rs=s.executeQuery("select * from table1 order by score"); System.out.println(); while(rs.next()){ StringBuilder sb=new StringBuilder(rs.getString("id")); sb.append("\t"); sb.append(rs.getString("name")); sb.append("\t"); sb.append(rs.getInt("score")); System.out.println(sb.toString()); } System.out.println(); rs.close(); s.close(); con.commit(); con.close(); }else{ createTable(s); s.close(); con.commit(); con.close(); System.out.println("Table is created"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } Derby.shutdownDatabase("use1"); Derby.shutdownAll(); } }
package com.han; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.RowIdLifetime; import java.sql.SQLException; import java.sql.Statement; /** * ROWID is the logical or physical address of a designated row in database. * Different database providers have different supports for it. * So before using it in SQL, it is always a good practice to check the support capacity * of the database used. * <p> * The result is that Derby does not support ROWID, so it can not benefit the RowId class. * <p> * We have also done some tests of using the Derby. Found out that Derby is not bad and * is competent enough to do a normal data exploring as others. Its advantages are free, * small, embedded, and it is supported by many big companies like IBM, Oracle, Sun, and * a lot of liberated developers. It has a not bad perspective. * * @author GAOWEN * */ public class TestDerbyRowId { static Connection con=null; /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Derby.loadDriver(); try { con=Derby.getConnection("dbName1","",""); con.setAutoCommit(false);// for that later con.commit(); is valid DatabaseMetaData meta=con.getMetaData(); RowIdLifetime rowIdLifetime=meta.getRowIdLifetime(); System.out.println(rowIdLifetime);// To see if the Derby DBMS supports ROWID or not Derby.listAllTables(con); Derby.listAllSchemas(con); Derby.listAllSchemasAndTables(con); Statement s=con.createStatement(); ResultSet rs=s.executeQuery("select * from tableRenamed"); //ResultSetMetaData is useful to get information about the types and properties //of the columns in a ResultSet object //By the way, DatabaseMetaData is at a parallel level with ResultSetMetaData ResultSetMetaData rsmd=rs.getMetaData();// ResultSetMetaData has not the close() method int numberOfColumns=rsmd.getColumnCount(); System.out.println(rsmd.isSearchable(1)); System.out.println(numberOfColumns); System.out.println(rsmd.getTableName(3));// get the designated table name for(int i=1;i<=numberOfColumns;i++){ System.out.println(rsmd.getColumnName(i)+" : " +rsmd.getColumnTypeName(i)+"(" +rsmd.getPrecision(i)+")"); } while(rs.next()){ for(int i=1;i<=numberOfColumns;i++){ System.out.print(rs.getObject(i)+"\t"); } System.out.println(); } //s.execute("alter table table1 add primary key(id)"); /*s.executeUpdate("insert into table1 values('016925', 'Ming XIAO', 50)"); s.addBatch("insert into table1 values('016945', 'Wang XIAO', 74)"); s.addBatch("insert into table1 values('016955', 'Zhang XIAO', 92)"); s.executeBatch();*/ //s.execute("drop table table1"); //s.execute("rename table table1 to tableRenamed"); // s.execute("rename column tableRenamed.id to identifiant"); //rs.close(); s.close();// It is generally good practice to release resources as soon as you are finished with them to avoid tying up database resources. con.commit(); con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
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).
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 :
java org.apache.derby.drda.NetworkServerControl start [-h hostIP -p portNumber]Or use the API :
NetworkServerControl serverControl = new NetworkServerControl(InetAddress.getByName("myhost"),1621);
serverControl.shutdown();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.
In Derby, schema is also equivalent to a user name.
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); * </pre> * <pre> * 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. * @param databaseName */ public static void shutdownDatabase(String databaseName){ if(port==null){ try { DriverManager.getConnection("jdbc:derby:"+databaseName+";shutdown=true"); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("Database: "+databaseName+" shut down normally"); } }else if(ip==null){ try { DriverManager.getConnection("jdbc:derby://localhost:"+port+"/"+databaseName+";shutdown=true"); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("Database: "+databaseName+" shut down normally"); } }else{ try { DriverManager.getConnection("jdbc:derby://"+ip+":"+port+"/"+databaseName+";shutdown=true"); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("Database: "+databaseName+" shut down normally"); } } } /** * shut down all opened databases and close the Derby driver. * 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. */ public static void shutdownAll(){ try { DriverManager.getConnection("jdbc:derby:;shutdown=true"); } catch (SQLException e) { // TODO Auto-generated catch block 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; } }