JDBC介紹
java data base connectivity, java數(shù)據(jù)庫(kù)連接
java通過該標(biāo)準(zhǔn)去操作MySQL鲜锚, Oracle等數(shù)據(jù)庫(kù)
用到的包
java.sql; javax.sql
類:DriverManager 注冊(cè)驅(qū)動(dòng)
接口:Connection 獲取連接
Statement
ResultSet
PreparedStatement
CallableStatement
DateSource (javax.sql)
入門代碼
前提創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
create table user(
id int primary key auto_increment,
username varchar(20) unique not null;
password varchar(20) not null;
emai varchar(40) not null;
);
insert into user values (null, 'tom', '123', 'tom@163.com');
insert into user values(null, 'fox', '123', 'fox@163.com');
// 驅(qū)動(dòng)需要下載突诬,jar包,將其導(dǎo)入到環(huán)境路徑中
import java.sql.DriverManager; // 驅(qū)動(dòng)管理芜繁,注冊(cè)驅(qū)動(dòng)
import com.mysql.jdbc.Driver; //此驅(qū)動(dòng)是mysql提供
import java.sql.Connection;
import java.sql.ResultSet;
public class jdbcDemo1{
public static void main(String[] arg){
//注冊(cè)驅(qū)動(dòng),還有另一種方式Class.forName("com.jdbc.mysql.Driver");
DriverManager.registerDriver(new Driver()); //此處有異常旺隙,拋出
//獲取連接對(duì)象
Connection con = (Connection)DriverManager.getConnection("jdbc:mysql://localhost:3306/day17", "root", "abc");
//通過連接對(duì)象獲取操作sql語(yǔ)句的Statement
Statement st = con.createStatement();
//操作sql語(yǔ)句
String sql = "select * from user";
ResultSet rs = st.excuteQuery(sql); //返回結(jié)果集
//遍歷結(jié)果集,可以記住
while(rs.next){
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
System.out.println(id+" "+ username+password+email);
}
//釋放資源,關(guān)閉數(shù)據(jù)庫(kù)
//java與數(shù)據(jù)庫(kù)連接骏令,必須釋放資源
rs.close();
st.close();
con.close();
}
}
DriveManager詳解
注冊(cè)驅(qū)動(dòng):
//DriverManager類是管理一組JDBC驅(qū)動(dòng)程序的基本服務(wù)
//底層是vector容器蔬捷,可以裝入很多數(shù)據(jù)庫(kù)驅(qū)動(dòng)
//第一種方式,這種方式榔袋,根據(jù)源碼可知,DriverManager中會(huì)產(chǎn)生兩個(gè)Driver
DriverManager.registerDriver(new Driver());
//第二種方式周拐,反射機(jī)制。推薦使用
//降低耦合摘昌,不依賴于驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver");//注冊(cè)MySQL驅(qū)動(dòng)
Class.forName("oracle.jdbc.driver.OracleDriver");//注冊(cè)oracle驅(qū)動(dòng)
//通過DriverManager獲取連接對(duì)象
Connection con = DriverManager.getConnection(String url, String user; String password); //url確定使用哪一個(gè)驅(qū)動(dòng)
關(guān)于URL
url格式:
主協(xié)議 自協(xié)議 主機(jī) 端口 數(shù)據(jù)庫(kù)
jdbc : mysql ://localhost:3306/day17
mysql url: jdbc:mysql://localhost:3306/數(shù)據(jù)庫(kù)名
mysql 簡(jiǎn)寫 url: jdbc:mysql:///day17 (本地的速妖,且端口號(hào)3306)
oracle url: jdbc:oracle:thin:@localhost:1521:sid
在url后面可以帶參數(shù):
useUnicode=true&characterEncoding=UTF-8
Connection詳解 java.sql.Connection;
代表連接對(duì)象,數(shù)據(jù)庫(kù)與程序的連接
作用:
- 通過Connection獲得操作sql的Statement對(duì)象
- Statement st = con.createStatement();
- 獲取執(zhí)行預(yù)處理的PraparedStatement對(duì)象
- 獲取存儲(chǔ)過程的CallableStatement對(duì)象
- 操作事務(wù)
- setAutoCommit(boolean flag) 開啟事務(wù)
- rollback() 事務(wù)回滾
- commit() 事務(wù)提交
//通過DriverManager獲取連接對(duì)象
Connection con = DriverManager.getConnection(String url, String user; String password); //url確定使用哪一個(gè)驅(qū)動(dòng)
Statement st = con.createStatement();
Statement詳解 java.sql.Statement;
作用:
-
執(zhí)行sql語(yǔ)句
- DML:insert update delete 插入 修改 刪除
- 使用方法 int executeUpdate(String sql)
- DQL: select 查詢
-
使用方法 ResultSet executeQuery(String
sql)excute(String sql) 執(zhí)行任意sql語(yǔ)句聪黎,少用
-
- DML:insert update delete 插入 修改 刪除
-
批處理操作
- addBatch(String sql); 將sql添加到批處理
- executeBatch(); 批量處理
- clearBatch(); 清空批處理
//執(zhí)行update語(yǔ)句
int row = st.executeUpdate("update user set password='135'");
System.out.println(row);//=2;里面有兩條記錄罕容,兩個(gè)記錄的password改了
//根據(jù)返回值,判斷修改是否成功
ResultSet詳解 java.sql.ResultSet
封裝select語(yǔ)句執(zhí)行后的結(jié)果集(表)
初始的時(shí)候稿饰,游標(biāo)在第一行之前锦秒,調(diào)用ResultSet.next()方法,使游標(biāo)指向具體的行
ResultSet rs = st.excuteQuery("select * from user"); //返回結(jié)果集
//獲取任意類型的數(shù)據(jù)
rs.getObject(int index)喉镰;
rs.getObject(String columnName);
//獲取指定類型的數(shù)據(jù)
rs.getString(int index);
rs.getString(String columnName);
rs.getInt(String columnName); //等等
//遍歷
while(rs.next()){
...
}
//部分函數(shù)
rs.next() ;// 移動(dòng)到下一行
rs.previous(); //移動(dòng)到前一行
rs.absolute(int row); //移動(dòng)到指定行
rs.beforeFirst(); //移動(dòng)到最前面
rs.afterLast(); //移動(dòng)到最后面
rs.updateRow(); //更新行數(shù)據(jù)
釋放資源
通常需要關(guān)閉的對(duì)象:
- ResultSet
- Statement
- Connection(務(wù)必注意)
包含異常處理的入門代碼
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Driver;
//對(duì)異常進(jìn)行try-catch
public class jdbcDemo4 {
public static void main(String[] args) {
Connection con = null;
Statement st = null;
ResultSet rs = null;
//注冊(cè)驅(qū)動(dòng)
try {
DriverManager.registerDriver(new Driver());
//獲取連接
con = (Connection)DriverManager.getConnection("jdbc:mysql://localhost:3306/day17","root","123");
//獲取sql的Statement
st = con.createStatement();
//執(zhí)行
rs = st.executeQuery("select * from user");
//遍歷
while(rs.next()){
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
System.out.println(id+" "+ username+" "+password+" "+email);
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
//釋放資源
if(rs!= null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
try {
if(st != null)
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}