JDBC主要功能如下:
- 建立與數(shù)據(jù)庫或者其他數(shù)據(jù)源的連接腻脏。
- 向數(shù)據(jù)庫發(fā)送SQL命令
- 處理數(shù)據(jù)庫的返回結(jié)果神汹。
JDBC中常用的類和接口
- Connection: 連接到數(shù)據(jù)庫伤哺。
- Statement: 建立操作指令。
- executeQuery: 執(zhí)行查詢指令畏腕。
- ResultSet: 獲得查詢結(jié)果凸主。
建立連接的操作:
public static Connection getConnection() {
Connection con = null;
try {
Class.forName(driverName); //建立JDBC-ODBC橋接器
con = DriverManager.getConnection(dbURL,userName,userPw); //建立連接。
}catch(Exception e) {
e.printStackTrace();
}
//返回建立的連接對象
return con;
}
查詢操作
-
向數(shù)據(jù)庫發(fā)送SQL查詢語句
首先使用Satement聲明一個SQL語句對象额湘,然后讓已創(chuàng)建的連接對象con調(diào)用方法createStatement()創(chuàng)建這個SQL語句對象:
Statement sql = con.createStatement();
-
處理查詢結(jié)果
有了SQL語句對象后卿吐,就可以調(diào)用相應的方法實現(xiàn)對數(shù)據(jù)庫中表的查詢和修改旁舰,并將查詢結(jié)果存放在一個Result類聲明的對象中。也就是說SQL查詢語句對數(shù)據(jù)庫的查詢操作將返回一個ResultSet對象嗡官,ResultSet對象是由統(tǒng)一形式的列組織的數(shù)據(jù)行組成箭窜。
ResultSet rs = sql.executeQuery(SQL查詢語句);
ResultSet 對象一次只能看到一個數(shù)據(jù)行,實用next()方法移到下一行數(shù)據(jù)行衍腥,獲得一行數(shù)據(jù)后磺樱,ResultSet對象可以實用getXxx方法獲得字段值(列值),將位置索引或列名傳遞給getXxx方法即可婆咸。
無論字段是何種屬性竹捉,總可以使用getString(int columnIndex)或getString(String columnName)方法返回字段值的串表示。
當使用ResultSet的getXxx方法查看一行記錄時尚骄,不可以顛倒字段的順序块差。
查詢stu表中學生信息
Connection con = DBUtil.getConnection();
try {
Statement sql = con.createStatement();
ResultSet rs = sql.executeQuery("SELECT * FROM stu");
while(rs.next()) {
System.out.println(rs.getString("id") + " " + rs.getString("name") + " "+ rs.getString("phone"));
}
}catch(Exception e) {
e.printStackTrace();
}
}
順序查詢
查詢表中字段信息:
當創(chuàng)建好連接對象con之后,那么該連接對象調(diào)用getMetaData()方法可以返回一個DatabaseMetaData對象:
DatabaseMetaData metadata = con.getMetaData();
Metadata對象再調(diào)用getColumns可以將表的字段信息以行列的形式存儲在一個ResultSet對象:
ResultSet tableMessage = metadata.getColumns(null,null,"goods",null);
如果表中由n個字段倔丈,tableMessage就剛好有n行憨闰,每行4列,每行分別含有和相應字段有關(guān)的信息需五。信息的次序為:“數(shù)據(jù)庫名”鹉动、“數(shù)據(jù)庫擴展名”、“表名“宏邮、“字段名”泽示。
tableMessage對象調(diào)用next方法使游標向下移動一行(游標的初始位置在第一行之前),然后tableMessage調(diào)用getXXX方法可以查看該行中列的信息蜀铲,其中最重要的信息是第4列边琉,該列上的信息為字段的名字。
獲取表中字段信息
Connection con = DBUtil.getConnection();
try {
DatabaseMetaData metadata = con.getMetaData();
ResultSet tableMessage = metadata.getColumns(null, null, "stu", null);
while(tableMessage.next()) {
System.out.println(tableMessage.getString(1) + tableMessage.getString(2) + tableMessage.getString(3) + tableMessage.getString(4 ));
}
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("成功");
控制游標
有時候需要在結(jié)果集中前后移動记劝、顯示結(jié)果集中的某條記錄或隨機顯示若干條記錄時变姨,必須要返回一個可滾動的結(jié)果集,為了得到一個可滾動的結(jié)果集厌丑,需使用下述方法獲得一個Statement對象定欧。
Statement stmt = con.createStatement(int type, int concurrency);
然后根據(jù)參數(shù)type、concurrency的取值情況怒竿,stmt返回相應類型的結(jié)果集砍鸠。
Result re = stmt.executeQuery(SQL語句);
type的取值決定滾動方式,取值可以是:
取值 | 含義 |
---|---|
ResultSet.TYPE_FORWORD_ONLY | 結(jié)果集的游標只能向下滾動耕驰。 |
ResultSet.TYPE_SCROLL | 結(jié)果集的游標可以上下移動爷辱,當數(shù)據(jù)庫變化時,當前結(jié)果集不變。 |
ResultSet.TYPE_SCROLL_SENSITIVE | 返回可滾動的結(jié)果集饭弓,當數(shù)據(jù)庫變化時双饥,當前結(jié)果集同步改變 |
取值 | 含義 |
---|---|
ResultSet.CONCUR_READ_ONLY | 不能用結(jié)果集更新數(shù)據(jù)庫中的表 |
ResultSet.CONCUR_UPDATABLE | 能用結(jié)果集更新數(shù)據(jù)庫中的表 |
Concurrency取值決定是否可以用結(jié)果集更新數(shù)據(jù)庫,Concurrenct取值:
取值 | 含義 |
---|---|
ResultSet.CONCUR_READ_ONLY | 不能用結(jié)果集更新數(shù)據(jù)庫中的表 |
ResultSet.CONCUR_UPDATABLE | 能用結(jié)果集更新數(shù)據(jù)庫中的表 |
方法名 | 含義 |
---|---|
public boolean previous() | 將游標向上移動弟断,該方法返回boolean型數(shù)據(jù)咏花,當移動結(jié)果集第一行之前時返回false。 |
public void beforeFirst | 將游標移動到結(jié)果集的初始位置阀趴,即在第一行之前昏翰。 |
public void afterLast() | 將游標移動到結(jié)果集最后一行之后。 |
public void first() | 將游標移動到結(jié)果集的第一行 |
public void last() | 將游標移動到結(jié)果集的最后一行 |
public boolean isAfterLast() | 判斷游標是否在最后一行之后刘急。 |
public boolean isBeforeFirst() | 判斷游標是否在第一行之前棚菊。 |
public boolean isFirst() | 判斷游標是否指向結(jié)果集的第一行。 |
public boolean isLast() | 判斷游標是否指向結(jié)果集的最后一行 |
public int getRow() | 得到當前游標所指行的行號排霉,行號從1開始窍株,如果結(jié)果集沒有行,返回0 |
public boolean absolute(int row) | 將游標移到參數(shù)row指定的行 |
滾動查詢經(jīng)常用到ResultSet的下述方法攻柠。
方法名 | 含義 |
---|---|
public boolean previous() | 將游標向上移動球订,該方法返回boolean型數(shù)據(jù),當移動結(jié)果集第一行之前時返回false瑰钮。 |
public void beforeFirst | 將游標移動到結(jié)果集的初始位置冒滩,即在第一行之前。 |
public void afterLast() | 將游標移動到結(jié)果集最后一行之后浪谴。 |
public void first() | 將游標移動到結(jié)果集的第一行 |
public void last() | 將游標移動到結(jié)果集的最后一行 |
public boolean isAfterLast() | 判斷游標是否在最后一行之后开睡。 |
public boolean isBeforeFirst() | 判斷游標是否在第一行之前。 |
public boolean isFirst() | 判斷游標是否指向結(jié)果集的第一行苟耻。 |
public boolean isLast() | 判斷游標是否指向結(jié)果集的最后一行 |
public int getRow() | 得到當前游標所指行的行號篇恒,行號從1開始,如果結(jié)果集沒有行凶杖,返回0 |
public boolean absolute(int row) | 將游標移到參數(shù)row指定的行 |
條件查詢
更新胁艰、添加與刪除操作
Statement對象調(diào)用方法:
public int executeUpdate(String sqlStatement);
通過參數(shù)sqlStatement指定的方式實現(xiàn)對數(shù)據(jù)庫表中記錄的更新、添加和刪除操作智蝠。更新腾么、添加和刪除記錄的SQL語法分別是:
UPDATE <表名> SET <字段名> = 新增 WHERE <條件子句>
INSERT INTO 表(字段列表) VALUES(對應的具體的記錄)或INSETE INTO表(VALUES (對應的具體的記錄)
DELETE FROM <表名> WHER <條件子句>
public class ModifyTable {
String datasourceName = "";
String SQL,message="";
public ModifyTable() {
}
public void setSQL(String SQL) {
this.SQL = SQL;
}
public String modifyRecord() {
Connection con = DBUtil.getConnection();
Statement sql = null;
try {
sql = con.createStatement();
sql.execute(SQL);
message = "操作成功";
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return message;
}
public class Main {
public static void main(String[] args) {
ModifyTable modify = new ModifyTable();
modify.setSQL("INSERT INTO stu(name,phone) VALUES ('KKK','17852179777')");
String backMess = modify.modifyRecord();
System.out.println(backMess);
}
}