複習一下: 1.先創建一個properties配置文件 2.載入讀取配置文件 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.s ...
複習一下:
1.先創建一個properties配置文件
ClasssName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@伺服器IP:埠號:名稱
user=設置的用戶名
password=設置的密碼
maxActive=最大連接數量
maxWait=最大等待時間
2.載入讀取配置文件
package day02;
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
/** * 該類用於管理資料庫連接 * @author adminitartor * */ public class DBUtil { //資料庫連接池 private static BasicDataSource ds;
static{
Properties prop = new Properties();
try {
prop.load(new FileInputStream("config.properties"));
String className = prop.getProperty("classname");
String url = prop.getProperty("url");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
int maxActive = Integer.parseInt(prop.getProperty("maxactive"));
int maxWait = Integer.parseInt(prop.getProperty("maxwait"));
//初始化連接池
ds = new BasicDataSource();
//將JDBC建立連接所需要的信息設置到連接池中
//Class.forName(...)
ds.setDriverClassName(className);
//DriverManager.getConnection(...)
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
//設置連接池最大連接數
ds.setMaxActive(maxActive);
//設置最大等待時間
ds.setMaxWait(maxWait);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 獲取資料庫連接
* @return
*/
public static Connection getConnection()
throws Exception{
return ds.getConnection();
}
/**
* 關閉給定的連接
* @param conn
*/
public static void closeConnection(Connection conn){
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.處理動態的SQL
java.sql.PreparedStatement 該介面是Statement的子介面。設計目的是為了執行動態SQL語句。這樣的SQL稱為預編譯SQL,這種SQL語句會將動態信息以"?"代替,先進行占位。然後將該SQL發送給資料庫生成執行計劃。然後當需要執行該SQL時,只需要將?需要的實際數據再次傳遞給資料庫即可。
* 1:由於先將SQL語句發送給資料庫,並生成了執行計劃(語義已經確定),就不存在拼接SQL導致改變SQL語義(SQL註入攻擊)的問題了。
* 2:由於執行計劃已經生成,當大批量執行SQL時每次只需要將?表示的實際值傳入,那麼資料庫會重用執行計劃,這就減少了伺服器的壓力。
Connection conn = null;
try {
conn = DBUtil.getConnection();
//使用PreparedStatement
String sql = "INSERT INTO userinfo "
+ "(id,username,password,email,nickname,account) "
+ "VALUES "
+ "(seq_userinfo_id.NEXTVAL,?,?,?,?,?)";
PreparedStatement ps
= conn.prepareStatement(sql);
ps.setString(1, "liucan");
ps.setString(2, "123456");
ps.setString(3, "[email protected]");
ps.setString(4, "hello");
ps.setDouble(5, 5000.0);
int d = ps.executeUpdate();
if(d>0){
System.out.println("插入成功!");
}
} catch (Exception e) {
e.printStackTrace();
} finally{
if(conn != null){
DBUtil.closeConnection(conn);
}
}
}`