转载:JDBC连接数据库教程,postgreSQL
0、概述
本文借postgreSQL通過JDBC連接數據庫的示例,介紹了常見數據庫操作及JDBC的API、JDBC的一般工作流程及JDBC事務。
1、準備工作
A、下載安裝好postgreSQL數據庫。
B、新建一個Java項目,并導入postgreSQL的JDBC驅動程序jar包。
2、Java連接postgreSQL代碼示例。
[java] view plain copy
package?vertxTest;??
??
import?java.sql.Connection;??
import?java.sql.DriverManager;??
import?java.sql.Statement;??
??
public?class?PostgreSQLJDBC?{??
????public?static?void?main(String?args[])?{??
????????Connection?c?=?null;??
????????Statement?stmt?=?null;??
????????try?{??
????????????Class.forName("org.postgresql.Driver");??
????????????c?=?DriverManager.getConnection("jdbc:postgresql://localhost:5432/pgsqltest",?"postgres",?"2016");??
????????????c.setAutoCommit(false);?//?把自動提交??
????????????System.out.println("Opened?database?successfully");??
??
????????????stmt?=?c.createStatement();???
????????????String?sql?=?"CREATE?TABLE?STUDENTS?"?+???
?????????????????????????"(ID?TEXT?PRIMARY?KEY?????NOT?NULL?,"?+???
?????????????????????????"?NAME????????????TEXT????NOT?NULL,?"?+???
?????????????????????????"?SEX?????????????TEXT????NOT?NULL,?"?+???
?????????????????????????"?AGE?????????????TEXT????NOT?NULL)";???
????????????stmt.executeUpdate(sql);???
????????????System.out.println("Table?created?successfully");??
??????????????
????????????stmt.close();??
????????????c.commit();??
????????????c.close();??
????????}?catch?(Exception?e)?{??
????????????System.err.println(e.getClass().getName()?+?":?"?+?e.getMessage());??
????????????System.exit(0);??
????????}??
????}??
}??
3、常見增刪改查操作。
A、定義記錄的類(可選)
[java] view plain copy
package?vertxTest;??
??
public?class?Student?{??
????private?String?Id;??
????private?String?Name;??
????private?String?Sex;??
????private?String?Age;??
??
????Student(String?Id,String?Name,?String?Sex,?String?Age)?{??
????????this.Id?=?Id;?//default??
????????this.Name?=?Name;??
????????this.Sex?=?Sex;??
????????this.Age?=?Age;??
????}??
??
????public?String?getId()?{??
????????return?Id;??
????}??
??
????public?void?setId(String?Id)?{??
????????this.Id?=?Id;??
????}??
??
????public?String?getName()?{??
????????return?Name;??
????}??
??
????public?void?setName(String?Name)?{??
????????this.Name?=?Name;??
????}??
??
????public?String?getSex()?{??
????????return?Sex;??
????}??
??
????public?void?setSex(String?Sex)?{??
????????this.Sex?=?Sex;??
????}??
??
????public?String?getAge()?{??
????????return?Age;??
????}??
??
????public?void?setage(String?Age)?{??
????????this.Age?=?Age;??
????}??
}??
B、JDBC表數據操作方法
[java] view plain copy
package?vertxTest;??
??
import?java.sql.Connection;??
import?java.sql.DriverManager;??
import?java.sql.PreparedStatement;??
import?java.sql.ResultSet;??
import?java.sql.SQLException;??
??
public?class?JDBCOperation?{??
??????
????/**?
?????*?@method?getConn()?獲取數據庫的連接?
?????*?@return?Connection?
?????*/??
????public?Connection?getConn()?{??
????????String?driver?=?"org.postgresql.Driver";??
????????String?url?=?"jdbc:postgresql://localhost:5432/pgsqltest";??
????????String?username?=?"postgres";??
????????String?password?=?"2016";??
????????Connection?conn?=?null;??
????????try?{??
????????????Class.forName(driver);?//?classLoader,加載對應驅動??
????????????conn?=?(Connection)?DriverManager.getConnection(url,?username,?password);??
????????}?catch?(ClassNotFoundException?e)?{??
????????????e.printStackTrace();??
????????}?catch?(SQLException?e)?{??
????????????e.printStackTrace();??
????????}??
????????return?conn;??
????}??
??????
????/**?
?????*?@method?insert(Student?student)?往表中插入數據?
?????*?@return?int?成功插入數據條數?
?????*/??
????public?int?insert(Student?student)?{??
????????Connection?conn?=?getConn();??
????????int?i?=?0;??
????????String?sql?=?"insert?into?students?(id,Name,Sex,Age)?values(?,?,?,?)";??
????????PreparedStatement?pstmt;??
????????try?{??
????????????pstmt?=?(PreparedStatement)?conn.prepareStatement(sql);??
????????????pstmt.setString(1,?student.getId());??
????????????pstmt.setString(2,?student.getName());??
????????????pstmt.setString(3,?student.getSex());??
????????????pstmt.setString(4,?student.getAge());??
????????????i?=?pstmt.executeUpdate();??
????????????pstmt.close();??
????????????conn.close();??
????????}?catch?(SQLException?e)?{??
????????????e.printStackTrace();??
????????}??
????????return?i;??
????}??
??????
????/**?
?????*?@method?delete(Student?student)?刪除表中數據?
?????*?@return?int?成功刪除表中數據條數?
?????*/??
????public?int?delete(String?name)?{??
????????Connection?conn?=?getConn();??
????????int?i?=?0;??
????????String?sql?=?"delete?from?students?where?Name='"?+?name?+?"'";??
????????PreparedStatement?pstmt;??
????????try?{??
????????????pstmt?=?(PreparedStatement)?conn.prepareStatement(sql);??
????????????i?=?pstmt.executeUpdate();??
????????????System.out.println("resutl:?"?+?i);??
????????????pstmt.close();??
????????????conn.close();??
????????}?catch?(SQLException?e)?{??
????????????e.printStackTrace();??
????????}??
????????return?i;??
????}??
??????
????/**?
?????*?@method?update(Student?student)?更改表中數據?
?????*?@return?int?成功更改表中數據條數?
?????*/??
????public?int?update(Student?student)?{??
????????Connection?conn?=?getConn();??
????????int?i?=?0;??
????????String?sql?=?"update?students?set?Age='"?+?student.getAge()?+?"'?where?Name='"?+?student.getName()?+?"'";??
????????PreparedStatement?pstmt;??
????????try?{??
????????????pstmt?=?(PreparedStatement)?conn.prepareStatement(sql);??
????????????i?=?pstmt.executeUpdate();??
????????????System.out.println("resutl:?"?+?i);??
????????????pstmt.close();??
????????????conn.close();??
????????}?catch?(SQLException?e)?{??
????????????e.printStackTrace();??
????????}??
????????return?i;??
????}??
??????
????/**?
?????*?@method?Integer?getAll()?查詢并打印表中數據?
?????*?@return?Integer?查詢并打印表中數據?
?????*/??
????public?Integer?getAll()?{??
????????Connection?conn?=?getConn();??
????????String?sql?=?"select?*?from?students";??
????????PreparedStatement?pstmt;??
????????try?{??
????????????pstmt?=?(PreparedStatement)conn.prepareStatement(sql);??
????????????ResultSet?rs?=?pstmt.executeQuery();??
????????????int?col?=?rs.getMetaData().getColumnCount();??
????????????System.out.println("============================");??
????????????while?(rs.next())?{??
????????????????for?(int?i?=?1;?i?<=?col;?i++)?{??
????????????????????System.out.print(rs.getString(i)?+?"\t");??
????????????????????if?((i?==?2)?&&?(rs.getString(i).length()?<?8))?{??
????????????????????????System.out.print("\t");??
????????????????????}??
?????????????????}??
????????????????System.out.println("");??
????????????}??
????????????????System.out.println("============================");??
????????}?catch?(SQLException?e)?{??
????????????e.printStackTrace();??
????????}??
????????return?null;??
????}??
}??
C、測試類
[java] view plain copy
package?vertxTest;??
??
public?class?JDBCTest?{??
????public?static?void?main(String?args[])?{??
????????JDBCOperation?op?=?new?JDBCOperation();??
????????op.getAll();??
????????op.insert(new?Student("001","Achilles",?"Male",?"14"));??
????????op.insert(new?Student("002","Bean",?"Fmale",?"15"));??
????????op.getAll();??
????????op.update(new?Student("002","Bean",?"",?"7"));??
????????op.delete("Achilles");??
????????op.getAll();??
????}??
}??
C、輸出結果
============================
============================
============================
001 Achilles?? Male?? 14?
002 Bean?????? Fmale? 15?
============================
resutl: 1
resutl: 1
============================
002 Bean?????? Fmale? 7??
============================
4、代碼分析
在上述對數據庫進行增刪改查的過程中,可以發現其共性部分,即通用的流程:
?
(1)創建Connection對象、SQL查詢命令字符串;
?
(2)對Connection對象傳入SQL查詢命令,獲得PreparedStatement對象;
?
(3)對PreparedStatement對象執行executeUpdate()或executeQurey()獲得結果;
?
(4)先后關閉PreparedStatement對象和Connection對象。
?
可見,使用JDBC時,最常打交道的是Connection、PreparedStatement這兩個類,以及select中的ResultSet類。
5、JDBC的API
API
說明
java.sql.Connection?
與特定數據庫的連接(會話)。能夠通過getMetaData方法獲得數據庫提供的信息、所支持的SQL語法、存儲過程和此連接的功能等信息。代表了數據庫。?
java.sql.Driver?
每個驅動程序類必需實現的接口,同時,每個數據庫驅動程序都應該提供一個實現Driver接口的類。?
java.sql.DriverManager (Class)
管理一組JDBC驅動程序的基本服務。作為初始化的一部分,此接口會嘗試加載在”jdbc.drivers”系統屬性中引用的驅動程序。只是一個輔助類,是工具。?
java.sql.Statement?
用于執行靜態SQL語句并返回其生成結果的對象。?
java.sql.PreparedStatement?
繼承Statement接口,表示預編譯的SQL語句的對象,SQL語句被預編譯并且存儲在PreparedStatement對象中。然后可以使用此對象高效地多次執行該語句。?
java.sql.CallableStatement?
用來訪問數據庫中的存儲過程。它提供了一些方法來指定語句所使用的輸入/輸出參數。?
java.sql.PreparedStatement?
繼承Statement接口,表示預編譯的SQL語句的對象,SQL語句被預編譯并且存儲在PreparedStatement對象中。然后可以使用此對象高效地多次執行該語句。?
java.sql.CallableStatement?
用來訪問數據庫中的存儲過程。它提供了一些方法來指定語句所使用的輸入/輸出參數。?
6、JDBC的一般工作流程
(1)加載驅動
???????? Class.forName(“org.postgresql.Driver”); JAVA規范中明確規定:所有的驅動程序必須在靜態初始化代碼塊中將驅動注冊到驅動程序管理器中。
(2)建立連接
conn=DriverManager.getConnection("jdbc:postgresql://localhost:5432/pgsqltest","postgres", "2016");
Connection連接是通過DriverManager的靜態方法getConnection(.....)來得到的,這個方法的實質是把參數傳到實際的Driver中的connect()方法中來獲得數據庫連接的。
postgreSQL URL的格式:
jdbc:postgresql:(協議)@XXX.XXX.X.XXX:XXXX(IP地址及端口號):XXXXXXX(所使用的庫名)
MySQL URL的寫法 例:jdbc:mysql://192.168.8.21:3306/test
(3)獲得Statement對象
Statement stmt = conn.createStatement();
(4)執行sql語句
stmt.executeQuery(String sql); //返回一個查詢結果集。
stmt.executeUpdate(String sql); //返回值為int型,表示影響記錄的條數。
將sql語句通過連接發送到數據庫中執行,以實現對數據庫的操作。
(5)處理結果集
使用Connection對象獲得一個Statement,Statement中的executeQuery(Stringsql) 方法可以使用select語句查詢,并且返回一個結果集。 ResultSet,通過遍歷這個結果集,可以獲得select語句的查尋結果,ResultSet的next()方法會操作一個游標從第一條記錄的前面開始讀取,直到最后一條記錄。
executeUpdate(String sql) 方法用于執行DDL和DML語句,比如可以update,delete操作。
只有執行select語句才有結果集返回。
Statement str=con.createStatement(); //創建Statement
String sql=”insert into test(id,name)values(1,”+”’”+”test”+”’”+”)”;
str. executeUpdate(sql);//執行Sql語句
String sql=”select * from test”;
ResultSet rs=str. executeQuery(String sql);//執行Sql語句,執行select語句后有結果集
//遍歷處理結果集信息
while(rs.next()){
System.out.println(rs.getInt(“id”));
System.out.println(rs.getString(“name”))
}
(6)關閉數據庫連接
rs.close();
stmt.close();
con.close();
ResultSet Statement Connection是依次依賴的。
注意:要按先ResultSet結果集,后Statement,最后Connection的順序關閉資源,因為Statement和ResultSet是需要連接時才可以使用的,所以在使用結束之后有可能其它的Statement還需要連接,所以不能現關閉Connection。
7、JDBC事務
事務的4大特性
(1) 原子性
事務的原子性指的是,事務中包含的程序作為數據庫的邏輯工作單位,它所做的對數據修改操作要么全部執行,要么完全不執行。
原子操作,也就是不可分割的操作,必須一起成功一起失敗。
(2) 一致性
事務的一致性指的是在一個事務執行之前和執行之后數據庫都必須處于一致性狀態。這種特性稱為事務的一致性。假如數據庫的狀態滿足所有的完整性約束,就說該數據庫是一致的。
(3) 分離性
分離性指并發的事務是相互隔離的。即一個事務內部的操作及正在操作的數據必須封鎖起來,不被其它企圖進行修改的事務看到。
(4) 持久性
持久性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失。即一旦一個事務提交,DBMS保證它對數據庫中數據的改變應該是永久性的,耐得住任何系統故障。持久性通過數據庫備份和恢復來保證。
---------------------
作者:流年你奈我何
來源:CSDN
原文:https://blog.csdn.net/jg15617651654/article/details/63262456
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
轉載于:https://www.cnblogs.com/TBhacker/p/10944777.html
總結
以上是生活随笔為你收集整理的转载:JDBC连接数据库教程,postgreSQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言strstr函数实现
- 下一篇: Mysql 学习笔记08