JDBC(Java ),即Java數據庫連接。簡而言之,就是通過Java語言來操作數據庫。
我們可以把JDBC理解成是官方定義的一套操作所有關系型數據庫的規則,規則即接口。
也就是說,官方定義了一套操作所有關系型數據庫的接口,然后讓各個數據廠商(Mysql、等)用實現類去實現這套接口,再把這些實現類打包(數據驅動jar包),并提供數據驅動jar包給我們使用。
我們可以使用這套JDBC接口進行編程,但是真正執行的代碼是驅動jar包中的實現類。
為什么?因為JDBC是通過接口來調用方法的c 創建數據庫連接,當你導入了驅動jar包(實現類)后,那調用的方法肯定是實現類里面的方法。
一、Mysql驅動包下載
想要通過JDBC連接并操作Mysql數據庫,我們需要下載一個Mysql數據庫驅動jar包。
兩種下載方式(點擊鏈接可直接前往下載)
方式一:官網下載
方式二:Maven倉庫下載
下載后的jar包是這樣的(我的版本是8.0.15):
系統:
mysql--java-8.0.15-bin.jar
Linux、Mac系統:
mysql--java-8.0.15.jar
二、JDBC實現步驟
前提: 創建一個Java項目,在項目中新建一個libs目錄(為了方便管理jar包,需要把jar包放在此目錄下),在src目錄下建一個包,包下再建一個類。
最終的目錄結構是這樣的:
注:把下載的jar包拷貝到項目的libs下,別忘了點擊libs→右鍵→Add as (這才是真正導入jar包)。
具體步驟:
1、導入驅動jar包 2、注冊驅動 3、獲取數據庫的連接對象 4、定義sql語句 5、獲取執行sql語句的對象 6、執行sql并接收返回結果 7、處理結果 8、釋放資源
實例:
package cn.tkr.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) throws Exception { //下面方法有不同的異常,我直接拋出一個大的異常
//1、導入驅動jar包
//2、注冊驅動
Class.forName("com.mysql.jdbc.Driver");
//3、獲取數據庫的連接對象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sys", "root", "123456789");
//4、定義sql語句
String sql = "update Student set score = 99 where id = '10003' ";
//5、獲取執行sql語句的對象
Statement stat = con.createStatement();
//6、執行sql并接收返回結果
int count = stat.executeUpdate(sql);
//7、處理結果
System.out.println(count);
//8、釋放資源
stat.close();
con.close();
}
}
運行結果:
代碼分析:
注冊驅動是為了讓程序知道,我們用的是哪個版本、哪個驅動包。
獲取數據庫的連接對象,我們可以把這個對象理解成是Java代碼與數據庫之間的橋梁,將兩者連接起來。
我們定義的sql語句,將來會通過一些操作發送給數據庫執行。從而達到Java代碼操作數據庫的目的。
由于是連接對象,無法直接執行。所以我們要通過con.()來獲取執行sql語句的對象
通過對象執行sql后,會返回一個int類型的數值,這個數值指的就是影響數據庫表的行數。
最后,要對返回的結果進行處理,并釋放資源(為了避免內存泄漏)
更新前的數據庫(sys),表中的數據:
更新操作SQL語句:
update Student set score = 99 where id = '10003'
更新后的數據庫(sys),表中的數據:
三、通過JDBC進行CRUD操作實例
在上面的實例代碼中,其實還存在一個問題,如果代碼在執行過程中出現異常(如:找不到數據庫,密碼錯誤,sql語法錯誤等)c 創建數據庫連接,就無法正常釋放資源了。
那為了解決這個問題,我們不再直接拋出異常,而是使用try-catch-來處理異常,把釋放資源的代碼放到代碼塊中,這就保證了不管有沒有出現異常,都能正常釋放資源。
同時,也為了避免出現空指針異常,在進行釋放資源前需要通過條件語句進行判斷。
下面的這幾個CRUD操作實例,我都會針對以上問題進行代碼優化。
在演示操作實例之前,我們需要知道一下,執行sql語句的方法有哪些?
| 返回值類型 | 方法名 | 描述 | |--|--|--| | | (Strng sql) | 可以執行任意的sql語句 | | int | (Strng sql) | 可以執行DML(、、)語句,DDL(、alter、drop)語句 | | | () | 可以執行DQL()語句 |
1、添加(插入)一條記錄
實例:
package cn.tkr.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) { //下面方法有不同的異常,我直接拋出一個大的異常
Connection con = null;
Statement stat = null;
try{
//1、注冊驅動
Class.forName("com.mysql.jdbc.Driver");
//2、獲取數據庫的連接對象
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sys", "root", "123456789");
//3、定義sql語句
String sql = "insert into Student value('10004','李白',21,59)";
//4、獲取執行sql語句的對象
stat = con.createStatement();
//5、執行sql并接收返回結果
int count = stat.executeUpdate(sql);
//6、處理結果
System.out.println(count);
}catch (Exception e){
e.printStackTrace();
}finally {
if (con != null){ //避免空指針異常

//7、釋放資源
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat != null){ //避免空指針異常
//7、釋放資源
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
執行的sql語句:
insert into Student value('10004','李白',21,59)
添加記錄后,表中的數據:
2、修改(更新)一條記錄
替換上述實例代碼中執行的sql語句:
update Student set age = 20,score = 100 where id = '10002'
修改記錄后,表中的數據:
3、刪除一條記錄
替換上述實例代碼中執行的sql語句:
delete from Student where id = '10001'
刪除記錄后,表中的數據:
4、查詢表中的數據
實例:
package cn.tkr.jdbc;
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) { //下面方法有不同的異常,我直接拋出一個大的異常
Connection con = null;
Statement stat = null;
ResultSet rs = null;
try{
//1、注冊驅動
Class.forName("com.mysql.jdbc.Driver");
//2、獲取數據庫的連接對象
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sys", "root", "123456789");
//3、定義sql語句
String sql = "select * from Student";
//4、獲取執行sql語句的對象
stat = con.createStatement();

//5、執行sql并接收返回結果
rs = stat.executeQuery(sql);
//6、處理結果
while (rs.next()){ //循環一次,游標移動一行
System.out.println("id:" + rs.getString(1)); // 獲取第一列的數據
System.out.println("name:" + rs.getString("name")); //獲取字段為name的數據
System.out.println("age:" + rs.getInt(3)); // 獲取第三列的數據
System.out.println("score:" + rs.getInt(4)); // 獲取第四列的數據
System.out.println("-------------------");
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (con != null){ //避免空指針異常
//7、釋放資源
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat != null){ //避免空指針異常
//7、釋放資源
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs != null){ //避免空指針異常
//7、釋放資源
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
運行結果:
id:10002
name:李四
age:20
score:100
-------------------
id:10003
name:王五
age:18
score:99
-------------------
id:10004
name:李白
age:21

score:59
-------------------
四、使用Druid優化JDBC
1、Druid簡介與功能
Druid是目前最好的數據庫連接池實現技術。在功能、性能、擴展性方面,都是非常強大的。
Druid是一個JDBC組件,基于-Chain模式的插件體系、 高效可管理的數據庫連接池、等。
Druid的功能:
Druid提供了一個高效、功能強大、可擴展性好的數據庫連接池。
可以擴展JDBC,如果你要對JDBC層有編程的需求,可以通過Druid提供的機制,很方便編寫JDBC層的擴展插件。
還可以監控數據庫的訪問性能,Druid內置提供了一個功能強大的插件,能夠詳細統計SQL的執行性能。
SQL執行日志,Druid提供了多種,能夠支持、、Log4j和,你可以按需要選擇相應的,來監控應用的數據庫訪問情況。
2、Druid如何優化JDBC
JDBC連接數據庫,主要步驟是注冊驅動、獲取數據庫的連接對象、定義sql語句、獲取執行sql語句的對象、執行sql并接收返回結果、處理結果、釋放資源。
那如果有很多個用戶訪問數據庫,那是不是要多次注冊驅動、多次建立連接。
由于建立數據庫連接本身就是一個非常耗時、耗資源的行為。
所以我們需要通過連接池預先同數據庫建立一些連接,并放在內存中。
當應用程序需要建立數據庫連接時,可以直接到連接池中申請一個,用完后再放回去。
這樣極大的提高了數據庫連接的性能問題,節省了資源和時間。
3、下載Druid所需要的jar包
我們需要兩個jar包:
(1)druid-1.1.12.jar
(2)mysql--java-8.0.15.jar
下載方式:Maven倉庫下載
4、Druid實例
創建一個Java項目,我自己創建的項目名是,在項目下創建一個libs目錄,用來放Druid所需要的jar包。
放這兩個包,一個都不能少:
druid-1.1.12.jar
mysql--java-8.0.15.jar
詳細步驟:
1、把剛才下載的druid-1.1.12.jar和mysql--java-8.0.15.jar,拷貝到libs目錄中,拷貝完別忘了
libs→右鍵→Add as ...
2、定義配置文件,文件是形式的,可以叫任意名稱,可以放在任意目錄下(我這邊放在src目錄下)。
Druid.文件內容:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/sys
username=root
password=123456789
initialSize=5
maxActive=10
maxWait=3000
等號右邊的值必須用自己的,具體格式如下:
=com.mysql.jdbc.
Mysql驅動都是這樣寫,如果你沒導入mysql--java-8.0.15.jar,就算寫了,等下執行程序還是會報錯的,會提示找不到驅動類。
url=jdbc:mysql://IP地址:端口號/數據庫名
比如,我用的是Mysql數據庫,sys是我創建的一個數據庫。如果用的是本地的數據庫,可以省略IP地址和端口號,比如這樣:url=jdbc:mysql:///sys
=數據庫用戶名
我的用戶名是root,一般默認都是root。
=密碼
=初始化連接數量
=最大連接數
=最大等待時間(單位毫秒)
初始化連接數量、最大連接數、最大等待時間都是可以自己定義的。
3、隨便創建一個包,再隨便創建一個類,然后就開始寫代碼了。
第一步,加載配置文件Druid.。
第二步、獲取數據庫連接池對象,通過工廠來獲取 ry。
最后,獲取連接,然后就可以進行數據庫相關操作了。
類的代碼:
package cn.tkr.datasource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Statement;
import java.util.Properties;
public class DruidDemo {
public static void main(String[] args) throws Exception {
//1、導入jar包
//2、定義配置文件
//3、加載配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("Druid.properties");
pro.load(is);
//4、獲取數據庫連接池對象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5、獲取連接
Connection con = ds.getConnection();
/*
* 6、數據庫相關操作
*/
//定義sql語句
String sql = "update Student set id = '66666' where name = '李白'";
//獲取執行sql的對象
Statement statement = con.createStatement();
//執行sql
int pwd = statement.executeUpdate(sql);
//處理結果
System.out.println(pwd);
//釋放資源
statement.close();
con.close();
}
}
操作前,表中的數據:
執行的sql語句:
update Student set id = '66666' where name = '李白'"
操作后,表中的數據:
Druid實例Java項目參考圖;
這只是一個簡單的實例。實際項目的開發過程中,并不是寫在主函數里面。
我們一般會定義一個工具類(),在類中提供靜態代碼塊加載配置文件,初始化連接池對象。
提供獲取連接方法(通過數據庫連接池獲取連接)、釋放資源、獲取連接池的方法。
五、總結
以上是我分享給大家的關于JDBC連接并操作Mysql數據庫以及Druid優化JDBC的一些總結。