(學習參考書:Java2實用教程第5版)
一、JDBC連接資料庫的操作
撰寫時可以封裝在一個類里面簡化代碼,
(1)加載JDBC-MySQL資料庫驅動
try {
Class.forName("com.mysql.cj.jdbc.Driver");
}
catch (Exception e){ }
(2)連接資料庫
Connection con = null;//宣告要連接資料庫的物件com
String uri = "jdbc:mysql://localhost:3306/資料庫名?useSSL=true &characterEncoding=utf-8"; //連接地址
String user = "root"; //連接資料庫的用戶名
String password = "123456"; //連接資料庫的密碼
try {
con = DriverManager.getConnection(uri,user,password);
//連接代碼
}
catch(SQLException e){ }
(3)撰寫操作資料庫中資料的代碼
二、查詢操作
1,查詢操作的具體步驟
(1)向資料庫發送SQL陳述句:
Statement sql;
try{
sql = con.createStatement();
}
catch (SQLException e){ }
首先宣告SQL陳述句物件,然后讓已創建的連接物件con呼叫方法createStatement()創建這個SQL陳述句物件,
(2)處理查詢結果
有了SQL陳述句物件后,這個物件可以呼叫相應的方法實作對資料庫中表的各項操作,其中查詢結果存放在一個ResultSet類宣告的物件中,即SQL查詢陳述句對資料庫的查詢操作講放回一個ResultSet物件,ResultSet由“列”(欄位)組織的資料行構成,
rs = sql.executeQuery("select * from 表的名稱");
//讀取表中的所有列,*為通配符
rs = sql.executeQuery("select 行1欄位名,行2欄位名... from 表的名稱");
//讀取表中特定的列
ResultSet物件一次只能看到一行資料,使用next()方法移到下一行,ResultSet物件可以通過getXxx(int columnIndex)獲得列值和通過傳遞列名getXxx(String columnName)獲得列值,
(3)關閉連接
con.close(); //關閉con所連接的資料庫
注意:資料庫與連接物件緊密系結,應在使用完資料庫再進行關閉操作,
2,控制游標
結果集的游標的初始位置在結果集第一行的前面,結果集呼叫next()方法向下(后)移動游標,移動成功回傳true,移動失敗回傳false,如果要在結果集中移動并顯示若干條記錄,必須回傳一個滾動的結果集,方法如下:
Statement stmt = con.createStatement(int type,int concurrency);
//獲得一個Statement物件,根據引數的值,stmt回傳相應型別的結果集:
ResultSet re = stmt.executeQuery(SQL陳述句);
type的取值:決定滾動方式:
ResultSet.TYPE_FORWARD_ONLY 結果集的游標只能向下滾動
ResultSet.TYPE_SCROLL_INSENSITIVE 游標可以上下移動,資料庫變化時,結果集不變
ResultSet.TYPE_SCROLL_SENSITIVE 回傳可滾動的結果集,資料變化時,結果集同步改變
Concurrency取值:決定是否可以用結果集更新資料庫
ResultSet.CONCUR_READ_ONLY 不能用結果集更新資料庫中的表
ResultSet.CONCUR_UPDATABLE 能用結果集更新資料庫中的表
滾動查詢常用的ResultSet的方法:
public boolean previous() 將游標向上移動,當移動到結果集第一行之前時回傳false
public void beforeFirst() 將游標移動到結果集的初始位置,第一行之前
public void afterLast() 將游標移動到結果集的最后一行之后
public void first() 將游標移動到第一行
public void last() 將游標移動到最后一行
public boolean isAfterLast() 判斷游標是否在最后一行之后
public boolean isBeforeFirst() 判斷游標是否在第一行游標之前
public boolean isFirst() 判斷游標是否指向第一行
public boolean isLast() 判斷游標是否指向最后一行
public int getRow() 得到當前游標所指向的行號,行號從1開始,如果結果集沒有行,回傳0
public boolean absolute(int row) 將游標移動到引數row指定的行(引數取負數即倒數)
(3)條件與排序查詢
where子陳述句:select 欄位 from 表明 where 條件
(1)欄位值與固定值比較
select * from table where name='張三'
(2)欄位值在某個區間
select * from table where number>5 and number<10 and name!='李四'
(3)使用某些特殊的日期函式(Data:year-month-day)
select * from table where year(表明日期的欄位名)<1980 and month(表面日期的欄位名)<=10
select * from table where year(表明日期的欄位名) between 2002 and 2021
(4)使用某些特殊的時間函式(hour,minute,second)
select * from timelist where second(表明時間的欄位名)=36
(5)用運算子like進行模式匹配,使用%代替0個或多個字符,用一個下劃線_代替一個字符,
select * from table where name like'%歐%' //查詢name欄位有“歐”字的記錄
order by陳述句:可結合where陳述句使用
select * from table order by height
select * from table where name like '%王%' order by name
三、更新、添加和洗掉操作
Statement物件呼叫public int executeUpdate(String sqlStatement);通過引數指定的方式對資料庫表中的記錄的更新、添加和洗掉操作,
(1)更新
update 表名 set 欄位 = 新值 where <條件子句>
(2)添加
insert into 表 values (對應具體的記錄)
(3)洗掉
delete from 表名 where <條件子句>
四、使用預處理陳述句
Java提供了更高效的資料庫操作機制,就是PreparedStatement物件,即預處理陳述句物件,將SQL陳述句處理為資料庫底層陳述句,再傳輸給資料庫,
使用通配符:對SQL進行預處理時,可以用 通配符? 來代替欄位的值,只要在預處理陳述句執行之前再設定通配符所代表的具體值即可:
String str = "select * from 表名 where 欄位1 < ? and 欄位2 = ?";
PreparedStatement sql = con.prepareStatement(str);
sql.setXxx(int parameterIndex,Type x);//該方法設定?代表的值,parameterIndex代表第幾個?,x代表要替換的值,
五、通用查詢
撰寫通用查詢類,用戶可以將資料庫名、SQL陳述句傳遞給該類的物件,那么該物件就用一個二維陣列回傳查詢的記錄,
撰寫通用查詢類需要知道資料庫表列(欄位)的名字和數量,常用方法為用結果集ResultSet物件rs呼叫getMetaData()方法回傳一個ResultSetMetaData物件:
ResultSetMetaData metaData = rs.getMetaData();
然后該物件metaData呼叫getColumnCount()方法既可以回傳rs中列的數目,呼叫getColumnName(int i)就可以回傳結果集rs中第i列的名字,
六、事務
1,事務及處理
事務由一組SQL陳述句組成,所謂事務處理,是指應用程式保證事務中的SQL陳述句要么全部被執行,要么一個都不被執行,事務處理是保證資料庫中資料完整性與一致性的重要機制,
2,JDBC事務處理
用setAutoCommit(boolean b)方法關閉自動模式:
即關閉SQL陳述句的即刻生效性,兩個相關聯的操作應該在都執行完畢后才改變資料庫中的資料,方法為在獲取sql物件前讓連接物件呼叫該方法:
con.setAutoCommit(false);
用commit()方法處理事務:
關閉自動模式后,讓sql物件提交多條SQL(即同一事務)陳述句,這些陳述句不會立即生效,而是直到連接物件呼叫方法后全部生效:
con.commit();
用rollback()方法處理事務失敗:
即撤銷事務所作的操作,在con呼叫commit()方法進行事務處理時,只要有一個SQL陳述句沒有執行成功,那么該事務執行失敗,拋出SQLException例外,這時必須讓con呼叫rollback()方法撤銷引起資料變化的所有操作:
con.rollback();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/257863.html
標籤:其他
上一篇:SQL練習38:針對actor表創建視圖actor_name_view
下一篇:PB斷線重連問題
