stmt在java中的应用_JDBC技术基础总结转载,非原创
JDBC的全稱是Java DataBase
Connectivity,即Java數據庫連接。它是一套行業標準的API,可以在Java應用程序中與關系型數據庫建立連接,并執行相關操作,例如Oracle,DB2等主流數據庫產品。
控制臺,圖形界面客戶端與數據庫交互的途徑是執行SQL語句,Java程序也不例外。Java中訪問數據庫主要使用JDBC。JDBC是Java規定的訪問數據庫的標準API,目前主流的數據庫都支持JDBC。本章使用的開發工具是MyEclipse5.5。
5.1.1
JDBC的概念
JDBC(Java數據基礎連接,Java
Database
Connectivity)是標準的Java訪問數據庫的API。JDBC定義了數據庫的連接,SQL語句的執行以及查詢結果集的遍歷等。JDBC把這些操作定義為接口,位于包java.sql下面。如java.sql.Connection,java.sql.Statement,java.sql.ResultSet等。各個數據庫提供商在自己的JDBC驅動中實現了這些接口。
使用JDBC,可以針對不同的數據庫產品使用同一套程序,而不需要編寫不同的程序。JDBC的基本功能如下所示。
?
連接數據庫
?
向數據庫執行查詢數據動作
?
向數據庫執行更新數據動作
?
向數據庫執行插入數據動作
?
向數據庫執行刪除數據動作
?
執行存儲過程
JDBC支持數據庫訪問的兩層和三層模型。兩層模型是Java應用程序或Applet直接與數據庫進行交互操作的模型。它需要JDBC驅動將SQL語句發送到數據庫,然后將執行結果再返回給客戶端應用程序。三層模型是在應用與數據庫之間,有一個中間應用服務器。這個應用服務器是將程序解耦合,使得邏輯與數據分離。其具體過程,是使用JDBC驅動把命令發送給中間應用服務器,在此服務器中執行一定的邏輯操作,再將這些命令發送給數據庫。數據庫接收命令后,執行相關操作,將產生的結果返回給中間服務器,再通過中間服務器將數據發回給應用。
5.1.2
JDBC和數據庫數據類型的轉化
JDBC是使用Java技術來訪問數據庫數據的,數據庫數據類型和Java的數據類型不同。所以使用JDBC技術時,需要Java與數據庫的數據類型轉化。Java與數據庫的數據類型轉化映射如表5.1所示。
表5.1
數據庫數據類型和Java數據類型對照
SQL數據類型類型
Java數據類型
5.2
JDBC API
JDBC
API由兩個部分組成,一個是核心的API,其類包路徑為java.sql,這是J2SE的一部分。它具有可滾動的結果集,批量更新的實現類;二是擴展的API,其類包路徑為javax.sql,這是J2EE的一部分。它具有訪問JNDI資源,分布式事務等實現類。常用的標準類如下所示。
?
java.sql.DriverManager:完成驅動程序的裝載和建立新的數據庫連接。
?
java.sql.Connection:表示對某一指定數據庫的連接。
?
java.sql.Statement:管理在一指定數據庫連接上的SQL語句的執行。
?
java.sql.ResultSet:一個SQL語句的執行結果。
?
java.sql.Statement:接口,用作執行一條靜態的SQL語句并接收產生的結果。
?
java.sql.PreparedStatement:繼承了Statement接口,用于對預編譯的SQL語句的執行。
?
java.sql.CallableStatement:繼承了Statement接口,用于對一個數據庫存儲過程的執行。
?
java.sql.SQLException:處理數據庫訪問時的出錯信息。
?
java.sql.SQLWarning:處理數據庫訪問時的警告信息。
?
java.sql.Statement:用作執行一條靜態的SQL語句并接收產生的結果。
?
java.sql.Time:用于表示時、分、秒。
?
java.sql.Timestamp:擴展標準java.util.date類,用于表示SQL的時間戳,增加了一個以納秒為單位的時間域。
?
java.sql.Types:定義區分SQL類型的常量。
?
java.sql.DatabaseMetaData:定義了JDBC元數據接口。
5.2.1
連接對象Connection
通過Connection連接對象可以獲取Statement語句對象,或者PreparedStatement語句對象。通過語句對象就可以對數據庫進行查詢和更新操作。查詢是讀取數據動作,更新是包括增加、刪除、修改數據的操作。Connection的類路徑為java.sql.Connection。
Connection常用的方法有以下幾種:
?
close():完成關閉連接。
? commit()
:完成提交。
? rollback()
:完成回滾。
?
createStatement():該方法返回Statement對象。
? prepareStatement(String
sql):參數sql是執行 SQL的語句 ,該方法返回PrepareStatement對象。
? setAutoCommit(Boolean
autoCommit):參數autoCommit表示是否自動提交,該方法用于設置自動提交。
5.2.2
Statement對象
執行操作數據庫的過程是,通過Connection連接對象獲取Statement對象,再通過Statement對象執行相關讀取或更新操作。Statement對象有兩種具體實現,他們分別為PreparedStatement和CallableStatement。PreparedStatement主要是用來預編譯SQL語句,這個對象主要是為了提高程序效率;CallableStatement繼承了PreparedStatement接口,用于存儲過程。
Statement對象是通過Connection對象的createStatement()方法來創建的。對于不是頻繁查詢記錄的應用而言,使用Statement對象是一個合適的做法,因為它不必像PreparedStatement對象一樣,需要預編譯。Statement對象的創建過程如下所示:
String URL =
"jdbc:mysql://localhost:3306/bank?username=root&password=root"
Connection
conn=DriverManager.getConnection(URL);
Statement st = conn.
createStatement();
有了Statement對象,就可以對數據庫進行查詢和更新操作。Statement的類路徑為java.sql.Statement。它的常用方法如下:
?
close():完成關閉Statement。
? executeQuery(String
sql):參數sql表示查詢SQL語句,該方法返回ResultSet對象。
? executeUpdate(String
sql):參數sq表示操作SQL語句,該方法返回更新的行數。
? execute(String
sql):參數sql表示操作SQL語句,該方法返回一個boolean值,表明是否返回了ResultSet對象。
? getResultSet()
:該方法ResultSet對象。
通常使用Statement的三個基本方法來執行SQL命令。下面分別介紹這三個方法。
1.
executeQuery()方法
主要是用來執行查詢命令,返回一個ResultSet對象,代碼如下所示:
String sql = “select *
from user”;
ResultSet rs = statement.
executeQuery(sql);
這個示例代碼是查詢user表的所有數據。
2.executeUpdate()方法
主要是用來執行增加,刪除及修改記錄操作,返回一個int整型值,此整型值是被更新的行數,代碼如下所示:
String sql = “insert into
user(name,age,sex) values(‘Jack,25,’男)”;
int num = statement.
executeUpdate (sql);
這個示例代碼是向user表中插入一行記錄。
3.execute()方法
主要是用來執行一般的SQL命令,包括增刪改查以及數據定義,返回一個布爾值,它顯示了是否返回一個查詢結果集ResultSet對象,查詢user表的所有數據代碼如下所示:
String sql = “select *
from user”;
boolean value =
statement. execute(sql);
5.2.3
PreparedStatement對象
除了普通的Statement之外,還有一種語句在實際應用中經常用到。這就是預編譯的PreparedStatement。PreparedStatement繼承了Statement接口,所謂預編譯,就是在創建語句對象時,將SQL執行語句一起進行編譯,然后寫入緩存,只保留參數動態輸入。這樣在執行相同的數據庫操作時,例如查詢某條記錄的信息,不必總是對查詢SQL命令進行編譯,而只是修改相應的參數,例如根據某個標識查詢記錄,就能獲得查詢結果,達到了提高效率的目的。
PreparedStatement對象是通過Connection對象的prepareStatement
()方法來創建的。prepareStatement()方法有一個參數,這個參數需要輸入所要執行的SQL語句。該SQL語句可以保留一個或多個參數作為動態輸入,如果需要有參數動態輸入,則此SQL語句的參數位置需要用“?”代替。然后需要根據參數的序號位置,分別調用不同類型的set方法將參數值動態輸入,示例代碼如下所示:
String URL =
"jdbc:mysql://localhost:3306/bank?username=root&password=root"
Connection conn
=DriverManager.getConnection(URL);
String sql = “select *
from user where id = ?”;
PreparedStatement pstmt =
conn. prepareStatement (sql);
pstmt.setString(1,”x001”);
ResultSet rs = pst.
executeQuery();
這個示例代碼主要是實現根據用戶標識從user表中查詢相關記錄數據。示例中,首先通過connection對象創建一個PreparedStatement對象,初始化時將用戶標識id作為動態輸入參數,之后使用setString方法輸入參數。如果需要查詢不同的用戶,則只要修改用戶標識id,而不需要重新編譯一個SQL命令,代碼如下所示:
String sql = “select *
from user where id = ?”;
PreparedStatement pstmt =
connection. prepareStatement (sql);
pstmt.setString(1,”x007”);
因為用戶標識id是字符串類型,所以在設置輸入參數時需要選擇setString方法,同理針對不同的參數類型,例如int類型用setInt方法。setString方法的第一個參數代表的是參數的序號位置,當有多個參數時,通過序號位置分別將參數嵌入其中,第二個參數是具體的參數值,當多個參數情況時,代碼如下所示:
String URL =
"jdbc:mysql://localhost:3306/bank?username=root&password=root"
Connection
conn=DriverManager.getConnection(URL);
String sql = “select *
from user where name = ? and age < ? and sex =
?”;
PreparedStatement pstmt =
connection. prepareStatement (sql);
pstmt.setString(1,”Jack”);//設置第一個參數
pstmt.setInt(2,”20”);//設置第二個參數
pstmt.setString(3,”男”);//設置第三個參數
ResultSet rs = pstmt.
executeQuery();//獲得結果集
PreparedStatement的常用方法如下:
?
close():該方法完成關閉Statement。
?
executeQuery():該方法輸出ResultSet對象。
?
executeUpdate():該方法輸出數據更新的行數。
? execute()
:該方法輸出boolean值,表明是否返回了ResultSet對象。
? setBoolean(int
paramIndex, boolean
x):參數paramIndex表示所傳遞的參數序號,參數x表示傳遞的是布爾類型參數值。
? setByte(int paramIndex,
byte
x):參數paramIndex表示所傳遞的參數序號,參數x表示該方法傳遞的是一個字節型參數值。
? setShort(int
paramIndex, short
x):參數paramIndex表示所傳遞的參數序號,參數x表示該方法傳遞的是一個短整型參數值。
? setInt(int paramIndex,
int x)
:參數paramIndex表示所傳遞的參數序號,參數x表示該方法傳遞的是一個整型參數值。
? setLong(int paramIndex,
long x)
:參數paramIndex表示所傳遞的參數序號,參數x表示該方法傳遞的是一個長整型參數值。
? setFloat(int
paramIndex, float x)
:參數paramIndex表示所傳遞的參數序號,參數x表示該方法傳遞的是一個浮點型參數值。
? setDouble(int
paramIndex, double x)
:參數paramIndex表示所傳遞的參數序號,參數x表示該方法傳遞的是一個雙精度型參數值。
? setBytes(int
paramIndex, byte[] x)
:參數paramIndex表示所傳遞的參數序號,參數x表示該方法傳遞的是一個字節數字參數值。
? setDate(int paramIndex,
java.sql.Date x)
:參數paramIndex表示所傳遞的參數序號,參數x表示該方法傳遞的是一個日期類型參數值。
? setTime(int paramIndex,
java.sql.Time x)
:參數paramIndex表示所傳遞的參數序號,參數x表示該方法傳遞的是一個時間參數值。
? setObject(int
paramIndex, Object x)
:參數paramIndex表示所傳遞的參數序號,參數x表示該方法傳遞的參數值是一個對象。
5.2.4
結果集ResultSet
java.sql.ResultSet接口封裝了這個結果集對象。其中的每條記錄結果代表了一個數據庫行。通常可以通過一個Statement對象,或PreparedStatement對象及一些其他子接口對象的executeQuery()方法,獲得結果集對象。通過Statement對象的execute()方法,執行一個SQL查詢命令,也可以獲得一個結果集對象,但不是直接獲取。它首先通過execute()方法返回的布爾值,判斷是否返回一個結果集對象,然后通過getResultSet()方法獲取一個ResultSet對象。在有些場合,需要同時返回多個結果集對象,這是就需要通過Statement對象的getMoreResults()方法來實現對結果集集合的遍歷。
在JDBC1.0中,結果集只能單向的滾動,即調用ResultSet的next()方法,使游標向后一行記錄滾動。所謂滾動,指的是游標在記錄行中的定位。在JDBC2.0中,擴展了上述滾動功能。使得滾動方式更加的靈活和可操控,例如JDBC2.0增加了前滾,即游標向當前記錄的前一行滾動,及向某一指定的記錄行跳轉等。
JDBC2.0中,設置結果集的滾動模式是在Connection對象中創建Statement對象(或PreparedStatement對象)時完成的。默認狀態下,滾動模式就是傳統的單向向后的滾動。如果以這種模式,生成結果集后,實現前滾或指向特定行等新增的滾動時,將會拋出異常。
設置滾動模式的方法如下所示。
public Statement
createStatement(int resultSetType, int resultSetConcurrency) throws
SQLException
該方法創建一個Statement對象,同時設置返回結果集的模式。
或者獲取PreparedStatement語句對象,語法格式如下所示。
public PreparedStatement
prepareStatement(String sql, int resultSetType, int
resultSetConcurrency)
throws
SQLException
該方法創建一個PreparedStatement對象,同時設置返回結果集的模式。
5.3
JDBC操作數據庫
數據庫程序常被稱為CURD程序,因為它包括數據的創建Create、更新Update、讀取查詢Read、刪除Delete等邏輯操作,取首字母縮寫便是CURD。CURD概括了數據庫的程序結構,程序無論大小,歸根結底都是這四種操作。這一節中將介紹利用JDBC技術實現對數據庫表的CURD操作。從建表開始,到表對應的實體類,然后是添加、查詢、修改和刪除
5.3.1
實現JDBC連接MySQL數據庫
在執行操作數據庫程序前,首先需要通過JDBC驅動建立與數據庫的連接。連接數據源有兩種方式,一是通過DriveManager類,一是通過DataSource接口及JNDI資源來獲取連接。本章主要介紹通過DriveManager類來連接數據庫。
DriveManager的類路徑為java.sql.DriverManager。它主要是完成驅動程序的裝載和建立新的數據庫連接。java.sql.DriverManager的常用方法如下:
? getConnection (String
URL):參數URL表示數據庫連接地址,該方法輸出Connection對象。
? getConnection(String
URL,String username, String
password):參數URL表示數據庫連接地址,參數username表示登錄數據庫用戶名,參數password表示登錄數據庫用戶口令。該方法輸出Connection對象。
建立數據庫連接,首先要加載數據庫驅動。針對不同的數據庫產品,有不同的數據庫驅動。要加載驅動,首先要獲取類包。本章的數據庫采用的是MySQL數據庫。需要的驅動包為mysql-connector-java-3.1.12-bin.jar,數據庫驅動類路徑為“com.mysql.jdbc.Driver”。
加載過程是使用Class.forName()方法將驅動加載到運行環境之中。加載的時候,驅動會自動向DriverManager完成注冊。加載驅動的代碼如下所示:
String driverName =
"com.mysql.jdbc.Driver"
try{
Class.forName(driverName);
}catch(Exception
e){
e.printStackTrace();
}
接著需要定義URL,即統一資源定位符
(Uniform Resource Locator),這個URL是指向數據源的。JDBC
URL的語法格式如下所示:
jdbc://
這一行代碼中,jdbc為指定協議。為數據庫連接機制的驅動。為數據庫地址。
以MySQL數據庫為例,數據庫連接地址URL代碼如下所示:
String URL =
"jdbc:mysql://localhost:3306/bank?username=root&password=root"
這個URL顯示連接數據庫地址為“localhost:3306”,數據庫名為“bank”,連接數據庫用戶為“root”及密碼為“root”。
有了驅動和連接地址后,需要使用DriveManager來獲取連接。代碼如下所示:
Connection
connection=DriverManager.getConnection(URL);
也可以使用另一種方法,代碼如下所示:
String URL =
"jdbc:mysql://localhost:3306/test ";
String username =
"root";
String password =
"root";
Connection
connection=DriverManager.getConnection(URL,username,password);
綜合上面的內容,可以得到獲取一個數據庫連接的大致過程。連接數據庫需要數據庫驅動和數據庫連接地址,以及數據庫的用戶名和密碼。
現在來編寫一個數據庫連接的類。在MyEclipse中新建一個Web工程,選擇JavaEE5.0規范,工程名為jdbc。把JDBC驅動mysql-connector-java-5.0.5-bin.jar拷貝到WebRoot/WEB-INF/lib目錄下。在該工程的src目錄下新建一個包,包名為con.cn.jdbc。在包中新建一個Java類,類名為JDBC_Connection,在類中編寫如下代碼(這里省略了import內容,源代碼見光盤第5章\5-3):
package
com.cn.jdbc;
public class
JDBC_Connection {
static String drivername
="com.mysql.jdbc.Driver";
static String
url="jdbc:mysql://localhost:3306/bank";
static String
username="root";
static String
password="root";
static{
try {
Class.forName(drivername);//創建驅動
System.out.println("創建驅動成功!");
} catch
(ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection
getConnection(){
Connection conn =
null;
try {
conn = (Connection)
DriverManager.getConnection(url, username,
password);
System.out.println("連接數據庫成功!");
} catch (SQLException e)
{
// TODO Auto-generated
catch block
e.printStackTrace();
}
return
conn;
}
public static void
main(String[] args) {
JDBC_Connection.getConnection();
}
}
在MyEclipse中運行該類,在控制臺中打印如下信息:
創建驅動成功!
連接數據庫成功!
這說明數據庫連接已經成功了。
在連接數據庫的類中,一般還要寫一個關閉連接的方法,每一次操作完成以后都要關閉連接。如果詩句訪問量很大的話,不關閉連接會影響數據庫的效率和性能,關閉連接方法的寫法如下:
public static void
free(ResultSet rs,Connection conn ,Statement
stmt){
try {
if(rs
!=null)
rs.close();//關閉結果集
} catch (SQLException e)
{
System.out.println("關閉ResultSet失敗!");
e.printStackTrace();
}finally
{
try {
if(conn !=
null)
conn.close();//關閉連接
} catch (SQLException e)
{
System.out.println("關閉Connection失敗!");
e.printStackTrace();
}finally{
try {
if(stmt !=
null)
stmt.close();//關閉Statement對象
} catch (SQLException e)
{
System.out.println("關閉Statement失敗!");
e.printStackTrace();
}
}
}
}
5.3.2
使用JDBC往數據庫表插入數據
Java程序也可以執行INSERT語句往數據庫插入數據,方法仍然是使用Statement對象,也可以是PreparedStatement對象,執行INSERT語句是要使用executeUpdate(String
sql)方法。executeUpdate()方法用以執行INSERT,UPDATE,DELETE等等,返回數據庫中影響的行數,返回int類型。
在往數據庫表格中插入數據時,首先數據庫中要存在表,還需要用到數據庫表對應的實體類。在MySQL中創建一張表,SQL語句如下(源代碼見光盤第5章\5-3)::
CREATE TABLE users
(
id
int(11) NOT NULL,
name
varchar(20) DEFAULT NULL,
age
int(11) DEFAULT NULL,
tel
varchar(20) DEFAULT NULL,
address varchar(50) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT
CHARSET=gb2312;
每一張表格要對應一個實體類,實體類中的屬性對應著表格的字段名,同時,數據類型轉化要正確。表格對應的實體類代碼如下(源代碼見光盤第5章\5-3)::
package
com.cn.jdbc;
public class UserVo
{
private int
id;
private String
name;
private int
age;
private String
tel;
private String
address;
public String
getAddress() {
return
address;
}
public void
setAddress(String address) {
this.address =
address;
}
public int getAge()
{
return
age;
}
public void setAge(int
age) {
this.age =
age;
}
public int getId()
{
return
id;
}
public void setId(int id)
{
this.id =
id;
}
public String getName()
{
return
name;
}
public void
setName(String name) {
this.name =
name;
}
public String getTel()
{
return
tel;
}
public void setTel(String
tel) {
this.tel =
tel;
}
}
把使用JDBC技術把數據插入到表格中,首先需要連接數據庫,然后執行插入的SQL語句,往數據庫表中插入數據的代碼如下(這里省略了import內容,源代碼見光盤第5章\5-3):
package
com.cn.jdbc;
public class AddUser
{
public void add(UserVo
userVo){
Connection conn =
null;
PreparedStatement pstm =
null;
ResultSet rs =
null;
try {
//調用JDBC_Connection類的getConnection方法連接數據庫
conn =
JDBC_Connection.getConnection();
//添加數據的sql語句
String sql = "insert into
users(id,name,age,tel,address)
values(?,?,?,?,?)";
pstm =
conn.prepareStatement(sql);
pstm.setInt(1,
userVo.getId());//把添加的id值存入pstm對象中,int類型的值用setInt()方法
//把添加的name值存入pstm對象中String類型的值用setString方法
pstm.setString(2,userVo.getName());
pstm.setInt(3,userVo.getAge());//把添加的age值存入pstm對象中
pstm.setString(4,
userVo.getTel());//把添加的tel值存入pstm對象中
pstm.setString(5,
userVo.getAddress());//把添加的address值存入pstm對象中
pstm.executeUpdate();//提交pstm對象
System.out.println("添加成功!添加的內容如下:");
System.out.println("id:"+userVo.getId()+"\t
name:"+userVo.getName()
+"\t
age:"+userVo.getAge()+"\t tel:"+userVo.getTel()+
"\t
address:"+userVo.getAddress());
} catch (Exception e)
{
e.printStackTrace();
} finally
{
JDBC_Connection.free(rs,
conn, pstm);
}
}
public static void
main(String[] args) {
AddUser addUser = new
AddUser();
UserVo userVo = new
UserVo();
int id
=207;
String
name="趙六";
int age=22
;
String
tel="324242";
String address =
"北京海淀區";
//下面是設置要添加的變量值,放入UserVo對象中
userVo.setId(id);
userVo.setName(name);
userVo.setAge(age);
userVo.setTel(tel);
userVo.setAddress(address);
//調用add()方法,把UserVo對象作為參數傳遞
addUser.add(userVo);
}
}
在MyEclipse中運行上述代碼,控制臺打印的信息如下:
創建驅動成功!
連接數據庫成功!
添加成功!添加的內容如下:
id:207 name:趙六 age:22
tel:324242 address:北京海淀區
5.3.3
使用JDBC查詢數據庫表數據
查詢用到select語句,當使用JDBC技術查詢表中的全部內容時,需要使用查詢全部的SQL語句,把查詢結果放到List集合中。代碼如下(這里省略了import內容,源代碼見光盤第5章\5-3):
package
com.cn.jdbc;
public class Query
{
public
List
showUser(){
Connection conn =
null;
Statement stmt =
null;
ResultSet rs =
null;
List
list = new
ArrayList();//聲明一個List集合,用于存放查詢出的數據
try {
conn =
JDBC_Connection.getConnection();//連接數據庫
stmt =
conn.createStatement();//建立Statement對象
rs =
stmt.executeQuery("select * from users");
while(rs.next()){//結果集存在,則進行循環遍歷
UserVo userVo = new
UserVo();
userVo.setId(rs.getInt("id"));
userVo.setName(rs.getString("name"));
userVo.setAge(rs.getInt("age"));
userVo.setTel(rs.getString("tel"));
userVo.setAddress(rs.getString("address"));
list.add(userVo);//把每次獲得的對象數據放入list集合中
}
} catch (SQLException e)
{
// TODO Auto-generated
catch block
e.printStackTrace();
}finally{
JDBC_Connection.free(rs,
conn, stmt);//關閉連接
}
return
list;
}
public static void
main(String[] args) {
Query query = new
Query();
List
list=query.showUser();//調用查詢方法
//如果list集合不為空,則循環遍歷打印出所有的信息
if(list!=null){
System.out.print("id
");
System.out.print("name
");
System.out.print("age
");
System.out.print("tel
");
System.out.print("address
");
System.out.println();
for (int i = 0; i
< list.size(); i++) {
System.out.print(list.get(i).getId()+"\t");
System.out.print(list.get(i).getName()+"\t");
System.out.print(list.get(i).getAge()+"\t");
System.out.print(list.get(i).getTel()+"\t\t");
System.out.print(list.get(i).getAddress()+"\t");
System.out.println();
}
}
}
}
上述代碼中,調用JDBC_Connection的getConnection()方法來連接數據庫,然后執行查詢全部的SQL語句,在MyEclipse中運行上述代碼,在控制臺中打印出如下信息:
創建驅動成功!
連接數據庫成功!
id ?name ?age ?tel
address
2 ?戰三
22
456124456 中國
4 ?李四
22
456124456 中國北京
107 ?Jack ?19
123-465465 銀河系
207 ?趙六
22 ?324242 北京海淀區
234 ?為其
23
235346 誰都
867 ?兒童
4 ?45655 ?地方
2345
阿凡達 ?21 ?2342 ?阿達的
3454 ?趙六 ?22 ?256465 阿薩德
5.3.4
使用JDBC查詢指定條件的數據
在實際開發中,有時候會需要根據指定條件來查詢出相關數據,根據指定條件來查詢數據,使用select語句中的條件查詢,需要用到where子語句。下面的代碼是根據id查詢的例子(這里省略了import內容,源代碼見光盤第5章\5-3)。
package
com.cn.jdbc;
public class QueryById
{
public UserVo
queryUserById(int id) {
UserVo userVo =
null;
Connection conn =
null;
PreparedStatement pstmt =
null;
ResultSet rs =
null;
try {
conn =
JDBC_Connection.getConnection();
pstmt =
conn.prepareStatement("select * from users where id =
?");
pstmt.setInt(1,
id);//設置條件id
rs
=pstmt.executeQuery();
while(rs.next()){//結果集存在,則遍歷結果,放入UserVo對象中
userVo = new
UserVo();
userVo.setId(rs.getInt("id"));
userVo.setName(rs.getString("name"));
userVo.setAge(rs.getInt("age"));
userVo.setTel(rs.getString("tel"));
userVo.setAddress(rs.getString("address"));
}
} catch (SQLException e)
{
// TODO Auto-generated
catch block
e.printStackTrace();
}finally{
JDBC_Connection.free(rs,
conn, pstmt);//關閉連接
}
return
userVo;
}
public static void
main(String[] args) {
QueryById byId = new
QueryById();
int id
=207;
UserVo
vo=byId.queryUserById(id);
if(vo!=null){
System.out.print("id\t
");
System.out.print("name\t
");
System.out.print("age\t");
System.out.print("tel\t");
System.out.print("
address");
System.out.println();
System.out.print(vo.getId()+"\t");
System.out.print(vo.getName()+"\t");
System.out.print(vo.getAge()+"\t");
System.out.print(vo.getTel()+"\t");
System.out.print(vo.getAddress()+"\t");
System.out.println();
}else{
System.out.println("id為"+id+"的用戶不存在!");
}
}
}
上述代碼中,調用JDBC_Connection的getConnection()方法來連接數據庫,傳遞一個id值為207的參數給條件查詢的SQL語句。在MyEclipse中運行上述代碼,在控制臺中打印效果如下:
創建驅動成功!
連接數據庫成功!
id name age tel
address
207 趙六 22 324242 北京海淀區
5.3.5
使用JDBC刪除表數據
刪除數據使用Statement的executeUpdate(String
sql)方法執行DELETE語句。與INSERT不同的是,DELETE必須使用WHERE條件指定刪除哪一行數據,否則將刪除所有數據。對于有主鍵的表來說,可以使用主鍵來標識哪一行數據,因為主鍵值是唯一的,不可重復的。根據id刪除的方法如下(這里省略了import內容,源代碼見光盤第5章\5-3):
package
com.cn.jdbc;
public class DeleteUser
{
public void
deleteUser(int id) {
Connection conn =
null;
PreparedStatement pstmt =
null;
try {
conn
=JDBC_Connection.getConnection();
String sql = "delete from
users where id =?";
pstmt =
conn.prepareStatement(sql);
pstmt.setInt(1,
id);//給sql語句里的id賦值
pstmt.executeUpdate();
System.out.println("刪除成功!刪除了id值為"+id+"的數據");
} catch (SQLException e)
{
// TODO Auto-generated
catch block
e.printStackTrace();
}finally{
JDBC_Connection.free(null,
conn, pstmt);//關閉連接
}
}
public static void
main(String[] args) {
DeleteUser deleteUser =
new DeleteUser();
int id =
1;
UserVo userVo = new
UserVo();
QueryById queryById = new
QueryById();
userVo =
queryById.queryUserById(id);//調用根據id查詢的方法查詢出id=2的數據
if (userVo != null)
{//如果查詢出的數據不為空,則執行刪除方法
deleteUser.deleteUser(id);
}else
{
System.out.println("刪除失敗!原因:id為"+id+"的數據不存在!");//數據為空則打印刪除失敗信息
}
}
總結
以上是生活随笔為你收集整理的stmt在java中的应用_JDBC技术基础总结转载,非原创的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java减少依赖_去掉JAVA部分依赖的
- 下一篇: java农耕者_蒯通——大才也,《史记》