復習java數據庫操作的總結


以前學習java數據庫操作,學得那叫糊里糊塗,各種JDBC常用的類和接口根本是傻傻分不清啥是干嘛的。只是套着用用吧。

不過這次好歹清楚些了,嗚嗚,學習有階段性,多次重復才有好效果,多么痛的領悟。

工程名字是瞎起的,本來想復習繼承多態來着,(逃

然后再來說一下JDBC,JDBC是一種可用於執行SQL語句的Java API,是連接應用程序和數據庫的紐帶,可以為多種關系數據庫提供統一訪問,它由一組用java編寫的類和接口組成。JDBC提供了一種基准,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序,簡單地說,JDBC 可做三件事:與數據庫建立連接、發送 操作數據庫的語句並處理結果。

但大多數的書里面都會講到JDBC-ODBC,然后就很懵逼,啥啊!

那么先說啥是ODBC吧。

開放數據庫連接(Open Database Connectivity,ODBC)是微軟公司開放服務結構(WOSA,Windows Open Services Architecture)中有關數據庫的一個組成部分,它建立了一組規范,並提供了一組對數據庫訪問的標准API(應用程序編程接口)。這些API利用SQL來完成其大部分任務。ODBC本身也提供了對SQL語言的支持,用戶可以直接將SQL語句送給ODBC。ODBC基於SQL,並把它作為訪問數據庫的標准。這個接口提供了最大限度的相互可操作性:一個應用程序可以通過一組通用的代碼訪問不同的數據庫管理系統。一個軟件開發者開發的客戶/服務器應用程序不會被束定於某個特定的數據庫之上。ODBC可以為不同的數據庫提供相應的驅動程序。對於ASP程而言,ODBC數據源是ASP程序的ADO組件和數據庫之間的接口。

由於微軟的數據庫不是用Java語言來編寫的,但是我們需要用java語言連接微軟的數據庫,這樣就要編寫一個橋連接,使java語言編寫的代碼也可以操作數據庫。也就是說:

JDBC是使用通過JAVA的數據庫驅動直接和數據庫相連,而JDBC-ODBC連接的是ODBC的數據源,真正與數據庫建立連接的是ODBC。這下懂了吧。
不過我還在網頁上看見另一句話,建議使用JDBC直接連接,同時最好使用連接池!

說的真對,這么多年用MYSQL,一直都是用了一個叫“mysql-connector-java-5.1.35-bin.jar”的jar包,也就是java的數據庫驅動,還沒有用過ODBC呢,SQL Server沒怎么學過,orz。。。

貼代碼:

1.連接數據庫

要訪問數據庫,首先加載數據庫的驅動程序,只需要在第一次訪問數據庫時家再一次,然后每次訪問數據時創建一個Connection對象,接着執行操作數據庫的SQL語句,最后完成數據庫操作后銷毀前面的Connection對象即可。

將連接數據庫作為單獨的一個方法,並以Connection對象作為返回值,遇到對數據庫執行操作的程序時可以直接調用Conn類的getConnection方法獲取連接,增加代碼重用性。

 1 package DBManager;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.SQLException;
 6 
 7 public class DBConn {
 8     Connection conn;
 9     public Connection getConnection(){//目的是為了獲取與數據庫的連接,在主方法中調用該方法。
10         //JDBC技術是一種執行SQL語句的javaAPI。
11                 try {
12                     Class.forName("com.mysql.jdbc.Driver");//java.lang包的靜態方法來加載JDBC驅動程序。。加載失敗異常ClassNotFoundException
13                     System.out.println("db run success");
14                     conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/littlet","root","1234");//通過訪問數據庫的URL獲取數據庫連接對象java.sql包中類DriveManager的靜態方法。。連接失敗異常SQLException
15                     System.out.println("db connect success");
16                 } catch (Exception e) {
17                     // TODO Auto-generated catch block
18                     e.printStackTrace();
19                 }
20                 return conn;
21     }
22     //關閉Connection對象
23         public static void closeConnection(Connection conn){
24             try {
25                 conn.close();
26             } catch (SQLException e) {
27                 // TODO Auto-generated catch block
28                 e.printStackTrace();
29             }
30         }
31         //回滾
32         public static void rollbackConnection(Connection conn){
33             try {
34                 conn.rollback();
35             } catch (SQLException e) {
36                 // TODO Auto-generated catch block
37                 e.printStackTrace();
38             }
39         }
40 }

2.確定存儲的類型,就是數據庫中放的東西,就是我們處理的這個對象。

 1 package domain;
 2 
 3 public class Student {
 4     private int id;
 5     private String name;
 6     public int getId() {
 7         return id;
 8     }
 9     public void setId(int id) {
10         this.id = id;
11     }
12     public String getName() {
13         return name;
14     }
15     public void setName(String name) {
16         this.name = name;
17     }
18     
19 }

3.java數據庫操作代碼

 1 package DBManager;
 2 
 3 import java.sql.Connection;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import java.sql.Statement;
 8 
 9 import domain.Student;
10 
11 public class Select {
12     Connection con;
13     PreparedStatement sql;
14     ResultSet res;//ResultSet類的next()方法返回值就是boolean類型的數據,當游標移動到最后一行會返回false。
15     public void select(int id){
16         DBConn db=new DBConn();
17         con=db.getConnection();
18         try {
19             sql=con.prepareStatement("select * from stub where id=?");
20             sql.setInt(1,id);
21             res=sql.executeQuery();//執行預處理語句
22             while(res.next()){
23                 String name=res.getString(2);
24                 System.out.println(name);
25             }
26         } catch (SQLException e) {
27             // TODO Auto-generated catch block
28             e.printStackTrace();
29         }finally{
30             db.closeConnection(con);
31         }
32         
33         
34     }
35 }

為什么執行SQL語句用的是PrepareStatement對象而不是Statement對象呢?有什么區別嗎?

 1 sql=con.createStatement();有了Statement對象后,可以調用相應的方法實現對數據庫的查詢和修改
 2 
 3 res.sql.executeQery(select * from stub);//獲取查詢結果集使用“%”代替0個或多個字符,使用下划線“_”代替一個字符實現模糊查詢。+"where name like'zhang%'"
 4 
 5 while(res.next()){
 6 
 7   int id=rew.getInt("id");
 8 
 9   String name=res.getString("name");
10 
11 }

 

向數據庫發送一個SQL語句,數據庫中的SQL解釋器負責把SQL語句生成底層的內部命令,然后執行該命令,完成相關的數據庫操作,但是不斷地向數據庫提交SQL語句,會增加DB中SQL解釋器的負擔,影響執行速度。對於JDBC,可以通過Connection對象的preparedStatement方法對SQL語句進行預處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM