一、JDBC概述
JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。是Java訪問數(shù)據(jù)庫的標準規(guī)范
JDBC提供了一種基準,據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。
JDBC需要連接驅(qū)動,驅(qū)動是兩個設(shè)備要進行通信,滿足一定通信數(shù)據(jù)格式,數(shù)據(jù)格式由設(shè)備提供商規(guī)定,設(shè)備提供商為設(shè)備提供驅(qū)動軟件,通過軟件可以與該設(shè)備進行通信。
Java提供訪問數(shù)據(jù)庫規(guī)范稱為JDBC,而生產(chǎn)廠商提供規(guī)范的實現(xiàn)類稱為驅(qū)動。JDBC是接口,驅(qū)動是接口的實現(xiàn),沒有驅(qū)動將無法完成數(shù)據(jù)庫連接,從而不能操作數(shù)據(jù)庫!每個數(shù)據(jù)庫廠商都需要提供自己的驅(qū)動,用來連接自己公司的數(shù)據(jù)庫,也就是說驅(qū)動一般都由數(shù)據(jù)庫生成廠商提供。
二、JDBC 開發(fā)
JDBC 操作數(shù)據(jù)庫的步驟:
注冊驅(qū)動:告知 JVM 使用的是哪一個數(shù)據(jù)庫的驅(qū)動
獲得連接:使用 JDBC 中的類,完成對MySQL數(shù)據(jù)庫的連接
獲得語句執(zhí)行平臺:通過連接對象獲取對 SQL 語句的執(zhí)行者對象
執(zhí)行SQL語句:使用執(zhí)行者對象,向數(shù)據(jù)庫執(zhí)行 SQL 語句,獲取到數(shù)據(jù)庫的執(zhí)行后的結(jié)果
處理結(jié)果
釋放資源
1、導入驅(qū)動jar包
網(wǎng)盤獲取 mysql-connector-java-5.1.37-bin.jar 包,連接:https://pan.baidu.com/s/1eoxPeiNGrDXqHydr2X3Exg?? 提取碼:kned
下載解壓后如下:

mysql-connector-java-5.1.37-bin.jar 就是我們要導入的包,導入方法和導入 commons-io jar 包方法是一樣的,具體可以參照 commons-io jar 包導入方法 https://blog.csdn.net/One_L_Star/article/details/95625040#2%E3%80%81%E5%AF%BC%E5%85%A5%20commons-io%20jar%20%E5%8C%85
2、注冊數(shù)據(jù)庫驅(qū)動程序
在開發(fā)中通常使用反射的方法注冊驅(qū)動:Class.forName() 加載一個使用字符串描述的驅(qū)動類,該類的靜態(tài)代碼將自動執(zhí)行,Driver 類會“主動”將自己進行注冊
使用反射技術(shù):Class.forName("com.mysql.jdbc.Driver");
public static void main(String[] args)throws ClassNotFoundException,SQLException{
//注冊驅(qū)動 反射技術(shù),將驅(qū)動類加入到內(nèi)容
Class.forName("com.mysql.jdbc.Driver");
}
3、獲取數(shù)據(jù)庫和SQL的連接對象
static Connection getConnection(String url, String user, String password):
返回值:Connection接口的實現(xiàn)類,在mysql驅(qū)動程序
url:數(shù)據(jù)庫地址? jdbc:mysql://連接主機IP:端口號//數(shù)據(jù)庫名字
user:用戶名
password:密碼
Statement createStatement() :獲取Statement對象,將SQL語句發(fā)送到數(shù)據(jù)庫
public static void main(String[] args) throws ClassNotFoundException, SQLException {
? ? //1.注冊驅(qū)動 反射技術(shù),將驅(qū)動類加入到內(nèi)容
? ? Class.forName("com.mysql.jdbc.Driver");
? ? //2.獲得數(shù)據(jù)庫連接? DriverManager類中靜態(tài)方法
? ? //static Connection getConnection(String url, String user, String password)
? ? //返回值是Connection接口的實現(xiàn)類,在mysql驅(qū)動程序
? ? //url: 數(shù)據(jù)庫地址? jdbc:mysql://連接主機IP:端口號//數(shù)據(jù)庫名字
? ? String url =? "jdbc:mysql://localhost:3306/mydb";
? ? String username = "root";
? ? String password = "123456";
? ? Connection con = DriverManager.getConnection(url,username,password);
? ? System.out.println(con);
? ? //Statement createStatement() 獲取Statement對象,將SQL語句發(fā)送到數(shù)據(jù)庫
? ? Statement stat = con.createStatement();
? ? System.out.println(stat);
}
4、執(zhí)行 insert 語句獲取結(jié)果集
int executeUpdate(String sql)?:執(zhí)行數(shù)據(jù)庫中的SQL語句(只限insert delete update)
public static void main(String[] args) throws ClassNotFoundException, SQLException {
? ? //1.注冊驅(qū)動 反射技術(shù),將驅(qū)動類加入到內(nèi)容
? ? Class.forName("com.mysql.jdbc.Driver");
? ? //2.獲得數(shù)據(jù)庫連接?
? ? //DriverManager類中靜態(tài)方法
? ? //static Connection getConnection(String url, String user, String password)
? ? //返回值是Connection接口的實現(xiàn)類,在mysql驅(qū)動程序
? ? //url: 數(shù)據(jù)庫地址? jdbc:mysql://連接主機IP:端口號//數(shù)據(jù)庫名字
? ? String url =? "jdbc:mysql://localhost:3306/mydb";
? ? String username = "root";
? ? String password = "123456";
? ? Connection con = DriverManager.getConnection(url,username,password);
? ? System.out.println(con);
? ? //3.獲得語句執(zhí)行平臺
? ? //Statement createStatement() 獲取Statement對象,將SQL語句發(fā)送到數(shù)據(jù)庫
? ? Statement stat = con.createStatement();
? ? System.out.println(stat);
? ? //4.執(zhí)行sql語句
? ? //int executeUpdate(String sql)? 執(zhí)行數(shù)據(jù)庫中的SQL語句(只限insert delete update)
? ? int N = stat.executeUpdate("insert into Student(Sno,Sname,Ssex,Sage) value('15450166','派大星','男','66')");
? ? System.out.println(N);
? ? //5.關(guān)閉資源
? ? stat.close();
? ? con.close();
}
5、執(zhí)行 select 語句獲取結(jié)果集
ResultSet executeQuery(String sql):--執(zhí)行select語句
boolean execute(String sql):--執(zhí)行select返回true 執(zhí)行其他的語句返回false
ResultSet實際上就是一張二維的表格,我們可以調(diào)用其boolean next()方法指向某行記錄,當?shù)谝淮握{(diào)用next()方法時,便指向第一行記錄的位置,這時就可以使用ResultSet提供的getXXX(int col)方法(與索引從0開始不同個,列從1開始)來獲取指定列的數(shù)據(jù):
rs.next();? 指向第一行
rs.getInt(1);? 獲取第一行第一列的數(shù)據(jù)
常用方法
Object getObject(int index) / Object getObject(String name) 獲得任意對象
String getString(int index) / Object getObject(String name) 獲得字符串
int getInt(int index) / Object getObject(String name) 獲得整形
double getDouble(int index) / Object getObject(String name) 獲得雙精度浮點型
public static void main(String[] args) throws ClassNotFoundException, SQLException {
? ? //1.注冊驅(qū)動 反射技術(shù),將驅(qū)動類加入到內(nèi)容
? ? Class.forName("com.mysql.jdbc.Driver");
? ? //2.獲得數(shù)據(jù)庫連接
? ? //DriverManager類中靜態(tài)方法
? ? //static Connection getConnection(String url, String user, String password)
? ? //返回值是Connection接口的實現(xiàn)類,在mysql驅(qū)動程序
? ? //url: 數(shù)據(jù)庫地址? jdbc:mysql://連接主機IP:端口號//數(shù)據(jù)庫名字
? ? String url =? "jdbc:mysql://localhost:3306/mydb";
? ? String username = "root";
? ? String password = "123456";
? ? Connection con = DriverManager.getConnection(url,username,password);
? ? System.out.println(con);
? ? //3.獲得語句執(zhí)行平臺
? ? //Statement createStatement() 獲取Statement對象,將SQL語句發(fā)送到數(shù)據(jù)庫
? ? Statement stat = con.createStatement();
? ? System.out.println(stat);
? ? //4. 調(diào)用執(zhí)行者對象方法,執(zhí)行SQL語句獲取結(jié)果集
? ? String sql = "select * from Student";
? ? ResultSet Rab = stat.executeQuery(sql);
? ? //5 .處理結(jié)果集
? ? while (Rab.next())
? ? {
? ? ? ? System.out.println(Rab.getString("Sno") + "? ? " + Rab.getString("Sname") + "? ? " +
? ? ? ? ? ? ? ? Rab.getString("Ssex") + "? ? " + Rab.getString("Sage"));
? ? }
? ? //6.關(guān)閉資源
? ? stat.close();
? ? con.close();
}