package JDBC;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
/*
* 改進DBUtil,使得connection不需要傳參
* */
public class DBUtil2 {
//數據庫驅動
private static String driver;
//連接數據庫的路徑
private static String url;
//連接數據庫的用戶名
private static String user;
//連接數據庫的密碼
private static String pwd;
//用於管理不同線程所獲取的連接
private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
//靜態塊:類被虛擬機加載時執行一次
static {
try {
//讀取配置文件
Properties properties = new Properties();
//更加推薦的相對路徑寫法
InputStream inputStream = JDBCDemon4.class.getClassLoader()
.getResourceAsStream("JDBC/config.properties");
properties.load(inputStream);
driver = properties.getProperty("driver").trim();
url = properties.getProperty("url").trim();
pwd = properties.getProperty("pwd").trim();
user = properties.getProperty("user").trim();
// System.out.println("Driver:" + driver);
// System.out.println("user:" + user);
// System.out.println("url:" + url);
// System.out.println("pwd:" + pwd);
inputStream.close();
//獲取驅動
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 獲取一個連接
*/
public static Connection getConnection() throws Exception{
try {
/*
* 通過DriverManager創建一個數據庫連接並返回
* */
Connection connection = DriverManager.getConnection(url,user,pwd);
/*
* ThreadLocal的set方法會將當前線程作爲key
* 並將給定的值作爲value存入內部的map中保存
* */
threadLocal.set(connection);
return connection;
} catch (Exception e) {
e.printStackTrace();
//通知調用者,創建連接出錯
throw e;
}
}
/**
* 關閉給定的連接
*/
public static void closeConnection(){
try{
//在ThreadLocal中獲取connection即(value值)
Connection connection = threadLocal.get();
if(connection != null){
connection.close();
//刪除value值,防止污染
threadLocal.remove();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
package JDBC;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
/**
* Statment主要用於執行靜態的sql語句,,內容不變的sql,每執行一次都要對sql語句進行編譯
*
* sql語句中只是其中參數有所不同,則適用於preparedStament,sql語句提前編譯
* 繼承與Statment,其中execute,executeQuery,executeUpdate被更改,不需要參數
* */
//使用預編譯sql提高執行效率
public class JDBCPreSta1 {
public static void main(String[] args) {
try{
//建立連接
Connection connection = DBUtil2.getConnection();
/*
* 使用preparedAtatment,預編譯sql
* */
// String sql = "insert into user_demon values (?,?,'123456',?,?)";
// //System.out.println(sql);
// PreparedStatement preparedStatement = connection.prepareStatement(sql);
// //記錄開始時間
// long start = System.currentTimeMillis();
// for(int i = 2000;i < 2100;i++){
// preparedStatement.setInt(1,i);
// preparedStatement.setString(2,"test"+i);
// preparedStatement.setInt(3,5000);
// preparedStatement.setString(4,"test"+i+"qq.com");
// preparedStatement.executeUpdate();
// }
// //結束時間
// long end = System.currentTimeMillis();
// //輸出插入完畢總耗時
// System.out.println("執行完畢,耗時:"+(end - start) +"秒");
/*
* 使用Statment未經過預編譯的sql
* */
//獲取Statment
Statement statement = connection.createStatement();
long start = System.currentTimeMillis();
for(int i = 3000;i <3100;i++){
//String sql = "insert into user_demon values(1,'test"+i+"','12345',5000,'test"+i+"@qq.com')";
String sql ="insert into user_demon " +
"values " +
"("+i+","+
"'test"+i+"',"+
"'12345',"+
"5000,"+
"'test"+i+"@qq.com'" +
")";
statement.executeUpdate(sql);
}
long end = System.currentTimeMillis();
System.out.println("執行完畢,耗時:"+(end - start) +"秒");
}catch (Exception e){
e.printStackTrace();
}finally {
DBUtil2.closeConnection();
}
}
}