Java資料庫連線JDBC
1.JDBC是什麼?
JDBC是用於在Java語言程式設計中與資料庫連線的API。根本上,JDBC是一個規範,它提供了一整套介面,允許以一種可移植的訪問底層資料庫API。 Java可以用它來編寫不同型別的可執行檔案。
2.JDBC架構
兩層:
三層:
UI(表現層): UI就是介面,即使用者互動的介面。但它不只是一個個使用者介面,也是需要有程式碼來接收使用者輸入的資料和顯示處理後返回給使用者的資料。
BLL:(業務邏輯層): UI層和DAL層之間的橋樑。業務邏輯具體包含:驗證、計算、業務規則等等。其實就是資料的處理和傳輸。
DAL:(資料訪問層): 與資料庫打交道。實現對資料的增、刪、改、查。(其實對資料的操作都是這四個)將儲存在資料庫中的資料提交給業務層,同時將業務層處理的資料儲存到資料庫。
(使用者的需求反映給介面(UI),UI反映給BLL,BLL反映給DAL,DAL進行資料的操作,操作後再一一返回,直到將使用者所需資料反饋給使用者)
上面看起來每一層都是獨立的在完成各自的工作,那麼三層之間通過什麼來聯絡實現使用者請求和反饋資料這些過程呢?
Entity(實體層):實體層貫穿於三層之間,來連線三層。
當然還有一個問題就是在三層間傳遞的某個資料表會包含很多資訊,每個變數都做為引數來傳遞的話,方法中的引數實在是多得讓人眼花繚亂分不清了。那就考慮一下用實體做引數如何? 不用考慮引數匹配的問題,用到實體中哪個屬性拿來直接用就可以,很方便。(就好像我們在做遊戲或畫圖板時,在另一個與介面分離的實現功能類中需要用到介面上的某個按鈕控制元件,我們可以選擇把整個介面傳參過去,而不只是傳那個按鈕控制元件,如果下次再用到介面上的其他東東也就不需要再傳遞其他引數了,而且當需要用到介面上的很多控制元件時,一個一個傳是極其混亂不方便的。)
將每個資料表作為一個實體類,實體類封裝的屬性對應到表中的欄位,這樣的話,實體在貫穿於三層之間時,就可以實現資料的增刪改查了。
看張貼近生活的圖或許能更好的理解下這三層之間的關係!
服務員:只管接待客人;
廚師:只管做客人點的菜;
採購員:只管按客人點菜的要求採購食材;
他們之間各盡其職,不需要去管其他的工作。這也就體現出了三層架構的目的:解耦!!!
他們三層之間的聯絡是這樣的:
顧客和服務員(UI層)說:我要一個炒茄子,而服務員不負責炒茄子,她就把請求往上遞交,傳遞給廚師(BLL層),廚師需要茄子,就把請求往上遞交,傳遞給採購員(DAL層),採購員從倉庫裡取來茄子傳回給廚師,廚師響應cookEggplant()方法,做好炒茄子後,又傳回給服務員,服務員把茄子呈現給顧客。
在此過程中,茄子作為引數在三層中傳遞,如果顧客點炒雞蛋,則雞蛋作為引數(這是變數做引數)。如果使用者增加需求,我們還得在方法中新增引數,每個方法都得增加。上面通過實體類的封裝解決這個問題,就是我們可以把茄子、雞蛋、麵條作為屬性定義到顧客實體中,一旦顧客增加了炒雞蛋需求,直接把雞蛋屬性拿出來用即可,不用再去考慮去每層的方法中新增引數和引數的匹配問題了。
3.JDBC MySQL 連線
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class jdbcDemo {
public static void main(String[] args) throws Exception {
// 1.註冊驅動 通過反射 JDBC驅動名
Class.forName("com.mysql.jdbc.Driver");
//2.獲得連線 資料庫URL
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8","root","root");
//3.建立一個Statement
String sql="select * from t_user"; //t_user表明
PreparedStatement state=conn.prepareStatement(sql);
//4.執行SQL
ResultSet rs = state.executeQuery();
//定義List而不是ArrayList是實現多型
List<User> users=new ArrayList<User>();
while(rs.next()){
//用角標來取,傳的是數字。int id = rs.getInt(“1”);報錯
//可以通過欄位名獲取欄位 int id = rs.getInt(“id”);
int id = rs.getInt(1);
String name = rs.getString(2);
User u=new User();
u.setId(id);
u.setName(name);
users.add(u);
}
//5.釋放資源
rs.close();
state.close();
conn.close();
System.out.println(users.size());
}
}
//使用者類
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}