JDBC技術(一):
https://blog.csdn.net/Veer_c/article/details/103845176
JDBC技術(二):
https://blog.csdn.net/Veer_c/article/details/103879890
JDBC技術(三):
https://blog.csdn.net/Veer_c/article/details/103880021
JDBC技術(四):
https://blog.csdn.net/Veer_c/article/details/103882264
JDBC工具類:
在上次我們使用的工具類中,我們只能使用mysql的數據庫獲取連接,如果要做修改則會很麻煩,這就是我們將代碼寫的“太死了“,我們可以通過properties集合的方式,將代碼寫入文件中,最後將文件中內容讀取出來,這樣在以後的修改中,只需要修改文件內容就好了。
package com.jdbc.util;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtil {
private static String url = null;
private static String user = null;
private static String password = null;
private static String className = null;
static{
//隨着類的加載而夾在
try {
//使用properties這個類,將配置文件中的鍵值對加載到集合中
Properties prop = new Properties();
prop.load(new FileInputStream("db.properties"));
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
className = prop.getProperty("className");
Class.forName(className);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//獲取連接
public static Connection getConn(){
//註冊驅動
try {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException();
}
}
//釋放資源
public static void close(Connection conn,Statement stmt,ResultSet rs){
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
最後在我們的文件中,添加進去相關的數據庫連接
url=jdbc:mysql://localhost:3306/day20
user=root
password=root
className=com.mysql.jdbc.Driver
使用JDBC進行批處理
在我們之前,我們一次操作只能發送一句sql語句,如果我們要插入2000條數據的話,用IO流的話,效率也不是很高,我們可以利用sql緩衝區,一次發送多條語句到數據庫服務端來執行,這個就稱之爲批處理。
Statement : addBatch(String sql) 添加到sql緩衝區,暫時不發送,
int exxcuteBatch() 發送批次處理命令,發送所有的緩衝區內容,
void clearBatch() 清空所有的緩衝區內容
PreparedStatement() : void addBatch() 添加到sql緩衝區
int[] executeBatch() 執行緩衝區的所有sql語句
void clearBatch() 清空緩衝區
package com.jdbc.a_statement_preparedstatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import com.jdbc.util.JDBCUtil;
public class Test {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
//testStatement();//不使用批處理的情況下,給學生表中插入2000條數據,6230
//testStatementBatch();//使用批處理的情況下,給學生表中插入2000條數據,6170
//testPreparedStatement();//6240
testPreparedStatementBatch();//6210
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
}
private static void testPreparedStatementBatch() {
Connection conn = null;
PreparedStatement stmt = null;
try{
conn = JDBCUtil.getConn();
//創建一個動態的sql語句
String sql = "insert into stu values(?,?);";
stmt = conn.prepareStatement(sql);
//型數據庫插入2000條數據,一次插入一條
for (int i = 1; i <=2000; i++) {
stmt.setInt(1, i);
stmt.setString(2, "劉德華");
stmt.addBatch();
//判斷每20條發送一次
if (i%20==0) {
stmt.executeBatch();
//清空緩存區
stmt.clearBatch();
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
//釋放資源
JDBCUtil.close(conn, stmt, null);
}
}
private static void testPreparedStatement() {
Connection conn = null;
PreparedStatement stmt = null;
try{
conn = JDBCUtil.getConn();
//創建一個動態的sql語句
String sql = "insert into stu values(?,?);";
stmt = conn.prepareStatement(sql);
//型數據庫插入2000條數據,一次插入一條
for (int i = 1; i <=2000; i++) {
stmt.setInt(1, i);
stmt.setString(2, "劉德華");
//發送參數
stmt.executeUpdate();
}
}catch(Exception e){
e.printStackTrace();
}finally{
//釋放資源
JDBCUtil.close(conn, stmt, null);
}
}
private static void testStatementBatch() {
Connection conn =null;
Statement stmt = null;
try{
//獲取連接
conn = JDBCUtil.getConn();
//獲取statement對象
stmt = conn.createStatement();
//每次給stmt這個命令行中添加20條sql語句,一次性進行發送
for (int i = 1; i <=2000; i++) {
String sql = "insert into stu values("+i+",'劉德華');";
//將這個sql先暫時添加在stmt的命令行中
stmt.addBatch(sql);
if (i%20==0) {
//批量發送sql
stmt.executeBatch();
//清空stmt的命令行列表
stmt.clearBatch();
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
//釋放資源
JDBCUtil.close(conn, stmt, null);
}
}
private static void testStatement() {
Connection conn =null;
Statement stmt = null;
try{
//獲取連接
conn = JDBCUtil.getConn();
//獲取statement對象
stmt = conn.createStatement();
//給數據庫發送2000次sql語句,插入數據
for (int i = 1; i <=2000; i++) {
String sql = "insert into stu values("+i+",'劉德華');";
//給數據庫發送sql
stmt.executeUpdate(sql);
}
}catch(Exception e){
e.printStackTrace();
}finally{
//釋放資源
JDBCUtil.close(conn, stmt, null);
}
}
}
JDBC獲取自增長值
比如有倆張表,一張員工表,一張是部門表,在部門表中出入一個新的部門後,要在員工表中也插入一個新的員工,要求同時實現,這就要用到自增長值。
package com.jdbc.c_autoincrement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import com.jdbc.util.JDBCUtil;
public class IncrementDemo {
public static void main(String[] args) {
//需求:在給部門表插入一條數據的同時,再給員工表中剛剛插入的該部門插入一條員工數據
/**
* 1.給部門表中插入一個新的部門“財務部”
* 2.獲取財務部對應的id
* 3.給員工表中插入一條員工數據,對應的部門就是財務部對應的id */
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try{
conn =JDBCUtil.getConn();
String sql1 = "insert into dept(deptName) values(?)";
String sql2 = "insert into employee(name,deptId) values(?,?);";
//先給部門表中插入一條數據
//PreparedStatement prepareStatement(String sql,int autoGeneratedKeys)
stmt = conn.prepareStatement(sql1, Statement.RETURN_GENERATED_KEYS);
stmt.setString(1, "財務部");
stmt.executeUpdate();
//獲取自增長的鍵值
//ResultSet getGeneratedKeys()
rs = stmt.getGeneratedKeys();//rs就是一個自增站的鍵的一個結果集
int deptId = 0;
while (rs.next()) {
deptId = rs.getInt(1);
}
//給員工表中插入一條數據
stmt = conn.prepareStatement(sql2);
stmt.setString(1, "岳雲鵬");
stmt.setInt(2, deptId);
//發送參數並執行sql
stmt.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
//釋放資源
}
}
}
JDBC技術(一):
https://blog.csdn.net/Veer_c/article/details/103845176
JDBC技術(二):
https://blog.csdn.net/Veer_c/article/details/103879890
JDBC技術(三):
https://blog.csdn.net/Veer_c/article/details/103880021
JDBC技術(四):
https://blog.csdn.net/Veer_c/article/details/103882264