JDBC和連接池01 1.JDBC概述 基本介紹 JDBC為訪問不同的資料庫提供了同一的介面,為使用者屏蔽了細節問題 Java程式員使用JDBC,可以連接任何提供了jdbc驅動程式的資料庫系統,從而完成對資料庫的各種操作 jdbc原理圖 JDBC是java提供的一套用於資料庫操作的介面API,Jav ...
JDBC和連接池01
1.JDBC概述
- 基本介紹
- JDBC為訪問不同的資料庫提供了同一的介面,為使用者屏蔽了細節問題
- Java程式員使用JDBC,可以連接任何提供了jdbc驅動程式的資料庫系統,從而完成對資料庫的各種操作
-
jdbc原理圖
JDBC是java提供的一套用於資料庫操作的介面API,Java程式員只需要面向這套介面編程即可。不同的資料庫廠商需要針對這套介面,提供不同的實現。
jdbc模擬實現
模擬JDBC驅動:
package jdbc.myjdbc;
/**
* 我們規定的jdbc介面(方法)規範
*/
public interface JdbcInterface {
//連接
public Object getConnection();
//crud
public void crud();
//關閉連接
public void close();
}
模擬Mysql驅動:
package jdbc.myjdbc;
/**
* 模擬 mysql資料庫實現jdbc介面[由mysql廠商開發]
*/
public class MysqlJdbcImpl implements JdbcInterface{
@Override
public Object getConnection() {
System.out.println("得到 mysql 的連接");
return null;
}
@Override
public void crud() {
System.out.println("完成 mysql 的增刪改查");
}
@Override
public void close() {
System.out.println("關閉 mysql 的連接");
}
}
模擬Oracle驅動:
package jdbc.myjdbc;
/**
* 模擬實現oracle的連接驅動-即實現規範介面
*/
public class OracleJdbcImpl implements JdbcInterface{
@Override
public Object getConnection() {
System.out.println("得到 oracle 的連接");
return null;
}
@Override
public void crud() {
System.out.println("完成 oracle 的增刪改查");
}
@Override
public void close() {
System.out.println("關閉 oracle 的連接");
}
}
模擬java程式使用各種資料庫驅動連接資料庫:
package jdbc.myjdbc;
public class TestJdbc {
public static void main(String[] args) {
//完成mysql的操作
JdbcInterface jdbcInterface = new MysqlJdbcImpl();
jdbcInterface.getConnection();// 通過介面來調用實現類[動態綁定]
jdbcInterface.crud();
jdbcInterface.close();
System.out.println("==============");
//完成oracle的操作
jdbcInterface = new OracleJdbcImpl();
jdbcInterface.getConnection();// 通過介面來調用實現類[動態綁定]
jdbcInterface.crud();
jdbcInterface.close();
}
}
- JDBC API
jdbc api是一系列的介面,它統一和規範了應用程式與資料庫的連接、執行SQL語句,並得到返回結果等各類操作,相關類和介面在java.sql與javax.sql包中。
2.JDBC快速入門
2.1JDBC程式編寫步驟
-
註冊驅動 -- 載入Driver類
-
獲取連接 -- 得到Connection
-
執行增刪改查 -- 發送SQL命令給mysql執行
-
釋放資源 -- 關閉相關連接
例子--通過jdbc對錶actor進行添加,刪除和修改操作
- 首先在SQL yog使用mysql資料庫創建一個演員actor表
-- 創建測試表 演員表
CREATE TABLE actor(
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL DEFAULT '',
sex CHAR(1) NOT NULL DEFAULT '女',
borndate DATETIME,
phone VARCHAR(12)
);
SELECT * FROM actor;
- 下載mysql連接驅動
-
在項目中創建libs文件夾,將驅動複製進文件夾中,右鍵點擊驅動,選擇ad as library
-
在彈出的視窗中點擊OK,即可
package li.jdbc;
import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* 這是第一個jdbc程式,完成簡單的操作
*/
public class jdbc01 {
public static void main(String[] args) throws SQLException {
//前置工作:在項目下創建一個文件夾如 libs
//將mysql.jar拷貝到該目錄下,點擊add to project.. 加入到項目中
//1.註冊驅動
Driver driver = new Driver();//創建一個driver對象
//2.得到連接
/**
* jdbc:mysql:// 是規定好的協議,表示通過jdbc的方式來連接mysql
* localhost 表示要連接到的主機ip地址
* 3306 表示mysql監聽的埠
* hsp_db02 表示連接到 mysql DBMS的哪個資料庫
*/
// mysql的連接本質就是socket的連接
String url = "jdbc:mysql://localhost:3306/hsp_db02";
//將用戶名和密碼放入到一個Properties對象中
Properties properties = new Properties();
// user 和 password 是規定好的,後面的值根據實際情況寫
properties.setProperty("user", "root");//用戶
properties.setProperty("password", "123456");//密碼
Connection connect = driver.connect(url, properties);
//3.執行sql
String sql = "insert into actor values(null,'劉德華','男','1970-11-11','110')";
//String sql = "update actor set name ='周星馳' where id = 1 ";
//String sql = "delete from actor where id = 1 ";
//Statement 用於執行靜態SQL語句並返回其生成的結果的對象
Statement statement = connect.createStatement();
int rows = statement.executeUpdate(sql);//如果是dml語句,返回的就是影響的行數
System.out.println(rows > 0 ? "成功" : "失敗");
//4.關閉連接資源
statement.close();
connect.close();
}
}
在SQL yog中執行語句查詢,發現actor表中成功插入一條數據
2.2資料庫連接的5種方式
2.2.1方式1
//獲取Driver實現類對象
Driver driver = new com.mysql.jdbc.Driver();
String url = "jdbc:mysql://localhost:3306/jdbc_db";
Properties info = new Properties();
info.setProperty("user", "root");//用戶
info.setProperty("password", "123456");//密碼
Connection conn = driver.connect(url,info);
System.out.println(conn);
2.2.2方式2
方式1會直接使用com.mysql.jdbc.Driver()
,屬於靜態載入,靈活性差,依賴性強
方式2使用反射機制進行動態載入,而且信息可以放入配置文件中保存,更利於項目的控制
例子
package li.jdbc;
//分析java連接mysql的5種方式
import com.mysql.jdbc.Driver;
import org.junit.Test;
import java.sql.Connection;
import java.util.Properties;
public class jdbcConn {
//方式2
@Test
public void connect02() throws Exception {
//使用反射載入Driver類,動態載入,更加地靈活,減少依賴性
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver)aClass.newInstance();
String url = "jdbc:mysql://localhost:3306/hsp_db02";
//將 用戶名和密碼 放入到 Properties對象中
Properties properties = new Properties();
// user 和 password 是規定好的,後面的值根據實際情況寫
properties.setProperty("user", "root");//用戶
properties.setProperty("password", "123456");//密碼
Connection connect = driver.connect(url, properties);
System.out.println("方式2="+connect);
}
}
2.2.3方式3
在方式2的基礎上使用DriverManager替換Driver
例子
package li.jdbc;
import com.mysql.jdbc.Driver;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
public class jdbcConn {
//方式3 使用DriverManager替換Driver進行統一管理
@Test
public void connect03() throws Exception {
//使用反射載入Driver類
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver)aClass.newInstance();
//創建 url和 user 和 password
String url = "jdbc:mysql://localhost:3306/hsp_db02";
String user = "root";
String password = "123456";
DriverManager.registerDriver(driver);//註冊Driver驅動
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("方式3="+connection);
}
}
2.2.4方式4
使用Class.forName自動完成註冊驅動,簡化代碼
例子
//方式4 使用Class.forName自動完成註冊驅動,簡化代碼
// 這種方式獲取連接是使用得最多的,推薦使用
@Test
public void connect04() throws Exception {
//使用反射載入Driver類
//在載入Driver類時,完成了註冊
/**
* 在 Driver類的源碼中:
* 1.靜態代碼塊在類載入時會執行一次
* 2.DriverManager.registerDriver(new Driver());
* 3.因此 註冊Driver的工作已經在底層完成了
* static {
* try {
* DriverManager.registerDriver(new Driver());
* } catch (SQLException var1) {
* throw new RuntimeException("Can't register driver!");
* }
* }
*/
Class.forName("com.mysql.jdbc.Driver");
//創建 url和 user 和 password
String url = "jdbc:mysql://localhost:3306/hsp_db02";
String user = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("方式4="+connection);
}
方法4相比於方法3,減少了註冊驅動的操作,但是連接資料庫的步驟不是需要註冊驅動嗎?為什麼可以這樣呢?
在Driver類的源碼中,我們可以看到有這樣的一個靜態代碼塊:
而靜態代碼塊在類載入時會執行一次,在使用反射載入Driver類時,就執行了DriverManager.registerDriver(new Driver());
語句。
即在載入Driver類時,完成了註冊。因此,可以在程式中省略註冊的步驟。
註意:
-
mysql驅動5.1.6之後連
Class.forName("com.mysql.jdbc.Driver");
也不需要寫了 -
從jdk1.5以後使用了jdbc4,不再需要顯式調用Class.forName()註冊驅動,而是自動調用驅動jar包下的
META-INF\services\java.sql.Driver
文本中的類名稱去註冊 -
但是還是建議寫上
Class.forName("com.mysql.jdbc.Driver");
,更加明確
2.2.5方式5
在方式4的基礎上使用配置文件,連接資料庫更加靈活
例子
首先在src文件夾下麵創建一個Properties文件
user=root
password=123456
url=jdbc:mysql://localhost:3306/hsp_db02
driver=com.mysql.jdbc.Driver
方式5:推薦使用
//方式5 在方式4的基礎上使用配置文件,連接資料庫更加靈活
@Test
public void connect05() throws Exception {
//通過Properties對象拿到配置文件的信息
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
//獲取相關的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver");
Class.forName(driver);//建議寫上
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("方式5="+connection);
}