JDBC(Java DataBase Connectivity,java資料庫連接)是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。JDBC提供了一種基準,據此可以構建更高級的工具和介面,使資料庫開發人員能夠編寫資料庫應用程式, ...
JDBC(Java DataBase Connectivity,java資料庫連接)是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。JDBC提供了一種基準,據此可以構建更高級的工具和介面,使資料庫開發人員能夠編寫資料庫應用程式,同時,JDBC也是個商標名。
一、Java連接資料庫示例:
1、步驟:
- 導jar包:驅動。
- 載入驅動類:Class.forName("類名");
- 給出url、username、password,其中url背下來。
- 使用DriverManager類來得到Connection對象。
1 public class Demo1 {
2 /**
3 * ClassNotFoundException:
4 * 沒有導入驅動包
5 *
6 * SQLException:
7 * 檢查三個參數:url、username、password是否正確
8 * 檢查是否開啟了mysql伺服器。
9 *
10 */
11 @Test
12 public void fun1() throws ClassNotFoundException,SQLException{
13 /**
14 * jdbc四大配置參數
15 * driverClassName:com.mysql.jdbc.Driver
16 * url:jdbc:mysql://localhost:3306/資料庫名
17 * username:root
18 * password:
19 */
20 Class.forName("com.mysql.jdbc.Driver");//載入驅動類(註冊驅動)
21
22 //使用url、username、password,得到連接對象
23 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb_1","root","");
24 System.out.println(con);
25 }
26 }
2、基本異常
未導驅動包:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver ;
資料庫不存在:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'mydb';
埠錯誤:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure;
密碼錯誤:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES);
用戶不存在:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES);
二、JDBC原理
Class.forName("com.mysql.jdbc.Driver");//此據等同於以下麵兩句,與最後一句的邏輯關係
com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver;
DriverManager.registerDriver(driver);
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb_1","root","");
所有的java.sql.Driver實現類,都提供了static塊,塊內的代碼就是把自己註冊到DriverManage中,如com.mysql.jdbc.Driver中的部分源碼:
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
/**
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
JDBC 4.0之後,每個驅動jar包中,在META-INF/services目錄下提供了一個名為java.sql.Driver的文件,文件的內容就是該介面的實現類名稱。連接資料庫例子中,第20行“Class.forName("com.mysql.jdbc.Driver");”可省略不寫。
三、使用JDBC對資料庫進行簡單的增刪改查操作示例
1 package demo2;
2
3 import org.junit.Test;
4 import java.sql.*;
5
6 public class Demo2 {
7 /*
8 * 對資料庫進行增、刪、改操作
9 * */
10 @Test
11 public void fun1() throws ClassNotFoundException,SQLException {
12 /*
13 * 一、得到Connection
14 * 1、準備四個參數
15 * 2、載入驅動類
16 * 3、得到Connection
17 * */
18
19 String driverClassName = "com.mysql.jdbc.Driver";
20 //jdbc協議的格式,jdbc:工商的名稱:子協議(由工商自己來規定)
21 //對mysql而言,它的子協議結構://主機:埠號/資料庫名稱
22 String url = "jdbc:mysql://localhost:3306/mydb1";
23 String username = "root";
24 String password = "";
25 //載入驅動類
26 Class.forName(driverClassName);
27 //使用DriverManager,以及剩下的三個參數,得到Connection
28 Connection con = DriverManager.getConnection(url, username, password);
29 /*
30 * 二、對資料庫做增刪改
31 *1、通過Connection對象創建Statement
32 * Statement 語句的發送器,它的功能就是向資料庫發送sql語句,
33 *2、調用它的int executeUpdate(String sql),它可以發送DML、DDL
34 * */
35 Statement stmt = con.createStatement();
36 // String sql = "INSERT INTO stu VALUES('0003','wangwu',88,'male')";
37 // String sql = "UPDATE stu SET name='zhaoliu',age=22,gender='female' WHERE " +
38 // "number='0003'";
39 String sql = "DELETE FROM stu";
40 int r = stmt.executeUpdate(sql);
41 System.out.println(r);
42 }
43 /*
44 * 執行查詢操作
45 * */
46 @Test
47 public void fun2() throws ClassNotFoundException,SQLException {
48
49 /*
50 * 一、得到Connection
51 * 二、得到Statement,發送select語句
52 * 三、對查詢返回的"表格"進行解析
53 * */
54 /*
55 * 一、得到連接
56 * */
57 String driverClassName = "com.mysql.jdbc.Driver";
58 String url = "jdbc:mysql://localhost:3306/mydb1";
59 String username = "root";
60 String password = "";
61
62 Class.forName(driverClassName);
63 Connection con = DriverManager.getConnection(url,username,password);
64 /*
65 * 二、得到Statement,執行select語句
66 * */
67 Statement stmt = con.createStatement();
68 /*
69 *調用Statement的ResultSet rs = executeQuery(String querySql);
70 * */
71 ResultSet rs = stmt.executeQuery("SELECT * FROM emp");
72 /*
73 * 三、解析ResultSet
74 * 1、把行游標移動到第一行,可以調用next()方法完成。
75 * */
76 while (rs.next()) { //把游標向下移動一行,並判斷下一行是否存在
77 int empno = rs.getInt(1);//通過列編號來獲取該列的值
78 String ename = rs.getString("ename");//通過列名稱來獲取該列的值
79 double sal = rs.getDouble("sal");
80
81 System.out.println(empno+","+ename+","+sal);
82 }
83 /*
84 * 四、關閉資源
85 * 倒關
86 * */
87 rs.close();
88 stmt.close();
89 con.close();//必須關,不關就死。
90 }
91 //規範化
92 @Test
93 public void fun3() throws Exception {
94 Connection con = null;//定義引用
95 Statement stmt = null;
96 ResultSet rs = null;
97 try {
98 //一、得到Connection
99 String driverClassName = "com.mysql.jdbc.Driver";
100 String url = "jdbc:mysql://localhost:3306/mydb1";
101 String username = "root";
102 String password = "";
103 Class.forName(driverClassName);
104 con = DriverManager.getConnection(url,username,password);//實例化
105 //二、創建Statement
106 stmt = con.createStatement();
107 String sql = "SELECT * FROM emp";
108 rs = stmt.executeQuery(sql);//實例化
109 //三、迴圈遍歷rs,列印其中數據
110 //getString()和getObject()是通用的
111 int count = rs.getMetaData().getColumnCount();
112 while (rs.next()) {
113 for (int i = 1; i <= count; i++) {
114 System.out.print(rs.getString(i));
115 if (i<count) {
116 System.out.print(",");
117 }
118 }
119 System.out.println();
120 }
121
122 } catch (Exception e) {
123 throw new RuntimeException(e);
124 } finally {
125 //為了防止空指針異常發生,使用判斷語句
126 if(rs != null) rs.close();
127 if(stmt != null) stmt.close();
128 if(con != null) con.close();
129 }
130 }
131 }