目錄
JDBC簡介
JDBC:JDBC在應用程序與數據庫之間起到了一個橋樑作用,當應用程序使用JDBC訪問特定的數據庫時,只需要通過不同的數據庫驅動與其對應的數據庫進行連接,連接後即可對該數據庫進行相應的操作。
工作原理:
工作過程:
JDBC驅動與連接
JDBC驅動
由JDBC驅動直接訪問數據庫
優點:純java,快,跨平臺
缺點:訪問不同的數據庫需要下載專用的JDBC驅動
連接JDBC驅動
1.下載特定數據庫的JDBCjar包
到使用的數據庫的官網上下載,本文會提供mysql-connector-java-5.1.39-bin.jar jar包
2.加載並註冊數據庫驅動
方法一:寫代碼(只用於一次程序,不推薦)
//Class.forName("Driver全名");
Class.forName("com.mysql.jdbc.Driver");//以mysql數據庫爲例
方法二:將jar包複製到java運行環境jre文件中(適用於JDBC4.0以後)
(1)找到java文件,將jar包放到jdk下,jre下,lib下,ext中。
(2)找到java文件,將jar包放到jre下,lib下,ext中。
注意:如果使用第三方軟件編程(如:eclipse)則一定要複製jar包到公共jre中
3.連接驅動
(1)getConnection方法詳解
DriverManager.getConnection(String url,String user,String password);
/*url:定位符,找到本機數據庫
*jdbc:數據庫服務名://主機名:端口號:/創建的數據庫名*/
//user:連接數據庫時登錄的用戶名
//password:連接數據庫時的登錄密碼
//例:
//1、加載並註冊數據庫驅動。
Class.forName("com.mysql.jdbc.Driver");
//2、通過DriverManager獲取數據庫連接。
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
JDBC常見API
1.Driver:Driver接口是所有JDBC驅動程序必須實現的接口,用於加載驅動。一次程序的運行中,只需要加載一次。
2.DriverManager:使用該類註冊驅動
3.Connection:連接數據庫的對象
4.Statement:執行靜態的SQL語句,並返回一個結果對象(繁瑣,不安全)
5.ResultSet:結果集對象(封裝了查詢結果的數據)
6.PreparedStatement:Statement的子接口,用於執行預編譯的SQL語句。(通過Connection進行獲取)
JDBC數據查詢
一般查詢
1.接口詳解
一般查詢需要JDBC API中的Statement接口與ResultSet接口
Statement接口:
(1)由Connection產生;
(2)Statement對象用於將SQL語句發送到數據庫中;
(3)在JDBC API 中通常有3種Statement對象,它們都可以作爲在給定連接上執行SQL語句的容器。
Statement | 用於無參數的查詢 |
PreparedStatement (預編譯SQL語句) |
用於帶參數的查詢,當SQL語句多次運行,使用該對象可提高運行效率。 |
CallableStatement | 用於調用存儲過程 |
(4)Statement與PreparedStatement對象的創建
//使用Connection對象的createStatement方法,創建Statement對象(conn爲Connection對象)
Statement stmt=conn.createStatement();
//使用Connection對象的prepareStatement方法,創建PreparedStatement對象
PreparedStatement pstmt =conn.prepareStatement("要執行的SQL語句");
(5)Statement對象的方法
//適用於執行select語句
public ResultSet executeQuery()throws SQLException;
//適用於執行insert,update,delete等數據修改和維護語句
public 行數 executeUpdate(String sql)throws SQLException;
ResultSet接口:
(1)ResultSet對象用於包含符合SQL語句中條件的所有記錄,它的組織結構類似於一張臨時表。
(2)ResultSet接口自帶遊標,只有使用next()方法纔可使遊標轉到ResultSet對象中的第一行。
(3)getXxx()方法,用於返回當前行中指定列索引columnNumber或列名字columnName的數據。
/*語法:
XXX getXXX (int columnNuber);
XXX getXXX (String columnName);*/
//例:
int id =resultSet.getInt("id");
String name=resultSet.getString("name");
(4)close()用於關閉ResultSet對象
2.一般查詢示例程序
(1)一般查詢執行步驟
(2)一般查詢執行程序
public static void main(String[] args) {
try {
//1.註冊驅動(已將JDBC Driver jar包放入ext文件中可不寫)
Class.forName("com.mysql.jdbc.Driver");
//2.獲取數據庫連接對象
//如果對象是主機,並端口號是默認值:3306,url可簡寫:"jdbc:mysql:///jdbc"
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
//3.獲取SQL語句的執行對象
//此處使用Statement接口的子接口PreparedStatement更安全
PreparedStatement pstmt=conn.prepareStatement("select*from users");
//4.執行SQL語句,調用executeQuery查詢方法
ResultSet resultSet=pstmt.executeQuery();
//5.處理結果集
while(resultSet.next()){//next方法返回值爲boolean類型
int id =resultSet.getInt("id");//getXxx方法:可以根據列號與列名獲取
String name=resultSet.getString("name");
String password=resultSet.getString(3);
String email=resultSet.getString(4);
System.out.println(id+" "+name+" "+password+" "+email);
}
//6.關閉流釋放資源
conn.close();
pstmt.close();
resultSet.close();
} catch (Exception e) {
e.printStackTrace();
}
}
JDBC數據維護
會使用到的Statement的方法
//適用於執行insert,update,delete等數據修改和維護語句
public 行數 executeUpdate(String sql)throws SQLException;
數據維護一般流程
更新數據
例1:
public static void main(String[] args) throws Exception {
//1.註冊驅動
//Class.forName("com.mysql.jdbc.Driver");
//2.獲取數據庫連接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
//3.獲取SQL語句的執行者
PreparedStatement pstmt=conn.prepareStatement("UPDATE users SET NAME='tc' WHERE id=?");
//給佔位符進行填充數據
pstmt.setObject(1, "1");//
//4.執行SQL語句
int count=pstmt.executeUpdate();//返回值是int數組
//5.處理結果集
if(count>0){
System.out.println(count+"行受到影響");
}else{
System.out.println("更改失敗");
}
//6.釋放資源
conn.close();
pstmt.close();
}
例2:
String sql="update users set email='[email protected]' where name='ert'";
插入數據
1.插入單條記錄
請回顧Statement接口詳解
例1:
public static void main(String[] args) {
try{
//1.註冊驅動
//Class.forName("com.mysql.jdbc.Driver");
//2.獲取數據庫連接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
//3.準備insert SQL語句
String sql="INSERT INTO users(name,password,email,birthday) VALUES(?,?,?,?)";
//4.設置參數,注意所使用的參數的數據類型
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setString(1, "cm");pstmt.setString(2, "1234556");
pstmt.setString(3, "[email protected]");
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" );//設置日期格式
java.util.Date date = sdf.parse( "2002-5-6" );//設置日期參數
long lg = date.getTime(); // 日期 轉 時間戳
pstmt.setDate(4, new java.sql.Date( lg ));
//5.執行SQL語句
int count=pstmt.executeUpdate();
//6.判斷執行結果,返回值大於1則成功插入一條數據
if(count>0){
System.out.println("記錄成功");
}else{
System.out.println("記錄失敗");
}
conn.close();
pstmt.close();
}catch(Exception e){
e.printStackTrace();
}
}
例2:
public static void main(String[] args) {
try{
//1.註冊驅動
//Class.forName("com.mysql.jdbc.Driver");
//2.獲取數據庫連接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
//3.準備insert SQL語句
String sql="insert into users(name,password,email,birthday) values('wm','123456','[email protected]','1984-05-17');";
PreparedStatement pstmt=conn.prepareStatement(sql);
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" );//設置日期格式
java.util.Date date = sdf.parse( "2002-5-6" );//設置日期參數
long lg = date.getTime(); // 日期 轉 時間戳
pstmt.setDate(4, new java.sql.Date( lg ));
//4.執行SQL語句
int count=pstmt.executeUpdate();
//5.判斷執行結果,返回值大於1則成功插入一條數據
if(count>0){
System.out.println("記錄成功");
}else{
System.out.println("記錄失敗");
}
//6.關閉接口
conn.close();
pstmt.close();
}catch(Exception e){
e.printStackTrace();
}
}
2.批量插入數據
採用批量提交的方式,使用addBatch(String sql)方法添加批量操作SQL語句,然後用executeBath()方法對所提交的多個SQL語句進行批量操作。
注:批量操作只適用於DML(增刪改操作)
Satement對象的executeBath()方法
public int[] executeBatch() throws SQLException;//該語句不能執行具有返回結果集的SQL語句
//例:
public static void main(String[] args) throws Exception {
//1.加載驅動
//Class.forName("com.mysql.jdbc.Driver");
//2.獲取數據庫連接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
//3.準備3個插入SQL語句
String sql="INSERT INTO users(name,password,email)VALUES(?,?,?)";
//4.
PreparedStatement pstmt=conn.prepareStatement(sql);
//5.設置參數
pstmt.setString(1, "jdh");
pstmt.setString(2, "3452");
pstmt.setString(3, "[email protected]");
//6.添加一次預定義參數
pstmt.addBatch();
//7.設置參數
pstmt.setString(1, "jdsh");
pstmt.setString(2, "34322");
pstmt.setString(3, "[email protected]");
//8.再添加一次預定義參數
pstmt.addBatch();
//9.批量執行預定義SQL
int []count=pstmt.executeBatch();
//10.判斷執行結果,返回值大於1則成功插入一條數據
if(count[0]>0){
System.out.println("記錄成功");
}else{
System.out.println("記錄失敗");
}
conn.close();
pstmt.close();
}
刪除數據
例1:
public static void main(String[] args) throws Exception {
//1.註冊驅動
//Class.forName("com.mysql.jdbc.Driver");
//2.獲取數據庫連接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
//3.準備insert SQL語句
String sql="DELETE FROM users WHERE id=?";
//4.使用Connection接口的prepareStatement方法創建PreparedStatement對象
//將SQL語句發送到數據庫中
PreparedStatement ps=conn.prepareStatement(sql);
//5.設置參數
ps.setString(1,"1");
//6.//執行SQL語句
int ret=ps.executeUpdate();
//7.//判斷執行結果
if(ret>0){
System.out.println("記錄刪除成功!!");
}else{
System.out.println("記錄刪除失敗!!");
}
//8.關閉Connection和PreparedStatement對象
conn.close();
ps.close();
}
例2:
String sql="delete from users where name='tsa'";
拓展
JDBC中設置Date類型參數
1.手動設置時間
PreparedStatement 的 setDate 方法使用的是 java.sql.Date 類型的日期參數。
設置這種參數的方法,例子:
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );//設置時間格式
java.util.Date date = sdf.parse( "2015-5-6 10:30:00" );//設置時間
long lg = date.getTime(); // 日期 轉 時間戳
PreparedStatement pst = conn.prepareStatement(sql); // 創建 PreparedStatement 對象
ps.setDate( 3, new java.sql.Date( lg ) );
2.自動獲取本地時間
如果要在java代碼中向數據庫插入數據,可使用TimeStamp對象:創建java.util.Date對象,轉換成TimeStamp對象(java.sql.Date對象不能保存時間,utils的可以)插入數據庫(TimeStamp繼承自java.sql.Date,數據庫中自動轉換成Date)
(1)ps.setTimestamp(1, new java.sql.Timestamp(System.currentTimeMillis()));
(2)java.sql.Date date = new java.sql.Date(System.currentTimeMillis());//獲取當前時間
java.util.Date date = new java.util.Date(); // 獲取一個Date對象
Timestamp timeStamp = new Timestamp(date.getTime());
// 將日期時間轉換爲數據庫中的timestamp類型
pstmt.setTimestamp(2, timeStamp);