黑馬就業班第五天-JDBC
jdbc:Java DataBase Connectivity,java資料庫的連線
比如有一臺電腦,想在電腦上安裝顯示卡,需要顯示卡的驅動,由顯示卡生產廠商提供
要想使用java對資料庫進行操作,需要使用由資料庫提供的資料庫驅動
一個程式,使用java運算元據庫,掌握java程式碼,除了掌握java程式碼之外,需要掌握資料庫驅動的程式碼,
很多的資料庫,比如mysql、oracle,對於程式設計師來講,需要掌握每種資料庫的程式碼,對於程式設計師壓力很大
sun公司針對這種情況,開發出一套標準介面,各個資料庫只需要實現這個介面就可以了,程式設計師只需要掌握這套
介面就可以了,這套標準的介面就是jdbc
如果想要使用jdbc對資料庫進行操作,首先安裝資料庫的驅動,不同的資料庫提供驅動使用jar的形式提供的,
需要把jar包放到專案裡面,相當於安裝了資料庫的驅動。
匯入jar到專案中(使用到開發工具 myeclipse10.x版本)
首先建立一個資料夾 lib,把jar包複製到lib裡面,選中jar包右鍵點選build path -- add to build path,
jar包前面的圖示變成了“奶瓶”圖示,表示匯入jar成功
2、JDBC的入門案例
2.1 使用jdbc對資料庫進行操作步驟是固定的
2.1.1 使用到類和介面
DriverManager
Connection
Statement
ResultSet
2.2 jdbc的操作步驟
第一步,載入資料庫的驅動
DriverManager裡面registerDriver(Driver driver)
第二步,建立與資料庫的連線
DriverManager裡面getConnection(String url, String user, String password)
第三步,編寫sql語句
第四步,執行sql語句
Statement裡面executeQuery(String sql)
第五步,釋放資源(關閉連線)
2.3 使用jdbc實現查詢的操作
2.3.1 程式碼
public static void main(String[] args) throws Exception {
//載入驅動
DriverManager.registerDriver(new Driver());
//建立連線
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb2", "root", "root");
//編寫sql
String sql = "select * from user";
//執行sql
//得到statement
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
//遍歷結果集得到每條記錄
while(rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
int chinese = rs.getInt("chinese");
int english = rs.getInt("english");
System.out.println(id+" :: "+username+" :: "+chinese+" :: "+english);
}
//釋放資源
rs.close();
stmt.close();
conn.close();
}
3、jdbc的DriverManager物件
3.1 在java.sql包裡面
3.2 載入資料庫的驅動
registerDriver(Driver driver) :引數是資料庫的驅動,這個驅動是由資料庫提供的
(1)這個方法在實際開發中,一般不使用,因為這個方法會載入驅動兩次
(2)一般在開發中使用反射的方式載入資料庫的驅動
Class.forName("com.mysql.jdbc.Driver");
3.3 得到資料庫的連線
getConnection(String url, String user, String password),返回Connection
(1)有三個引數
第一個引數:表示要連線的資料庫
寫法:jdbc:mysql://資料庫的ip:資料庫的埠號/連線的資料庫的名稱
jdbc:mysql://localhost:3306/testdb2
簡寫的方式:jdbc:mysql:///testdb2(使用範圍:連線的資料庫是本機,埠是3306)
第二個引數:表示連線資料庫的使用者名稱
第三個引數:表示連線資料庫使用者密碼
4、jdbc的Connection物件
4.1 代表資料庫的連線,是介面,在java.sql包裡面
4.2 建立statement物件
Statement createStatement()
4.3 建立預編譯物件 PreparedStatement
PreparedStatement prepareStatement(String sql)
5、jdbc的Statement物件
5.1 執行sql的物件,介面,在java.sql包裡面
5.2 執行查詢操作方法
ResultSet executeQuery(String sql) ,返回查詢的結果集
5.3 執行增加 修改 刪除的方法
int executeUpdate(String sql) ,返回成功的記錄數
5.4 執行sql語句的方法
boolean execute(String sql) ,返回是布林型別,如果執行的是查詢的操作返回true,否則返回的false
5.5 執行批處理的方法
addBatch(String sql):把多個sql語句放到批處理裡面
int[] executeBatch():執行批處理裡面的所有的sql
6、jdbc的ResultSet物件
6.1 代表查詢之後返回的結果,介面,在java.sql包裡面
類似於使用select語句查詢出來的表格
6.2 遍歷結果集
next()
6.3 得到資料的具體值
getXXX
(1)比如資料是string型別,使用getString("欄位的名稱")
比如資料是int型別,使用getInt("欄位的名稱")
比如不知道資料的型別,使用getObject("欄位的名稱")
6.4 結果集的遍歷方式
在最開始的時候在第一行之前,當執行了next方法之後,一行一行的向下進行遍歷
,在預設的情況下,只能向下,不能向上,在遍歷出來的結果也是不能修改的
7、jdbc的釋放資源
7.1 關閉的原則:誰最先開啟,誰最後關閉
7.2 關閉資源的規範的寫法
finally {
//釋放資源
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
8、使用jdbc進行crud操作
(1)實現對資料庫表記錄進行查詢的操作
* executeQuery(sql)
(2)實現對資料庫表記錄進行增加的操作
* executeUpdate(sql)
(3)實現對資料庫表記錄進行修改的操作
* executeUpdate(sql)
(4)實現對資料庫表記錄進行刪除的操作
* executeUpdate(sql)
9、jdbc工具類的封裝
9.1 當在很多的類裡面有相同的程式碼,可以把相同的程式碼提取到一個工具類裡面,
在類裡面直接呼叫工具類裡面的方法實現
9.2 在jdbc實現crud操作的程式碼裡面,首先得到資料庫連線,和釋放資源的程式碼是重複的,所以進行封裝
9.3 可以把資料庫的一些資訊,寫到配置檔案裡面,在工具類讀取配置檔案得到內容
一般使用properties格式檔案作為儲存資料庫資訊的檔案
有兩種方式讀取配置檔案
第一種,使用properties類
(1)程式碼
//建立properties物件
Properties p = new Properties();
//檔案的輸入流
InputStream in = new FileInputStream("src/db.properties");
//把檔案的輸入流放到物件裡面
p.load(in);
String drivername = p.getProperty("drivername");
String url = p.getProperty("url");
String username = p.getProperty("username");
String password = p.getProperty("password");
第二種,使用ResourceBundle類
* 使用範圍:首先讀取的檔案的格式需要時properties,檔案需要放到src下面
(1)程式碼
String drivername = ResourceBundle.getBundle("db").getString("drivername");
String url = ResourceBundle.getBundle("db").getString("url");
String username = ResourceBundle.getBundle("db").getString("username");
String password = ResourceBundle.getBundle("db").getString("password");
9.4 程式碼
public static String drivername;
public static String url;
public static String username;
public static String password;
//在類載入時候,執行讀取檔案的操作
static {
drivername = ResourceBundle.getBundle("db").getString("drivername");
url = ResourceBundle.getBundle("db").getString("url");
username = ResourceBundle.getBundle("db").getString("username");
password = ResourceBundle.getBundle("db").getString("password");
}
10、使用jdbc的工具類實現crud操作
11、sql的注入和防止
11.1 模擬登入的效果
(1)登入的實現的步驟
首先,輸入使用者名稱和密碼
第二,拿到輸入的使用者名稱和密碼,到資料庫裡面進行查詢,如果使用者名稱和密碼都正確,才表示登入成功;
但是如果使用者名稱和密碼,有一個是錯誤的,表示登入失敗。
11.2 演示sql的注入
(1)在登入時候,使用者名稱裡面輸入 bbb' or '1=1,因為在表裡面有一個使用者是bbb,可以登入成功
因為輸入的內容,被作為sql語句的一個條件,而不是作為整個使用者名稱。
select * from user where username='bbb' or '1=1' and password='rrr'
11.3 防止sql的注入
(1)使用PreparedStatement預編譯物件防止sql注入
(2)建立PreparedStatement物件 prepareStatement(String sql)
(3)PreparedStatement介面的父介面Statement
(4)什麼是預編譯
(5)步驟:
第一步,載入驅動,建立資料庫的連線
第二步,編寫sql
第三步,需要對sql進行預編譯
第四步,向sql裡面設定引數
第五步,執行sql
第六步,釋放資源
(6)程式碼
//使用工具類得到資料庫的連線
conn = MyJdbcUtils.getConnection();
//編寫sql
String sql = "select * from user where username=? and password=?";
//對sql進行預編譯
psmt = conn.prepareStatement(sql);
//設定引數
psmt.setString(1, username);
psmt.setString(2, password);
//執行sql
rs = psmt.executeQuery();
if(rs.next()) {
System.out.println("login success");
} else {
System.out.println("fail");
}
12、使用PreparedStatement預編譯物件實現crud的操作
注意地方:
第一,編寫sql時候,引數使用?表示(佔位符)
第二,預編譯sql,設定引數的值,執行sql
12.1 使用PreparedStatement預編譯物件實現查詢的操作
(1)預編譯物件executeQuery()執行查詢語句
12.2 使用PreparedStatement預編譯物件實現增加的操作
(1)預編譯物件executeUpdate()執行增加的語句
12.3 使用PreparedStatement預編譯物件實現修改的操作
(1)預編譯物件executeUpdate()執行修改的語句
12.4 使用PreparedStatement預編譯物件實現刪除的操作
(1)預編譯物件executeUpdate()執行刪除的語句
---------------------------------程式碼--------------------
1 JDBC 核心物件
|--Connection:連線物件
|--獲取指令物件conn.createStatement()
|--獲取預編譯物件conn.prepareStatement(sql)
|--DriverManager:驅動管理物件
|--註冊驅動(被Class.forName()替代)
|--連線資料庫獲取 連線物件DriverManager.getConnection(url,name,pwd)
|--Statement:指令物件
|--執行sql
|--PreparedStatement:預編譯物件
|--解決sql注入安全問題
|--ResultSet:結果集物件
|--查詢到的結果
2 JDBC操作步驟
|--載入驅動
|--獲取連線物件
|--準備sql
|--獲取指令物件
|--執行sql
|--[處理查詢的結果集]
3 釋放連線
if(rs!=null){
try{
rs.close();
}catch(Exception e){
//...
}
rs=null;
}
if(stmt!=null){
try{
stmt.close();
}catch(Exception e){
//...
}
stmt=null;
}
if(conn!=null){
try{
conn.close();
}catch(Exception e){
//...
}
conn=null;
}
4 一個標準的例子(完整的,程式碼比較多的)
public void jdbcDemo(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
//載入驅動
Class.forName("com.mysql.jdbc.Driver");
//獲取連線物件
conn = DriverManager.getConnection("jdbc:mysql:localhost:3306/testDB", "root", "123");
//獲取指令物件
stmt = conn.createStatement();
//執行查詢sql,獲取結果集
rs = stmt.executeQuery("select * from users");
//處理結果集
while(rs.next()){
String username = rs.getString("username");
int age = rs.getInt("age");
String addr = rs.getString("addr");
System.out.println(username+" :"+age+" :"+addr);
}
}catch(Exception e){
e.printStackTrace();
}finally{
/**--------------釋放資源-----------*/
if(rs!=null){
try{
rs.close();
}catch(Exception e){
e.printStackTrace();
}
rs=null;
}
if(stmt!=null){
try{
stmt.close();
}catch(Exception e){
e.printStackTrace();
}
stmt=null;
}
if(conn!=null){
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
conn=null;
}
}
5 工具類封裝
/**---獲取連線物件---**/
private static String driver;
private static String url;
private static String username;
private static String password;
//靜態欄位獲取
static{
driver = ResourceBundle.getBundle("jdbc").getString("driver");
url = ResourceBundle.getBundle("jdbc").getString("url");
username = ResourceBundle.getBundle("jdbc").getString("username");
password = ResourceBundle.getBundle("jdbc").getString("password");
}
public Connection getConnection() throws Exception{
//載入驅動
Class.forName(driver);
//獲取連線物件
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
6 使用預編譯物件
public void jdbcPre(){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
conn = JdbcUtil.getConn();
ps = conn.prepareStatement("select * from users where age>? and addr like '%?%'");
ps.setInt(1, 23);
ps.setString(2, "beijing");
rs = ps.executeQuery();
//處理結果集
while(rs.next()){
String username = rs.getString("username");
int age = rs.getInt("age");
String addr = rs.getString("addr");
System.out.println(username+" :"+age+" :"+addr);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.releaseResource();
}
}
相關文章
- 黑馬就業班第四天-資料庫就業資料庫
- 黑馬程式設計師—一張帖看完黑馬所有學科、班級就業薪資貼程式設計師就業
- 傳智播客2018年python基礎班就業班人工智慧深度學習機器學習黑馬15期Python就業班全套培訓教程Python就業人工智慧深度學習機器學習
- PHP基礎班+就業班全套視訊學習教程PHP就業
- Java就業班day09_xml&tomcatJava就業XMLTomcat
- 美國留學十大“黑馬”專業
- 2020JAVA 就業班視訊學習Java就業
- python就業班----正規表示式及re應用Python就業
- 黑馬程式設計師程式設計師
- 黑馬JavaWeb-day02JavaWeb
- PHP全棧開發工程師速成班-CSDN就業班-專題視訊課程PHP全棧工程師就業
- 本地生活再現“黑馬”,這一行業有多香!行業
- 行業黑馬顯現 月薪過萬職位暴漲行業
- 黑狐”木馬分析報告
- 快遞行業半路殺出一匹“黑馬” 順豐要“慌了”行業
- 零基礎報成都java培訓班需要學多久才能就業?Java就業
- 黑馬程式設計師-Java概述程式設計師Java
- Python學習資源(傳播智客第15期Python就業和基礎班 AI人工智慧學習班 機器學習班級)Python就業AI人工智慧機器學習
- Python全棧工程師特訓班五期-直播回放-CSDN就業班-專題視訊課程Python全棧工程師就業
- python全棧工程師-CSDN就業班-專題視訊課程Python全棧工程師就業
- UI設計師成長之路-CSDN就業班-專題視訊課程UI就業
- 【UI】第五週 VI專案-CSDN就業班-專題視訊課程UI就業
- 【SpringCloud】黑馬學習筆記-NacosSpringGCCloud筆記
- AI工程師百天計劃-CSDN就業班-專題視訊課程AI工程師就業
- 【UI】第三週 手繪基礎-CSDN就業班-專題視訊課程UI就業
- 傳智播客168期JavaEE就業班(第十一天 cookie session)Java就業CookieSession
- 黑馬工廠:2022年堅果行業洞察(附下載)行業
- 黑馬程式設計師前端學習之路程式設計師前端
- 黑馬程式猿——12,多執行緒(2)執行緒
- 黑馬程式設計師——型別轉換程式設計師型別
- 黑馬PM-電商專案-電商後臺
- 黑馬PM-電商專案-財務管理
- 黑馬PM-營銷中心-營銷工具
- 團隊作業sprint第五天
- 重磅推出 | 零基礎紅藍對抗攻防研修班:高薪就業直通車高薪就業
- 【UI】第一週 PS軟體基礎-CSDN就業班-專題視訊課程UI就業
- 【UI】第四周 設計基礎-CSDN就業班-專題視訊課程UI就業
- 如何設計一個好的Banner-CSDN就業班-專題視訊課程就業