package com.oracle.tutorial.jdbc;

import java.sql.BatchUpdateException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement; import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set; public class CoffeesTable { private String dbName;
private Connection con;
private String dbms; public CoffeesTable(Connection connArg, String dbNameArg, String dbmsArg) {
super();
this.con = connArg;
this.dbName = dbNameArg;
this.dbms = dbmsArg; } public void createTable() throws SQLException {
String createString =
"create table COFFEES " + "(COF_NAME varchar(32) NOT NULL, " +
"SUP_ID int NOT NULL, " + "PRICE numeric(10,2) NOT NULL, " +
"SALES integer NOT NULL, " + "TOTAL integer NOT NULL, " +
"PRIMARY KEY (COF_NAME), " +
"FOREIGN KEY (SUP_ID) REFERENCES SUPPLIERS (SUP_ID))";
Statement stmt = null;
try {
stmt = con.createStatement();
stmt.executeUpdate(createString);
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
} finally {
if (stmt != null) { stmt.close(); }
}
} public void populateTable() throws SQLException {
Statement stmt = null;
try {
stmt = con.createStatement();
stmt.executeUpdate("insert into COFFEES " +
"values('Colombian', 00101, 7.99, 0, 0)");
stmt.executeUpdate("insert into COFFEES " +
"values('French_Roast', 00049, 8.99, 0, 0)");
stmt.executeUpdate("insert into COFFEES " +
"values('Espresso', 00150, 9.99, 0, 0)");
stmt.executeUpdate("insert into COFFEES " +
"values('Colombian_Decaf', 00101, 8.99, 0, 0)");
stmt.executeUpdate("insert into COFFEES " +
"values('French_Roast_Decaf', 00049, 9.99, 0, 0)");
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
} finally {
if (stmt != null) { stmt.close(); }
}
} public void updateCoffeeSales(HashMap<String, Integer> salesForWeek) throws SQLException { PreparedStatement updateSales = null;
PreparedStatement updateTotal = null; String updateString =
"update COFFEES " + "set SALES = ? where COF_NAME = ?"; String updateStatement =
"update COFFEES " + "set TOTAL = TOTAL + ? where COF_NAME = ?";//?是预留的参数位置,字串类型也不用单引号 try {
con.setAutoCommit(false);//一个简单事务的演示
updateSales = con.prepareStatement(updateString);//预编译语句相当于java端的存储过程
updateTotal = con.prepareStatement(updateStatement); for (Map.Entry<String, Integer> e : salesForWeek.entrySet()) {
updateSales.setInt(1, e.getValue().intValue());
updateSales.setString(2, e.getKey());//可设置参数,clearParameters可以清空所有参数
updateSales.executeUpdate(); updateTotal.setInt(1, e.getValue().intValue());
updateTotal.setString(2, e.getKey());
updateTotal.executeUpdate();//预编译语句提交后返回值为0有两种可能:更新了0行,或者是DDL
con.commit();//提交此事务
}
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
if (con != null) {
try {
System.err.print("Transaction is being rolled back");
con.rollback();
} catch (SQLException excep) {
JDBCTutorialUtilities.printSQLException(excep);
}
}
} finally {
if (updateSales != null) { updateSales.close(); }
if (updateTotal != null) { updateTotal.close(); }
con.setAutoCommit(true);
}
} public void modifyPrices(float percentage) throws SQLException {
Statement stmt = null;
try {
stmt =
con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
//TYPE_SCROLL_SENSITIVE可以双向移动,而且底层修改会反映到结果集
//CONCUR_UPDATABLE是说结果集可更新
ResultSet uprs = stmt.executeQuery("SELECT * FROM COFFEES"); while (uprs.next()) {
float f = uprs.getFloat("PRICE");
uprs.updateFloat("PRICE", f * percentage);//可以更改某列
uprs.updateRow();//然后直接更新此行到数据库
} } catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
} finally {
if (stmt != null) { stmt.close(); }
}
} public void modifyPricesByPercentage(String coffeeName, float priceModifier,
float maximumPrice) throws SQLException {
con.setAutoCommit(false); Statement getPrice = null;
Statement updatePrice = null;
ResultSet rs = null;
String query =
"SELECT COF_NAME, PRICE FROM COFFEES " + "WHERE COF_NAME = '" +
coffeeName + "'"; try {
Savepoint save1 = con.setSavepoint();//设置一个回滚点
getPrice =
con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);//TYPE_SCROLL_INSENSITIVE可以双向移动,但数据库底层的修改不会反应上来
updatePrice = con.createStatement(); if (!getPrice.execute(query)) {
System.out.println("Could not find entry for coffee named " +
coffeeName);
} else {
rs = getPrice.getResultSet();
rs.first();//移动到第一行
float oldPrice = rs.getFloat("PRICE");
float newPrice = oldPrice + (oldPrice * priceModifier);
System.out.println("Old price of " + coffeeName + " is " + oldPrice);
System.out.println("New price of " + coffeeName + " is " + newPrice);
System.out.println("Performing update...");
updatePrice.executeUpdate("UPDATE COFFEES SET PRICE = " + newPrice +
" WHERE COF_NAME = '" + coffeeName + "'");
System.out.println("\nCOFFEES table after update:");
CoffeesTable.viewTable(con);
if (newPrice > maximumPrice) {
System.out.println("\nThe new price, " + newPrice +
", is greater than the maximum " + "price, " +
maximumPrice +
". Rolling back the transaction...");
con.rollback(save1);//回滚到某个点,自动让后面的回滚点失效
System.out.println("\nCOFFEES table after rollback:");
CoffeesTable.viewTable(con);
}
con.commit();//提交或完全回滚时,所有回滚点自动失效,也可以提前手动Connection.releaseSavepoint(save1)
}
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
} finally {
if (getPrice != null) { getPrice.close(); }
if (updatePrice != null) { updatePrice.close(); }
con.setAutoCommit(true);
}
} public void insertRow(String coffeeName, int supplierID, float price,
int sales, int total) throws SQLException {
Statement stmt = null;
try {
stmt =
con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
//TYPE_SCROLL_SENSITIVE是默认值,光标只能向前移动,
//CONCUR_READ_ONLY也是默认值,结果集不能更新数据到底层
ResultSet uprs = stmt.executeQuery("SELECT * FROM COFFEES"); uprs.moveToInsertRow();//可以再结果集中插入新行,可更新的结果集会多一个空间,来存放新插入的行 uprs.updateString("COF_NAME", coffeeName);
uprs.updateInt("SUP_ID", supplierID);
uprs.updateFloat("PRICE", price);
uprs.updateInt("SALES", sales);
uprs.updateInt("TOTAL", total);//先设置每一列 uprs.insertRow();//再插入此行到数据库,但之后必须移动光标,不要再指向这个插入行
uprs.beforeFirst();//移动到初始位置,第一行之前,但CONCUR_READ_ONLY下只能调用next(),别的移动都不行 } catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
} finally {
if (stmt != null) { stmt.close(); }
}
} public void batchUpdate() throws SQLException { Statement stmt = null;
try { this.con.setAutoCommit(false);//一个批更新语句的演示,推荐放在一个事务里,关闭自动提交也有利于异常的捕获
stmt = this.con.createStatement(); stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Amaretto', 49, 9.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Hazelnut', 49, 9.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Amaretto_decaf', 49, 10.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Hazelnut_decaf', 49, 10.99, 0, 0)"); int[] updateCounts = stmt.executeBatch();//提交后会自动清空所有语句,也可以手动clearBatch()
this.con.commit(); } catch (BatchUpdateException b) {//要先捕获这个批异常
JDBCTutorialUtilities.printBatchUpdateException(b);
} catch (SQLException ex) {
JDBCTutorialUtilities.printSQLException(ex);
} finally {
if (stmt != null) { stmt.close(); }
this.con.setAutoCommit(true);//不要忘了恢复
}
} public static void viewTable(Connection con) throws SQLException {//一个最简单的示例
Statement stmt = null;
String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";
try {
stmt = con.createStatement();//简单语句
ResultSet rs = stmt.executeQuery(query); while (rs.next()) {//遍历结果集,结果集指针初始位置是第一行之前,要调用.next()才能使用
String coffeeName = rs.getString("COF_NAME");
int supplierID = rs.getInt("SUP_ID");
float price = rs.getFloat("PRICE");
int sales = rs.getInt("SALES");
int total = rs.getInt("TOTAL");
System.out.println(coffeeName + ", " + supplierID + ", " + price +
", " + sales + ", " + total);
} } catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
} finally {
if (stmt != null) { stmt.close(); }//关闭语句对象
}
} public static void alternateViewTable(Connection con) throws SQLException {
Statement stmt = null;
String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";
try(Statement stmt = con.createStatement()) {//JDK7新功能,在try后的括号里声明的资源会保证关闭,不用写finally
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String coffeeName = rs.getString(1);
int supplierID = rs.getInt(2);
float price = rs.getFloat(3);
int sales = rs.getInt(4);
int total = rs.getInt(5);
System.out.println(coffeeName + ", " + supplierID + ", " + price +
", " + sales + ", " + total);
}
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
}//无需finally
} public Set<String> getKeys() throws SQLException {
HashSet<String> keys = new HashSet<String>();
Statement stmt = null;
String query = "select COF_NAME from COFFEES";
try {
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
keys.add(rs.getString(1));
}
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
} finally {
if (stmt != null) { stmt.close(); }
}
return keys; } public void dropTable() throws SQLException {
Statement stmt = null;
try {
stmt = con.createStatement();
if (this.dbms.equals("mysql")) {
stmt.executeUpdate("DROP TABLE IF EXISTS COFFEES");
} else if (this.dbms.equals("derby")) {
stmt.executeUpdate("DROP TABLE COFFEES");
}
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
} finally {
if (stmt != null) { stmt.close(); }
}
} public static void main(String[] args) {
JDBCTutorialUtilities myJDBCTutorialUtilities;
Connection myConnection = null; if (args[0] == null) {
System.err.println("Properties file not specified at command line");
return;
} else {
try {
myJDBCTutorialUtilities = new JDBCTutorialUtilities(args[0]);
} catch (Exception e) {
System.err.println("Problem reading properties file " + args[0]);
e.printStackTrace();
return;
}
} try {
myConnection = myJDBCTutorialUtilities.getConnection(); // Java DB does not have an SQL create database command; it does require createDatabase
// JDBCTutorialUtilities.createDatabase(myConnection,
// myJDBCTutorialUtilities.dbName,
// myJDBCTutorialUtilities.dbms);
//
// JDBCTutorialUtilities.initializeTables(myConnection,
// myJDBCTutorialUtilities.dbName,
// myJDBCTutorialUtilities.dbms); CoffeesTable myCoffeeTable =
new CoffeesTable(myConnection, myJDBCTutorialUtilities.dbName,
myJDBCTutorialUtilities.dbms); System.out.println("\nContents of COFFEES table:");
CoffeesTable.viewTable(myConnection); System.out.println("\nRaising coffee prices by 25%");
myCoffeeTable.modifyPrices(1.25f); System.out.println("\nInserting a new row:");
myCoffeeTable.insertRow("Kona", 150, 10.99f, 0, 0);
CoffeesTable.viewTable(myConnection); System.out.println("\nUpdating sales of coffee per week:");
HashMap<String, Integer> salesCoffeeWeek =
new HashMap<String, Integer>();
salesCoffeeWeek.put("Colombian", 175);
salesCoffeeWeek.put("French_Roast", 150);
salesCoffeeWeek.put("Espresso", 60);
salesCoffeeWeek.put("Colombian_Decaf", 155);
salesCoffeeWeek.put("French_Roast_Decaf", 90);
myCoffeeTable.updateCoffeeSales(salesCoffeeWeek);
CoffeesTable.viewTable(myConnection); System.out.println("\nModifying prices by percentage"); myCoffeeTable.modifyPricesByPercentage("Colombian", 0.10f, 9.00f); System.out.println("\nCOFFEES table after modifying prices by percentage:"); myCoffeeTable.viewTable(myConnection); System.out.println("\nPerforming batch updates; adding new coffees");
myCoffeeTable.batchUpdate();
myCoffeeTable.viewTable(myConnection); // System.out.println("\nDropping Coffee and Suplliers table:");
//
// myCoffeeTable.dropTable();
// mySuppliersTable.dropTable(); } catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
} finally {
JDBCTutorialUtilities.closeConnection(myConnection);
}
}
}

工具类:

package com.oracle.tutorial.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.*;
import java.io.*;
import java.sql.BatchUpdateException;
import java.sql.DatabaseMetaData;
import java.sql.RowIdLifetime;
import java.sql.SQLWarning;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document; public class JDBCTutorialUtilities { public String dbms;
public String jarFile;
public String dbName;
public String userName;
public String password;
public String urlString; private String driver;
private String serverName;
private int portNumber;
private Properties prop; public static void initializeTables(Connection con, String dbNameArg, String dbmsArg) throws SQLException {
SuppliersTable mySuppliersTable =
new SuppliersTable(con, dbNameArg, dbmsArg);
CoffeesTable myCoffeeTable =
new CoffeesTable(con, dbNameArg, dbmsArg);
RSSFeedsTable myRSSFeedsTable =
new RSSFeedsTable(con, dbNameArg, dbmsArg);
ProductInformationTable myPIT =
new ProductInformationTable(con, dbNameArg, dbmsArg); System.out.println("\nDropping exisiting PRODUCT_INFORMATION, COFFEES and SUPPLIERS tables");
myPIT.dropTable();
myRSSFeedsTable.dropTable();
myCoffeeTable.dropTable();
mySuppliersTable.dropTable(); System.out.println("\nCreating and populating SUPPLIERS table..."); System.out.println("\nCreating SUPPLIERS table");
mySuppliersTable.createTable();
System.out.println("\nPopulating SUPPLIERS table");
mySuppliersTable.populateTable(); System.out.println("\nCreating and populating COFFEES table..."); System.out.println("\nCreating COFFEES table");
myCoffeeTable.createTable();
System.out.println("\nPopulating COFFEES table");
myCoffeeTable.populateTable(); System.out.println("\nCreating RSS_FEEDS table...");
myRSSFeedsTable.createTable();
} public static void rowIdLifetime(Connection conn) throws SQLException {
DatabaseMetaData dbMetaData = conn.getMetaData();
RowIdLifetime lifetime = dbMetaData.getRowIdLifetime();
switch (lifetime) {
case ROWID_UNSUPPORTED:
System.out.println("ROWID type not supported");
break;
case ROWID_VALID_FOREVER:
System.out.println("ROWID has unlimited lifetime");
break;
case ROWID_VALID_OTHER:
System.out.println("ROWID has indeterminate lifetime");
break;
case ROWID_VALID_SESSION:
System.out.println("ROWID type has lifetime that is valid for at least the containing session");
break;
case ROWID_VALID_TRANSACTION:
System.out.println("ROWID type has lifetime that is valid for at least the containing transaction");
}
} public static void cursorHoldabilitySupport(Connection conn) throws SQLException {
DatabaseMetaData dbMetaData = conn.getMetaData();
System.out.println("ResultSet.HOLD_CURSORS_OVER_COMMIT = " +
ResultSet.HOLD_CURSORS_OVER_COMMIT);//事务提交时,结果集对象是否关闭
System.out.println("ResultSet.CLOSE_CURSORS_AT_COMMIT = " +
ResultSet.CLOSE_CURSORS_AT_COMMIT);
System.out.println("Default cursor holdability: " +
dbMetaData.getResultSetHoldability());//默认的要看数据库实现
System.out.println("Supports HOLD_CURSORS_OVER_COMMIT? " +
dbMetaData.supportsResultSetHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT));
System.out.println("Supports CLOSE_CURSORS_AT_COMMIT? " +
dbMetaData.supportsResultSetHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT));
} public JDBCTutorialUtilities(String propertiesFileName) throws FileNotFoundException,
IOException,
InvalidPropertiesFormatException {
super();
this.setProperties(propertiesFileName);
} public static void getWarningsFromResultSet(ResultSet rs) throws SQLException {
JDBCTutorialUtilities.printWarnings(rs.getWarnings());//要想处理Warning要先rs.getWarnings()
} public static void getWarningsFromStatement(Statement stmt) throws SQLException {
JDBCTutorialUtilities.printWarnings(stmt.getWarnings());//或者stmt.getWarnings()
} public static void printWarnings(SQLWarning warning) throws SQLException {//SQLWarning的处理
if (warning != null) {
System.out.println("\n---Warning---\n");
while (warning != null) {
System.out.println("Message: " + warning.getMessage());
System.out.println("SQLState: " + warning.getSQLState());
System.out.print("Vendor error code: ");
System.out.println(warning.getErrorCode());
System.out.println("");
warning = warning.getNextWarning();//如果有多个警告
}
}
} public static boolean ignoreSQLException(String sqlState) {//排除两个情况
if (sqlState == null) {
System.out.println("The SQL state is not defined!");
return false;
}
// X0Y32: Jar file already exists in schema
if (sqlState.equalsIgnoreCase("X0Y32"))
return true;
// 42Y55: Table already exists in schema
if (sqlState.equalsIgnoreCase("42Y55"))
return true;
return false;
} public static void printBatchUpdateException(BatchUpdateException b) {
System.err.println("----BatchUpdateException----");
System.err.println("SQLState: " + b.getSQLState());
System.err.println("Message: " + b.getMessage());
System.err.println("Vendor: " + b.getErrorCode());
System.err.print("Update counts: ");
int[] updateCounts = b.getUpdateCounts();//批语句的异常会有个数量统计
for (int i = 0; i < updateCounts.length; i++) {
System.err.print(updateCounts[i] + " ");
}
} public static void printSQLException(SQLException ex) {//SQLException的处理
for (Throwable e : ex) {
if (e instanceof SQLException) {
if (ignoreSQLException(((SQLException)e).getSQLState()) == false) {
e.printStackTrace(System.err);
System.err.println("SQLState: " + ((SQLException)e).getSQLState());//状态代码
System.err.println("Error Code: " + ((SQLException)e).getErrorCode());//错误代码
System.err.println("Message: " + e.getMessage());
Throwable t = ex.getCause();
while (t != null) {
System.out.println("Cause: " + t);
t = t.getCause();
}
}
}
}
} public static void alternatePrintSQLException(SQLException ex) {
while (ex != null) {
System.err.println("SQLState: " + ex.getSQLState());
System.err.println("Error Code: " + ex.getErrorCode());
System.err.println("Message: " + ex.getMessage());
Throwable t = ex.getCause();
while (t != null) {
System.out.println("Cause: " + t);
t = t.getCause();
}
ex = ex.getNextException();//如果有多个错误
}
} private void setProperties(String fileName) throws FileNotFoundException,
IOException,
InvalidPropertiesFormatException {
this.prop = new Properties();
FileInputStream fis = new FileInputStream(fileName);
prop.loadFromXML(fis); this.dbms = this.prop.getProperty("dbms");
this.jarFile = this.prop.getProperty("jar_file");
this.driver = this.prop.getProperty("driver");
this.dbName = this.prop.getProperty("database_name");
this.userName = this.prop.getProperty("user_name");
this.password = this.prop.getProperty("password");
this.serverName = this.prop.getProperty("server_name");
this.portNumber = Integer.parseInt(this.prop.getProperty("port_number")); System.out.println("Set the following properties:");
System.out.println("dbms: " + dbms);
System.out.println("driver: " + driver);
System.out.println("dbName: " + dbName);
System.out.println("userName: " + userName);
System.out.println("serverName: " + serverName);
System.out.println("portNumber: " + portNumber); } public Connection getConnectionToDatabase() throws SQLException {
{
Connection conn = null;
Properties connectionProps = new Properties();
connectionProps.put("user", this.userName);
connectionProps.put("password", this.password); // Using a driver manager: if (this.dbms.equals("mysql")) {
// DriverManager.registerDriver(new com.mysql.jdbc.Driver());
conn =
DriverManager.getConnection("jdbc:" + dbms + "://" + serverName +
":" + portNumber + "/" + dbName,
connectionProps);
conn.setCatalog(this.dbName);
} else if (this.dbms.equals("derby")) {
// DriverManager.registerDriver(new org.apache.derby.jdbc.EmbeddedDriver());
conn =
DriverManager.getConnection("jdbc:" + dbms + ":" + dbName, connectionProps);
}
System.out.println("Connected to database");
return conn;
}
} public Connection getConnection() throws SQLException {//获取数据库连接
Connection conn = null;
Properties connectionProps = new Properties();
connectionProps.put("user", this.userName);
connectionProps.put("password", this.password); String currentUrlString = null;//JDBC4.0以前,要手动<code>Class.forName</code>(...),现在不用了,驱动包里有配置好的路径,会自动加载的 if (this.dbms.equals("mysql")) {
currentUrlString = "jdbc:" + this.dbms + "://" + this.serverName +
":" + this.portNumber + "/";
conn =
DriverManager.getConnection(currentUrlString,
connectionProps);//得到连接 this.urlString = currentUrlString + this.dbName;
conn.setCatalog(this.dbName);//设置目前数据库
} else if (this.dbms.equals("derby")) {
this.urlString = "jdbc:" + this.dbms + ":" + this.dbName; conn =
DriverManager.getConnection(this.urlString +
";create=true", connectionProps); }
System.out.println("Connected to database");
return conn;
} public Connection getConnection(String userName,
String password) throws SQLException {
Connection conn = null;
Properties connectionProps = new Properties();
connectionProps.put("user", userName);
connectionProps.put("password", password);
if (this.dbms.equals("mysql")) {
conn =
DriverManager.getConnection("jdbc:" + this.dbms + "://" + this.serverName +
":" + this.portNumber + "/",
connectionProps);
conn.setCatalog(this.dbName);
} else if (this.dbms.equals("derby")) {
conn =
DriverManager.getConnection("jdbc:" + this.dbms + ":" + this.dbName +
";create=true", connectionProps);
}
return conn;
} public static void createDatabase(Connection connArg, String dbNameArg,
String dbmsArg) { if (dbmsArg.equals("mysql")) {
try {
Statement s = connArg.createStatement();
String newDatabaseString =
"CREATE DATABASE IF NOT EXISTS " + dbNameArg;
// String newDatabaseString = "CREATE DATABASE " + dbName;
s.executeUpdate(newDatabaseString); System.out.println("Created database " + dbNameArg);
} catch (SQLException e) {
printSQLException(e);
}
}
} public static void closeConnection(Connection connArg) {
System.out.println("Releasing all open resources ...");
try {
if (connArg != null) {
connArg.close();
connArg = null;
}
} catch (SQLException sqle) {
printSQLException(sqle);
}
} public static String convertDocumentToString(Document doc) throws TransformerConfigurationException,
TransformerException {
Transformer t = TransformerFactory.newInstance().newTransformer();
// t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
StringWriter sw = new StringWriter();
t.transform(new DOMSource(doc), new StreamResult(sw));
return sw.toString(); } public static void main(String[] args) {
JDBCTutorialUtilities myJDBCTutorialUtilities;
Connection myConnection = null;
if (args[0] == null) {
System.err.println("Properties file not specified at command line");
return;
} else {
try {
System.out.println("Reading properties file " + args[0]);
myJDBCTutorialUtilities = new JDBCTutorialUtilities(args[0]);
} catch (Exception e) {
System.err.println("Problem reading properties file " + args[0]);
e.printStackTrace();
return;
}
} try {
myConnection = myJDBCTutorialUtilities.getConnection();
// JDBCTutorialUtilities.outputClientInfoProperties(myConnection);
// myConnection = myJDBCTutorialUtilities.getConnection("root", "root", "jdbc:mysql://localhost:3306/");
// myConnection = myJDBCTutorialUtilities.
// getConnectionWithDataSource(myJDBCTutorialUtilities.dbName,"derby","", "", "localhost", 3306); // Java DB does not have an SQL create database command; it does require createDatabase
JDBCTutorialUtilities.createDatabase(myConnection,
myJDBCTutorialUtilities.dbName,
myJDBCTutorialUtilities.dbms); JDBCTutorialUtilities.cursorHoldabilitySupport(myConnection);
JDBCTutorialUtilities.rowIdLifetime(myConnection); } catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
} catch (Exception e) {
e.printStackTrace(System.err);
} finally {
JDBCTutorialUtilities.closeConnection(myConnection);
} }
}

 

SQL出错的演示:

SQLState: 42Y55
Error Code: 30000
Message: 'DROP TABLE' cannot be performed on
'TESTDB.COFFEES' because it does not exist.

 

con.setAutoCommit(false);
PreparedStatement pstmt = con.prepareStatement(//用预编译语句也可以写批更新,只是语句是一定的,每次参数可换
"INSERT INTO COFFEES VALUES( " +
"?, ?, ?, ?, ?)");
pstmt.setString(1, "Amaretto");
pstmt.setInt(2, 49);
pstmt.setFloat(3, 9.99);
pstmt.setInt(4, 0);
pstmt.setInt(5, 0);
pstmt.addBatch(); pstmt.setString(1, "Hazelnut");
pstmt.setInt(2, 49);
pstmt.setFloat(3, 9.99);
pstmt.setInt(4, 0);
pstmt.setInt(5, 0);
pstmt.addBatch(); // ... and so on for each new
// type of coffee int [] updateCounts = pstmt.executeBatch();
con.commit();
con.setAutoCommit(true);

execute: 用于返回多个 ResultSet 的情况. 反复调用 Statement.getResultSet来得到每个结果集

 

rs.getString可以用于任何类型,得到的是java的String对象

关于DataSource,连接池,分布事务(略)

 

 

 

 

 

 

Trail: JDBC(TM) Database Access(1)的更多相关文章

  1. Trail: JDBC(TM) Database Access(2)

    package com.oracle.tutorial.jdbc; import java.sql.CallableStatement; import java.sql.Connection; imp ...

  2. Trail: JDBC(TM) Database Access(3)

    java.sql,javax.sql,javax.naming包    默认TYPE_FORWARD_ONLY:结果集只能向前滚动,只能调用next(),不能重定位游标 TYPE_SCROLL_INS ...

  3. JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language

    JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language,结构化查询语言)数据库访问接口,它使数据 ...

  4. [19/05/06-星期一] JDBC(Java DataBase Connectivity,java数据库连接)_基本知识

    一.概念 JDBC(Java Database Connectivity)为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成.是java程序与数据库系统通信的标准API. J ...

  5. JDBC (Java DataBase Connectivity)数据库连接池原理解析与实现

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  6. [19/05/07-星期二] JDBC(Java DataBase Connectivity)_CLOB(存储大量的文本数据)与BLOB(存储大量的二进制数据)

    一. CLOB(Character Large Object ) – 用于存储大量的文本数据 – 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的.而非一般的字段,一次 ...

  7. [19/05/05-星期日] JDBC(Java DataBase Connectivity,java数据库连接)_mysql基本知识

    一.概念 (1).是一种开放源代码的关系型数据库管理系统(RDBMS,Relational Database Management System):目前有很多大公司(新浪.京东.阿里)使用: (2). ...

  8. 通过Oracle数据库访问控制功能的方法(Database access control)

    修改sqlnet.ora文件中的IP列表后都需要重启监听才能生效.(原文是: Any changes to the values requires the TNS listener to be sto ...

  9. [19/05/08-星期三] JDBC(Java DataBase Connectivity)_ORM(Object Relationship Mapping, 对象关系映射)

    一.概念 基本思想: – 表结构跟类对应: 表中字段和类的属性对应:表中记录和对象对应: – 让javabean的属性名和类型尽量和数据库保持一致! – 一条记录对应一个对象.将这些查询到的对象放到容 ...

随机推荐

  1. 解决Nginx下WordPress后台404的问题

    在把这个博客做好后,上传到nginx服务器上却出现问题. 首先是wordpress官方的伪静态是通过.htaccess实现的,但nginx并不支持.htaccess,无奈只好在网上找到wordpres ...

  2. C++:用成员初始化列表对数据成员初始化

    1.在声明类时,对数据成员的初始化工作一般在构造函数中用赋值语句进行. 例如: class Complex{ private: double real; double imag; public: Co ...

  3. How to upgrade gcc using apt-get ?

    在toolchain/test下已经有打包好的gcc,版本有4.x.5.0.6.0等,用这个PPA升级gcc就可以啦! 首先添加ppa到库: 1 sudo add-apt-repository ppa ...

  4. Lists of network protocols

    https://en.wikipedia.org/wiki/Lists_of_network_protocols Protocol stack: List of network protocol st ...

  5. Linux系统下统计目录及其子目录文件个数

    (1)查看某目录下文件的个数: ls -l |grep "^-"|wc -l 或 find ./company -type f | wc -l (2)查看某目录下文件的个数,包括子 ...

  6. Android下 ionic view 无法登录

    ionic view一个超棒工具,它是测试 ionic 框架搭建项目的app软件. 在它的官网有iphone 和 android 版本的下载地址.但是,这里只有在 google play 里面才有,而 ...

  7. UVa 11542 (高斯消元 异或方程组) Square

    书上分析的太清楚,我都懒得写题解了.=_=|| #include <cstdio> #include <cstring> #include <cmath> #inc ...

  8. 添加gif效果图

    1.贴加第三方包 http://blog.csdn.net/iamlazybone/article/details/5972234 2. <FrameLayout android:id=&quo ...

  9. I.MX6 默认打开 USB adb

    /***************************************************************************** * I.MX6 默认打开 USB adb ...

  10. LeetCode Maximum Product Subarray 最大子序列积

    题意:给一个size大于0的序列,求最大的连续子序列之积.(有正数,负数,0) 思路:正确分析这三种数.0把不同的可能为答案的子序列给隔开了,所以其实可以以0为分隔线将他们拆成多个序列来进行求积,这样 ...