1 什麼是JDBC
jdbc的全稱是(Java Data Base Connectivity,java數據庫連接),其主要是由一些類和接口構成的API,它是J2SE的一部分,由java.sql,javax.sql包組成。是一種用於執行SQL語句的Java API,可以爲多種關係數據庫提供同一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,根據這種基準可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。
2 怎麼使用JDBC
JDBC鏈接數據庫的主要步驟:
1 註冊驅動
2 創建鏈接
3 創建能夠執行sql語句的statement等對象
4 執行語句
5 處理結果
6 釋放資源
註冊驅動的方式有三種:
Class.forName(“com.mysql.jdbc.Driver”);——將驅動類com.mysql.jdbc.Driver加載到虛擬機中。推薦這種方式,不會對具體的驅動類產生依賴。
DriverManager.registerDriver(com.mysql.jdbc.Driver);——會造成DriverManager中產生兩個一樣的驅動,並會對具體的驅動類產生依賴。
System.setProperty(“jdbc.drivers”, “driver1:driver2”);——雖然不會對具體的驅動類產生依賴,但註冊不太方便,所以很少使用。
建立連接:
Connection conn = DriverManager.getConnection(url, user, password);
url格式:
JDBC:子協議:子名稱//主機名:端口/數據庫名?屬性名=屬性值&…
user,password可以用“屬性名=屬性值”方式告訴數據庫。
其他參數如:useUnicode=true&characterEncoding=GBK(用於控制數據庫與應用程序之間的編碼,防亂碼)
釋放資源
釋放ResultSet, Statement,Connection。(一般都是進行close)
數據庫連接(Connection)是非常稀有的資源,用完後必須馬上釋放,如果Connection不能及時正確的關閉將導致系統宕機(?)。Connection的使用原則是儘量晚創建,儘量早的釋放。
還有很重要的是數據庫的事務
舉個例子
public void addStudent(String studentName, int studentAge, String studentPhone) throws Exception
{
Connection connection = DBConnection.mysqlConnection;
PreparedStatement ps = connection.prepareStatement("insert into student values(null,?,?,?)");
ps.setString(1, studentName);
ps.setInt(2, studentAge);
ps.setString(3, studentPhone);
if (ps.executeUpdate() > 0)
System.out.println("添加學生信息成功");
else
System.out.println("添加學生信息失敗");
}
public static void main(String[] args) throws Exception
{
StudentManager.getInstance().addStudent("Betty", 17, "55555555");
}
運行就不運行了,反正最後結果是”添加學生信息成功”,數據庫裏面多了一條數據。注意一下:
1、增刪改用的是executeUpdate()方法,因爲增刪改認爲都是對數據庫的更新
2、查詢用的是executeQuery()方法,看名字就知道了”Query”,查詢嘛
可能有人注意到一個問題,就是Java代碼在insert後並沒有對事物進行commit,數據就添加進數據庫了,也能查出來,這是爲什麼呢?因爲JDK的Connection設置了事物的自動提交。如果在addStudent(…)方法裏面這麼寫:
Connection connection = DBConnection.mysqlConnection;
connection.setAutoCommit(false);
這時就需要我們手動提交:
public void addStudent(String studentName, int studentAge, String studentPhone) throws Exception
{
Connection connection = DBConnection.mysqlConnection;
connection.setAutoCommit(false);
PreparedStatement ps = connection.prepareStatement("insert into student values(null,?,?,?)");
ps.setString(1, studentName);
ps.setInt(2, studentAge);
ps.setString(3, studentPhone);
try
{
ps.executeUpdate();
connection.commit();
}
catch (Exception e)
{
e.printStackTrace();
connection.rollback();
}
}