如何讓單位網(wǎng)站做防護十句經(jīng)典廣告語
目錄
1.數(shù)據(jù)庫編程的必備條件
2.Java的數(shù)據(jù)庫編程JDBC
?3.JDBC的工作原理
4.第三方庫connector的下載和導(dǎo)包
5.JDBC的使用
使用步驟
?(1)創(chuàng)建數(shù)據(jù)源對象DataSource
(2)給對象設(shè)置必要的屬性
(3)和數(shù)據(jù)庫建立網(wǎng)絡(luò)連接
(4)程序構(gòu)造sql語句
(5)將sql語句傳到服務(wù)器上執(zhí)行
(6)釋放上述資源
優(yōu)化
整體代碼
?具體操作
6.JDBC常用接口和類
(1)JDBC API
(2)數(shù)據(jù)庫連接Connection
(2)Statement對象
1.數(shù)據(jù)庫編程的必備條件
- 編程語言,如Java,C、C++、Python等
- 數(shù)據(jù)庫,如Oracle,MySQL,SQL Server等
- 數(shù)據(jù)庫驅(qū)動包:不同的數(shù)據(jù)庫,對應(yīng)不同的編程語言提供了不同的數(shù)據(jù)庫驅(qū)動包,如:MySQL提 供了Java的驅(qū)動包mysql-connector-java,需要基于Java操作MySQL即需要該驅(qū)動包。同樣的, 要基于Java操作Oracle數(shù)據(jù)庫則需要Oracle的數(shù)據(jù)庫驅(qū)動包ojdbc。
2.Java的數(shù)據(jù)庫編程JDBC
JDBC,即Java Database Connectivity,java數(shù)據(jù)庫連接。是一種用于執(zhí)行SQL語句的Java API,它是 Java中的數(shù)據(jù)庫連接規(guī)范。這個API由 java.sql.*,javax.sql.* 包中的一些類和接口組成,它為Java 開發(fā)人員操作數(shù)據(jù)庫提供了一個標準的API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問。 ?
?3.JDBC的工作原理
JDBC 為多種關(guān)系數(shù)據(jù)庫提供了統(tǒng)一訪問方式,作為特定廠商數(shù)據(jù)庫訪問API的一種高級抽象,它主要包 含一些通用的接口類。
JDBC訪問數(shù)據(jù)庫層次結(jié)構(gòu):
JDBC優(yōu)勢:
- Java語言訪問數(shù)據(jù)庫操作完全面向抽象接口編程
- 開發(fā)數(shù)據(jù)庫應(yīng)用不用限定在特定數(shù)據(jù)庫廠商的API
- 程序的可移植性大大增強
4.第三方庫connector的下載和導(dǎo)包
下載
這里提供一個最為簡單的下載方法:去maven中央倉庫下載?
- 鏈接:
看自己的數(shù)據(jù)庫的版本情況來下載(點擊Central下載即可)對應(yīng)的版本(經(jīng)典版最高是8.0,更高的版本在最新版中)
注:MySQL的版本必須和connector的版本一致
導(dǎo)包
- 下載好 .jar 包
- 把 .jar導(dǎo)入到自己的Java項目中
先在項目中創(chuàng)建一個目錄.名字隨便起,但是不要帶有中文/特殊字符
把下載好的jar包,拷貝到lib目錄中
右鍵剛才的lib目錄, 點擊add as library(告訴idea,這個lib目錄是一個"庫"目錄)
5.JDBC的使用
使用步驟
?(1)創(chuàng)建數(shù)據(jù)源對象DataSource
(描述當前數(shù)據(jù)從哪來即數(shù)據(jù)庫服務(wù)器所在的位置)
通過原碼我們可以看到DataSourse是被interface修飾的類,不能用來直接實例化該對象,因此我們只能實例化它的子類MysqlDataSourceDataSource dataSource = new MysqlDataSource();
DataSourse:Java標準庫JDBC自帶的接口
MysqlDataSource:剛剛導(dǎo)入的 .jar包(2)給對象設(shè)置必要的屬性
1)數(shù)據(jù)庫服務(wù)器在哪里? ?2)訪問服務(wù)器的賬戶是啥? ? ?3)訪問服務(wù)器的密碼是啥//第一種寫法 DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource) dataSource).setUser("root"); ((MysqlDataSource) dataSource).setPassword("jqka");//第二種寫法 MysqlDataSource mysqlDataSource = new MysqlDataSource(); mysqlDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/java112?characterEncoding=utf8&useSSL=false"); mysqlDataSource.setUser("root"); mysqlDataSource.setPassword("jqka");
第一種寫法的好處:耦合程度更低
按照第一種寫法,后續(xù)代碼中如果再使用DataSource這個東西,是看不到"MysqlDataSource"這個信息的.
就使得后續(xù)的其他部分代碼和“mysql"這個概念解耦合了.后面的代碼,和啥數(shù)據(jù)庫沒關(guān)系.如果要更換數(shù)據(jù)庫,此時代碼修改的成本就比較低說明:
Url
jdbc:mysql: 描述了url的用途是用來給jdbc的mysql使用的 127.0.0.1: IP地址.描述了mysql服務(wù)器所在的主機的位置. 3306:端口號,用來區(qū)分一個主機上的應(yīng)用程序的. java112?characterEncoding=utf8:數(shù)據(jù)庫名和字符集 useSSL=false:額外的參數(shù)起到了針對這次的數(shù)據(jù)庫連接,解釋說明,這里表示關(guān)閉加密User
root就是DBA權(quán)限最高賬戶管理員Password
jqka即自己數(shù)據(jù)庫的密碼(3)和數(shù)據(jù)庫建立網(wǎng)絡(luò)連接
受查異常,所以要向上進行拋異常
//2.和數(shù)據(jù)庫服務(wù)器建立連接 Connection connection = dataSource.getConnection(); System.out.println(connection);
此處的Connection 對象,就是表示了一個數(shù)據(jù)庫連接,
注意:這里必須選擇sql的Connection
(4)程序構(gòu)造sql語句
我們之前在cmd敲的sql,是把 sql發(fā)送到mysql服務(wù)器mysql服務(wù)器負責解板,解析完成之后,執(zhí)行.解析檢查sql是否有語法錯誤具體要完成什么工作.....
解析工作,需要消耗系統(tǒng)資源
由于mysql服務(wù)器,同一時刻可能要同時給多個客戶端提供服務(wù).解析工作積少成多,也就會比較消耗資源因此往往就可以把解析工作,放到客戶端來完成(自己寫的代碼)
客戶端發(fā)送sql之前,先解析好,先把一些能做的工作做好,這樣服務(wù)器就可以降低一些工作量,減輕壓力了構(gòu)造方法有很多種,這里我們使用最主流的PreparedStatement預(yù)編譯語句來完成這一操作
//4.程序構(gòu)造MySQL語句 String sql = "create table test(id int,name varchar(20))"; PreparedStatement statement = connection.prepareStatement(sql);
(5)將sql語句傳到服務(wù)器上執(zhí)行
statement.executeUpdate();的返回值表示影響了幾行數(shù)據(jù)
(6)釋放上述資源
//5.釋放上述資源 statement.close(); connection.close();
說明:釋放資源的順序,要和創(chuàng)建資源的順序相反
建立連接/創(chuàng)建語句的時候,就需要消耗一定的內(nèi)存/硬盤/網(wǎng)絡(luò)籌資源....這些資源,都是跟隨這個連接來走的.
如果連接不再使用了,就需要把這些資源釋放掉.
優(yōu)化
此時我們還可以使用Scanner自定義讓用戶輸入數(shù)據(jù)
?Scanner scanner = new Scanner(System.in); System.out.println("請輸入id: "); int id = scanner.nextInt(); System.out.println("請輸入name: "); String name = scanner.next();
在我們輸入的時候可以使用占位符來進行操作避免出現(xiàn)多個引號的情況
String sql = "insert into student values(?,?)"; PreparedStatement statement = connection.prepareStatement(sql); statement.setInt(1,id); statement.setString(2,name);
注意:
替換時下標是從1開始的
整體代碼
package jdbc;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;public class TestJDBC1 {public static void main(String[] args) throws SQLException {Scanner scanner = new Scanner(System.in);System.out.println("請輸入id: ");int id = scanner.nextInt();System.out.println("請輸入name: ");String name = scanner.next();//1.創(chuàng)建數(shù)據(jù)源對象//向下轉(zhuǎn)型,DataSourceDataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("jqka");/*MysqlDataSource mysqlDataSource = new MysqlDataSource();mysqlDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/java112?characterEncoding=utf8&useSSL=false");mysqlDataSource.setUser("root");mysqlDataSource.setPassword("jqka");*///2.和數(shù)據(jù)庫服務(wù)器建立連接Connection connection = dataSource.getConnection();//3.程序構(gòu)造MySQL語句//String sql = "insert into student values(2,'李四')";String sql = "insert into student values(?,?)";PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1,id);statement.setString(2,name);//4.把sql語句傳到服務(wù)器上執(zhí)行int n = statement.executeUpdate();System.out.println(n);//5.釋放上述資源statement.close();connection.close();}
}
?具體操作
插入刪除修改操作都是相似的,改語句內(nèi)容即可
//插入數(shù)據(jù)
String sql = "insert into student values(2,'李四')";
//刪除id = 1的數(shù)據(jù)
String sql = "delete from student where id = 1";
//修改id = 2的name為張三
String sql = "update student set name = '張三' where id = 2";//傳送sql語句到服務(wù)器上
int n = statement.executeUpdate();
select操作有所差異
- statement對象使用的方法為executeQuery()
- 使用該方法后返回的結(jié)果是一個結(jié)果集,需要用ResultSet來接收
- ResultSet需要單獨進行釋放
//查表
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);//接受的是一個結(jié)果集合
ResultSet resultSet = statement.executeQuery();//遍歷
while (resultSet.next()) {System.out.println(resultSet.getInt("id"));System.out.println(resultSet.getString("name"));
}resultSet.close();
說明:通過ResultSet表示查詢結(jié)果的臨時表~~
代碼中使用的時候可以當做"集合類"來使用,可以進行遍歷
?
總結(jié)兩種執(zhí)行SQL的方法
executeQuery() 方法執(zhí)行后返回單個結(jié)果集的,通常用于select語句
executeUpdate()方法返回值是一個整數(shù),指示受影響的行數(shù),通常用于update、insert、delete 語句
6.JDBC常用接口和類
(1)JDBC API
在Java JDBC編程中對數(shù)據(jù)庫的操作均使用JDK自帶的API統(tǒng)一處理,通常與特定數(shù)據(jù)庫的驅(qū)動類是完全 解耦的。所以掌握Java JDBC API (位于 java.sql 包下) 即可掌握Java數(shù)據(jù)庫編程。
(2)數(shù)據(jù)庫連接Connection
Connection接口實現(xiàn)類由數(shù)據(jù)庫提供,獲取Connection對象通常有兩種方式:
- 通過DriverManager(驅(qū)動管理類)的靜態(tài)方法獲取:
// 加載JDBC驅(qū)動程序 Class.forName("com.mysql.jdbc.Driver"); // 創(chuàng)建數(shù)據(jù)庫連接 Connection connection = DriverManager.getConnection(url);
一種是通過DataSource(數(shù)據(jù)源)對象獲取。實際應(yīng)用中會使用DataSource對象。
?DataSource ds = new MysqlDataSource(); ((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test"); ((MysqlDataSource) ds).setUser("root"); ((MysqlDataSource) ds).setPassword("jqka"); Connection connection = ds.getConnection();
區(qū)別:
1. DriverManager類來獲取的Connection連接,是無法重復(fù)利用的,每次使用完以后釋放資源 時,通過connection.close()都是關(guān)閉物理連接。
2. DataSource提供連接池的支持。連接池在初始化時將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接,這些連接 是可以復(fù)用的,每次使用完數(shù)據(jù)庫連接,釋放資源調(diào)用connection.close()都是將 Conncetion連接對象回收。
(2)Statement對象
Statement對象主要是將SQL語句發(fā)送到數(shù)據(jù)庫中。JDBC API中主要提供了三種Statement對象。
實際開發(fā)中最常用的是PreparedStatement對象: