JDBC常用的接口
DriverManager
驅動管理器獲得數據庫鏈接
Connection
數據庫鏈接接口
Statement
語句接口,用來靜態操作SQL語句
PreparedStatement
預定義語句,用來動態操作SQL語句
CallableStrtement
可以調用存儲過程的預定義語句
ResultSet
結果集,保存數據記錄的結果集合
ResultSetMetaData
結果集元素數據如:列名、列類型
DatabaseMetaData
數據元數據:數據庫名稱、版本
---------------------
DriverManager:用於管理JDBC驅動的服務類。程序中使用該類的的主要功能是獲取Connection對象,該類包含如下方法:
public static Connection getConnection(String url, String user, String password) throws SQLException
該方法獲得url對應數據庫的連接;
Connection:代表數據庫連接對象,每個Connection代表一個物理連接會話。要想訪問數據庫,必須先得到數據庫連接。該接口的常用方法如下:
Statement createStatement() throws SQLException; 該方法返回一個Statement對象;
PreparedStatement prepareStatement(String sql)throws SQLException;該方法返回預編譯的Statement對象,即將SQL語句提交到數據庫進行預編譯;
CallableStatement prepareCall(String sql) throws SQLException;
該方法返回CallableStatement對象,該對象用於調用存儲過程。
上面上個方法都返回用於執行sql語句的Statement對象,PreparedStatement和CallableStatement是Statement的子類,只有獲得了Statement之后才可以執行sql語句;
除此之外,Connection還有如下幾個用於控制事務的方法。
Savepoint setSavepoint() throws SQLException;創建一個保存點;
Savepoint setSavepoint(String name) throws SQLException;以指定名字來創建一個保存點;
void setTransactionIsolation(int level) throws SQLException;設置事務的隔離級別;
void rollback() throws SQLException;回滾事務;
void rollback(Savepoint savepoint) throws SQLException;將事務回滾到指定的保存點;
void setAutoCommit(boolean autoCommit) throws SQLException;關閉自動提交,打開事務;
void commit() throws SQLException;提交事務;
Statement:用於執行sql語句的工具接口。該對象既可以執行DDL,DCL語句,也可以用於執行DML語句,還可以用於執行sql查詢。當執行sql查詢時,返回查詢到的結果集。它的常用方法如下:
ResultSet executeQuery(String sql) throws SQLException;該方法用於執行查詢語句,並返回查詢結果對應ResultSet對象。該方法只能用於執行查詢語句。
int executeUpdate(String sql) throws SQLException;該方法用於執行DML語句,並返回受影響的行數;該方法也可用於執行DDL語句,執行DDL語句將返回0;
boolean execute(String sql) throws SQLException;改方法可以執行任何sql語句。如果執行后第一個結果為ResultSet對象,則返回true;如果執行后第一個結果為受影響的行數或沒有任何結果,則返回false;
PreparedStatement:預編譯的Statement對象,PreparedStatement是Statement的子接口,它允許數據庫預編譯sql語句(這些sql語句通常帶有參數),以后每次只改變sql命令的參數,避免數據庫每次都需要編譯sql語句,無需再傳入sql語句,
只要為預編譯的sql語句傳入參數值即可。所以它比Statement多了如下方法:
void setXxx(int parameterIndex, Xxx value):該方法根據傳入參數值的類型不同,需要使用不同的方法。傳入的值根據索引傳給sql語句中指定位置的參數。
ResultSet:結果集對象。該對象包含訪問查詢結果的方法,ResultSet可以通過列索引或列名獲得列數據。它包含了如下常用方法來移動記錄指針。
void close() throws SQLException;釋放ResultSet對象;
boolean absolute( int row ) throws SQLException;將結果集的記錄指針移動到第row行,如果row是負數,則移動到倒數第row行,如果移動后的記錄指針指向一條有效記錄,則該方法返回true;
boolean next() throws SQLException;將結果集的記錄指針定位到下一行,如果移動后的記錄指針指向一條有效的記錄,則該方法返回true;
boolean last() throws SQLException;將結果集的記錄指針定位到最后一行,如果移動后的記錄指針指向一條有效的記錄,則該方法返回true;
Connection接口
Connection接口代表與特定的數據庫連接,在連接上下文中執行SQL語句並返回結果。
方法 功能描述
createStatement() 創建一個Statement對象
createStatement(int resultSetType, int resultSetConcurrency) 創建一個Statement對象,該對象生成具有給定類型、並發性、和可保存的ResultSet對象
PrearedStatement() 創建預處理對象PreparedStatement
isReadOnly() 查看當前Connection對象的讀寫模式是否為只讀模式
setReadOnly() 設置當前Connection對象的讀寫模式,默認是非只讀模式
commit() 使上一次提交/回滾之后進行的更改成為持久更改,並釋放此Connection對象當前所持有的的所有數據庫鎖
setAutoCommit() 設置對數據庫的更改是否為自動提交,默認是自動提交(true)
rollback() 回滾當前事務中的所有改動並釋放當前連接持有的數據庫的鎖
close() 立即釋放連接對象的數據庫和JDBC資源
DriverManager類
DriverManager類用來管理數據庫中的所有驅動程序。它是JDBC的管理層,作用於用戶和驅動程序之間,跟蹤可用的驅動程序,並在數據庫的驅動程序之間建立連接。如果通過getConnection()方法可以建立連接,則經連接返回,否則拋出SQLException異常。DriverManager類的常用方法如下:
方法 功能描述
getConnection(String sql, String user, String password) 指定三個入口參數(依次是連接數據庫的URL、用戶名和密碼)來獲取與數據庫的連接
setLLoginTimeout 獲取驅動程序試圖登錄到某一數據庫時可以等待的最長時間,以秒為單位
println(String message) 將一條消息打印到當前的JDBC日志流中
Statment接口
Statement接口用於在已經建立連接的基礎上向數據庫發送SQL語句。在JDBC中有3中Statement對象,分別是Statement、PreparedStatement和CallableStatement。Statement對象用於執行不帶參數的簡單的SQL語句;PreparedStatement繼承了Statement,用來執行動態的SQL語句;CallableStatement繼承了PreparedStatement,用來執行數據庫的存儲過程的調用。Statement接口的常用的方法如下:
方法 功能描述
execute(String sql) 執行靜態的select語句,該語句可能返回多個結果集
executeQuery(String sql) 執行給定的SQL語句,該語句返回單個ResultSet對象
clearBatch() 清空此Statement的當前SQL命令列表
executeBatch() 將一批命令提交給數據庫來執行,如果全部命令執行成功則返回更新計數組成的數組。數組元素的排序與SQL語句的添加順序對應
addBatch() 將給定的SQL命令添加到此Statement對象的當前命令列表中。如果驅動程序不支持批量處理,將拋出異常
close() 釋放Statement實例占用的數據庫和JDBC資源
PreparedStatment接口
PreparedStatment接口用來動態地執行SQL語句。通過PreparedStatment實例執行的動態SQL語句,將被預編譯並保存到PreparedStatment實例中,從而可以重復地執行該SQL語句。PreparedStatment接口的常用方法如下:
方法 功能描述
SetInt(int index, int k) 將指定位置的參數設置為int值
SetFloat(int index, float f) 將指定位置的參數設置為float值
SetLong(int index, long l) 將指定位置的參數設置為long值
SetDouble(int index, double d) 將指定位置的參數設置為double值
SetBoolean(int index, boolean b) 將指定位置的參數設置為boolean值
SetDate(int index, Date date) 將指定位置的參數設置為date值
executeQuery() 在此PreparedStatment對象中執行SQL查詢,並返回該查詢生成的ResultSet對象
setString(int index, String s) 將指定位置的參數設置為String值
SetNull(int index, int sqlType) 將指定位置的參數設置為SQL NULL
executeUpdate() 執行前面包含的參數的動態insert、update或delete語句
clearParemeters() 清除當前所有的參數值
ResultSet接口
ResultSet接口類似於一個臨時表(實際上也是一個緩存區),用來暫時存放數據庫查詢操作所獲得的結果集。ResultSet實例具有指向當前數據行的指針,指針開始的位置在第一條記錄的前面,通過next()方法可將指針向下移,進而獲取到數據。
Statement對象執行executeQuery實際上並不是一下子將所有查詢到的數據全部放入到ResultSet中(想象一下如果是幾十萬條是不是要蹦了),而是分批次放入進去ResultSet緩存,一次取完了再放入下一批次,直至取完所有查詢到的數據。然而ResultSet里的這個緩存區究竟有多大呢?我們可以通過ResultSet里的getFetchSize()方法來獲取(一般大小為10個),同時我們也可以通過setFetchSize()方法來設置這個緩存區的大小。
在JDBC 2.0(JDK 1.2)之后,該接口添加了一組更新方法updateXXX(),該方法有兩個重載方法,可根據列的索引號和列的名稱來更新指定列。但該方法並沒有將對數據進行的操作同步到數據庫中,需要執行updateRow()或insertRow()方法更新數據庫。ResultSet接口的常用方法如下:
方法 功能描述
getInt() 以int形式獲取此ResultSet對象的當前行的指定列值(可以使用欄位名稱或者欄位索引值)。如果列值為NULL,則返回值是0
getFloat() 以float形式獲取此ResultSet對象的當前行的指定列值(可以使用欄位名稱或者欄位索引值)。如果列值為NULL,則返回值是0
getDate() 以date形式獲取此ResultSet對象的當前行的指定列值(可以使用欄位名稱或者欄位索引值)。如果列值為NULL,則返回值是null
getBoolean() 以boolean形式獲取此ResultSet對象的當前行的指定列值(可以使用欄位名稱或者欄位索引值)。如果列值為NULL,則返回值是null
getString() 以String形式獲取此ResultSet對象的當前行的指定列值(可以使用欄位名稱或者欄位索引值)。如果列值為NULL,則返回值是null
getObject() 以Object形式獲取此ResultSet對象的當前行的指定列值(可以使用欄位名稱或者欄位索引值)。如果列值為NULL,則返回值是null
first() 將指針移到當前記錄的第一行
last() 將指針移到當前記錄的最后一行
next() 將指針向下移一行
beforeFirst() 將指針移到集合的開頭(第一行位置)
afterLast() 將指針移到集合的尾部(最后一行位置)
absolute(int index) 將指針移到ResultSet給定編號的行
isFirst() 判斷指針是否位於當前ResultSet集合的第一行。如果是返回true,否則返回false
isLast() 判斷指針是否位於當前ResultSet集合的最后一行。如果是返回true,否則返回false
updateInt() 用int值更新指定列
updateFloat() 用float值更新指定列
updateLong() 用long值更新指定列
updateString() 用String值更新指定列
updateObject() 用Object值更新指定列
updateNull() 將指定的列值修改為NULL
updateDate() 用指定的date值更新指定列
updateDouble() 用double值更新指定列
getRow() 查看當前行的索引號
insertRow() 將插入行的內容插入到數據庫
updateRow() 將當前行的內容同步到數據庫
deleteRow() 刪除當前行,但是不同步到數據庫中,而是在執行close()方法之后同步到數據庫中
---------------------
一、JDBC接口核心的API
在JDK API的java.sql.* 和 javax.sql.*下面查看
1、Driver接口: 表示java驅動程序接口。所有的具體的數據庫廠商要來實現此接口。
1)connect(url, properties): 連接數據庫的方法。
url: 連接數據庫的URL
URL語法: jdbc協議:數據庫子協議://主機:端口/數據庫
user: 數據庫的用戶名
password: 數據庫用戶密碼
2、DriverManager類: 驅動管理器類,用於管理所有注冊的驅動程序
1)registerDriver(driver) : 注冊驅動類對象
2)Connection getConnection(url,user,password); 獲取連接對象
3、Connection接口: 表示java程序和數據庫的連接對象。
1)Statement createStatement() : 創建Statement對象
2)PreparedStatement prepareStatement(String sql) 創建PreparedStatement對象
3)CallableStatement prepareCall(String sql) 創建CallableStatement對象
4、Statement接口: 用於執行靜態的sql語句
1)int executeUpdate(String sql) : 執行靜態的更新sql語句(DDL,DML)
2)ResultSet executeQuery(String sql) :執行的靜態的查詢sql語句(DQL)
5、PreparedStatement接口(Statement接口的子接口):用於執行預編譯sql語句
1) int executeUpdate() : 執行預編譯的更新sql語句(DDL,DML)
2)ResultSet executeQuery() : 執行預編譯的查詢sql語句(DQL)
6、CallableStatement接口(PreparedStatement接口的子接口):用於執行存儲過程的sql語句(call xxx)
1)ResultSet executeQuery() : 調用存儲過程的方法
7、ResultSet接口:用於封裝查詢出來的數據
1)boolean next() : 將光標移動到下一行
2)getXX() : 獲取列的值
二、使用Statement執行sql語句
1、執行DDL語句
package sram.jdbc.connection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
/**
* 使用Statement對象執行靜態sql語句
*/
public class Demo2 {
private String url = "jdbc:mysql://localhost:3306/emp_system";
private String user = "root";
private String password = "root";
/**
* 執行DDL語句(創建表)
*/
@Test
public void test1(){
Connection conn = null;
Statement stmt = null;
try {
//1.驅動注冊程序
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連接對象
conn = DriverManager.getConnection(url, user, password);
//3.創建Statement
stmt = conn.createStatement();
//4.准備sql
String sql = "CREATE TABLE dept(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),BossName VARCHAR(20))";
//5.發送sql語句,執行sql語句,得到返回結果
int count = stmt.executeUpdate(sql);
//6.校驗是否發送成功
System.out.println("影響了"+count+"行!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
//7.關閉連接(順序:后打開的先關閉)
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
}
2、執行DML語句:和執行DDL語句一樣,僅sql語句不同
1)插入:
String sql = "INSERT INTO dept(NAME,BossName) VALUES('軟件開發部','張三')";
2)更新:
String sql = "UPDATE dept SET NAME='銷售部' WHERE id='1'";
3)刪除:
String sql = "DELETE FROM dept WHERE id=2";
3、封裝重復代碼,引入變量
1)封裝重復代碼:
package sram.util.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* jdbc工具類
*/
public class JdbcUtil {
private static String url = "jdbc:mysql://localhost:3306/emp_system";
private static String user = "root";
private static String password = "root";
/**
* 靜態代碼塊中(只加載一次)
*/
static{
//注冊驅動程序
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("驅動程序注冊出錯");
}
}
/**
* 抽取獲取連接對象的方法
*/
public static Connection getConnection(){
try {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* 釋放資源的方法
*/
public static void close(Connection conn,Statement stmt){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
2)使用封裝好的類,並引入變量
package sram.jdbc.connection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
import sram.util.jdbc.JdbcUtil;
/**
* 使用Statement對象執行靜態sql語句
*/
public class Demo2 {
/**
* 執行DTL/DML語句
*/
private int id = 4;
@Test
public void test(){
Connection conn = null;
Statement stmt = null;
try {
//1.驅動注冊程序
//2.獲取連接對象
//使用封裝類
conn = JdbcUtil.getConnection();
//3.創建Statement
stmt = conn.createStatement();
//4.准備sql
//String sql = "CREATE TABLE dept(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),BossName VARCHAR(20))";
//String sql = "INSERT INTO dept(NAME,BossName) VALUES('軟件開發部','張三')";
//String sql = "UPDATE dept SET NAME='銷售部' WHERE id=1";
//使用變量形式
String sql = "DELETE FROM dept WHERE id="+id;
//5.發送sql語句,執行sql語句,得到返回結果
int count = stmt.executeUpdate(sql);
//6.校驗是否發送成功
System.out.println("影響了"+count+"行!");
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
//7.關閉連接(順序:后打開的先關閉)
//使用封裝類
JdbcUtil.close(conn, stmt);
}
}
}
4、執行DQL語句
package sram.jdbc.connection;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
import sram.util.jdbc.JdbcUtil;
/**
* 使用Statement執行DQL語句(查詢操作)
*/
public class Demo3 {
@Test
public void test(){
Connection conn = null;
Statement stmt = null;
try {
//獲取連接
conn = JdbcUtil.getConnection();
//創建Statement
stmt = conn.createStatement();
//准備sql
String sql = "SELECT * FROM dept";
//執行sql
ResultSet rs = stmt.executeQuery(sql);
/*
//移動光標
boolean flag = rs.next();
if(flag){
//取出列值
//通過索引
/*
int id = rs.getInt(1);
String name = rs.getString(2);
String bossName = rs.getString(3);
System.out.println(id+","+name+","+bossName);
//列名稱,不區分大小寫
int id = rs.getInt("id");
String name = rs.getString("name");
String bossName = rs.getString("bossname");
System.out.println(id+","+name+","+bossName);
}*/
//遍歷結果
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String bossName = rs.getString("bossname");
System.out.println(id+","+name+","+bossName);
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
JdbcUtil.close(conn, stmt);
}
}
}
參考: https://www.cnblogs.com/xiaodf/p/5027200.html
https://blog.csdn.net/mChenys/article/details/80498964