有人的地方,就有江湖;人在江湖中,一定離不開那種種紛爭,縱然你精通各類武林絕學,要知道人外有人,天外有天,要想本身不被這個江湖淘汰,惟一的途徑惟有不斷的學習新的武功,可是有個前提,須要有強大的內功作保障才能駕馭得了看上去實用且能夠一招制敵的絕學。今天,咱們就去網絡的江湖中進行修煉,但願咱們能夠共同成長,未來,一統江湖~java
喜歡武俠的朋友都知道,在金庸前輩的《天龍八部》中,有一位記憶力超羣,可以記住全部武學祕籍的神仙姐姐----王語嫣,那麼在咱們網絡江湖中,也有一位神仙姐姐------數據庫,數據庫可以將數據持久化,能夠永久的保存起來,須要的時候,能夠經過數據庫查詢到本身想要的數據~咱們今天要修煉的是一門內功,他是java與數據庫之間的一個橋樑,是一個規範而不是一個實現,可以執行SQL語句。它由一組用Java語言編寫的類和接口組成。各類不一樣類型的數據庫都有相應的實現(以mysql爲例),學會此門內功,則學起來其餘相關功法定會事半功倍~祕籍在下,欲練此功,心靜放空~mysql
1.裝載相應的數據庫的JDBC驅動並進行初始化sql
(1)導入相應的jar包(不一樣的數據庫須要的jar包是不一樣的):訪問MySQL數據庫須要用到第三方的類,這些第三方的類,都被壓縮在一個.Jar的文件裏。mysql-connector-java-5.0.8-bin.jar包能夠在網上下載,或者在MySQL的安裝目錄下找到。一般下載到該jar包以後將其放到在項目的lib目錄下,若是你會使用maven,那麼導入依賴便可使用,在此不作過多講解數據庫
(2)初始化驅動:經過初始化驅動類com.mysql.jdbc.Driver,該類就在 mysql-connector-java-5.0.8-bin.jar中。若是你使用的是oracle數據庫那麼該驅動類將不一樣。網絡
Class.forName是把這個類加載到JVM中,加載的時候,就會執行其中的靜態初始化塊,完成驅動的初始化的相關工做。oracle
2.創建JDBC和數據庫之間的Connection鏈接 maven
Connection是與特定數據庫鏈接回話的接口,使用的時候須要導包,並且必須在程序結束的時候將其關閉。getConnection方法也須要捕獲SQLException異常。由於在進行數據庫的增刪改查的時候都須要與數據庫創建鏈接,因此能夠在項目中將創建鏈接寫成一個工具方法,用的時候直接調用便可:工具
/** * 取得數據庫的鏈接 * @return 一個數據庫的鏈接 */ public static Connection getConnection(){ Connection conn = null; try { //初始化驅動類com.mysql.jdbc.Driver Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://IP:3306/數據庫名稱?characterEncoding=UTF-8","數據庫帳號", "數據庫密碼"); } catch (ClassNotFoundException e) { e.printStackTrace(); }catch (SQLException e) { e.printStackTrace(); } return conn; }
3.建立Statement或者PreparedStatement接口,執行SQL語句學習
Statement接口建立以後,能夠執行SQL語句,完成對數據庫的增刪改查。其中 ,增刪改只須要改變SQL語句的內容就能完成,然而查詢略顯複雜。在Statement中使用字符串拼接的方式,該方式存在句法複雜,容易犯錯等缺點,具體在下文中的對比中介紹。因此Statement在實際過程當中使用的很是的少,因此具體的咱們放道PreparedStatement那裏給出詳細代碼。編碼
Connection conn=getConnection(); Statement s = conn.createStatement(); //拼裝sql,字符串要用單引號' String sql = "insert into t_test values(null,"+"'xxx')"; //在statement中使用字符串拼接的方式,這種方式存在諸多問題 s.execute(sql);System.out.println("插入成功");
字符串拼接方式的SQL語句是很是繁瑣的,中間有不少的單引號和雙引號的混用,極易出錯。因此不推薦使用此類,與之有相同功能的還有一個:PreparedStatement~
與 Statement相似,PreparedStatement也是用來執行sql語句的,與建立Statement不一樣的是,須要根據sql語句建立PreparedStatement。除此以外,還可以經過設置參數,指定相應的值,而不是Statement那樣使用字符串拼接,避免出錯,接下來咱們使用PreparedStatement來寫一套增刪改查的小例子,利於瞭解這個類的使用。建表和字段部分在此不講,請自行準備
添加代碼片斷:
public void add(String code){
//該語句爲每一個 IN 參數保留一個問號(「?」)做爲佔位符
String sql = "insert into t_test(code) values(?)";
// 和數據庫取得鏈接
Connection conn = null;
//建立statement
PreparedStatement pstmt = null;
try{
conn =getConnection();
pstmt = (PreparedStatement) conn.prepareStatement(sql);
//給佔位符賦值
pstmt.setString(1, courseName);
//執行SQL
pstmt.executeUpdate();
}catch(SQLException e){
e.printStackTrace();
} finally{
close(pstmt);
close(conn);
//必須關閉
}
}
刪除代碼片斷:
public void delete(int id){
String sql = "delete from t_test where course_id = ?";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setInt(1, id);
pstmt.executeUpdate();
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}finally{
//關閉鏈接
close(pstmt);
close(conn);
}
}
修改代碼片斷:
public void update(int id,String code){ String sql = "update t_test set code =? where id=?"; Connection conn = null; PreparedStatement pstmt = null; try { conn = getConnection(); pstmt = (PreparedStatement) conn.prepareStatement(sql); //利用Preparedstatement的set方法給佔位符賦值 pstmt.setString(1, code); pstmt.setInt(2, id); pstmt.executeUpdate(); } catch (SQLException e) { // TODO: handle exception e.printStackTrace(); }finally{ close(pstmt); close(conn); } }
經過上面的代碼片斷能夠看出,他們的代碼中,有不少類似的地方,除了SQL語句外,其餘的地方几乎都是相同的。由於增刪改操做是狀態性質的操做,不涉及到結果集,因此相對查詢來講,他們三個是簡單些的操做,下面,咱們來看一看查詢操做的處理方式:
public List<Test> getTestList(){ String sql = "select * from t_test"; Connection conn = null; PreparedStatement pstmt = null; //建立一個集合對象用來存放查詢到的數據 ResultSet rs = null; List<Test> testList = new ArrayList<>(); try { conn = getConnection(); pstmt = (PreparedStatement); conn.prepareStatement(sql); rs = (ResultSet) pstmt.executeQuery(); while (rs.next()){ //每一個記錄對應一個對象 int id = rs.getInt("id"); String code = rs.getString("code"); Test test = new Test(); //將對象放到集合中 test.setId(id); test.setCode(code); testList.add(course); } } catch (SQLException e) { // TODO: handle exception e.printStackTrace(); }finally{ close(pstmt); close(conn); } return testList; }
查詢操做使用executeQuery()進行更新。其餘相關的問題放在第四步(處理和顯示結果)中解釋。
4.處理和顯示結果
執行查詢語句,並把結果集返回給集合ResultSet :利用While(ResultSet.next()){…}循環將集合ResultSet中的結果遍歷出來。
while (rs.next()){ int id = rs.getInt("id"); String code = rs.getString("code"); //每一個記錄對應一個對象 Test test = new Test(); test.setId(id); test.setCode(code); //將對象放到集合中 testList.add(course); }
5.釋放資源
在JDBC編碼的過程當中咱們建立了Connection、ResultSet等資源,這些資源在使用完畢以後是必定要進行關閉的。關閉的過程當中遵循從裏到外的原則。
至此,咱們就能夠很容易的經過java來使用jdbc操做數據庫了,然而,這僅僅是jdbc的基本使用,在持久層中,不只僅涉及操做數據庫的知識,還有事務,獲取自增、獲取元數據、ORM、DAO、數據鏈接池等內容~爲了防止過分修煉,走火入魔,咱們須要吸取一下今天所學習的內容,可以熟練使用JDBC操做數據庫以後再進行接下來的修煉~
參考文章:https://blog.csdn.net/jungle_rao/article/details/81274720