全部章節 >>>>
本章目錄
9.2.2 使用PreparedStatement執行insert操作
9.1 JDBC基礎
9.1.1 JDBC簡介
JDBC(Java Database Connectivity),即Java數據庫連接。它是一種可以執行SQL語句的Java API。
- 通過JDBC API可連接到數據庫,並使用結構化查詢語句實現對數據庫的查詢、更新等操作。
- 使用JDBC開發數據庫應用可以跨平臺運行,並且可以跨數據庫。
- 通過JDBC API,不必爲訪問Sybase、DB2等數據庫學習新的API,從而極大的簡化了開發人員使用Java語言對數據庫的操作。
- 爲使JDBC程序可以跨平臺,需要不同的數據庫廠商提供相應的驅動程序。
9.1.2 JDBC常用API簡介
JDBC提供了獨立於數據庫的統一API,用於幫助用戶建立與數據庫的連接、執行SQL語句和檢索結果集等。JDBC API位於java.sql包。
JDBC 常用API功能說明
類和接口 |
功能 |
java.sql.DriverManager |
管理JDBC驅動程序,使用它可以獲取Connection對象 |
java.sql.Connection |
建立與特定數據庫的連接(會話),建立後可以執行SQL語句 |
java.sql.Statement |
用於執行SQL語句 |
java.sql.PreparedStatement |
預編譯的Statement,它是Statement的子接口 |
java.sql.CallableStatement |
用於執行存儲過程的Statement,它是Statement的子接口 |
java.sql.ResultSet |
結果集對象。該對象包含訪問查詢結果的方法,Result可以通過索引或列名獲得列數據 |
9.1.3 JDBC編程步驟
1、加載數據庫驅動
將數據庫驅動文件(jar文件)拷貝到classpath路徑下。
加載驅動代碼:Class.forName("com.mysql.jdbc.Driver");
2、獲得數據庫連接
Connection conn=DriverManager.getConnection(URL, USER, PASSWORD)
示例:
Connection conn = DriverManager.getConnection("jdbc:mysql:///localhost:3306/data","root", "root");
3、通過Connection實例獲取Statement對象
Statement stmt = conn.createStatement();
4、使用Statement實例執行SQL語句
int executeUpdate(String sql) throws SQLException
用於執行 INSERT、UPDATE 或 DELETE 語句以及 SQL DDL語句(例如 CREATE TABLE 和 DROP TABLE)。
INSERT、UPDATE 或 DELETE 語句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一個整數,指示受影響的行數。
對於 CREATE TABLE 或 DROP TABLE 等不操作行的語句,executeUpdate 的返回值總爲零。
5、使用Statement實例執行SQL語句
ResultSet executeQuery(String sql) throws SQLException
用於產生單個結果集的語句,例如 SELECT 語句。
boolean execute(String sql) throws SQLException
運行可返回多個結果的SQL語句。如果結果是 ResultSet 對象,則方法 execute 返回 true;如果結果是 Java int,則返回 false。
6、處理ResultRest結果集
如果執行的SQL語句是查詢語句,則執行結果將返回一個ResultSet對象,該對象保存了與SQL語句查詢的結果。
7、回收數據庫資源
回收數據庫資源,包括關閉ResultSet、Statement和Connection資源。
示例:演示JDBC編程步驟
public class DbConnection {
private static final String DRIVERNAME="com.mysql.jdbc.Driver"; //驅動類的類名
private static final String URL="jdbc:mysql://localhost:3306/data"; //連接數據的URL路徑
private static final String USER="root"; //數據庫登錄賬號
private static final String PASSWORD="root"; //數據庫登錄密碼
static{ //1.加載驅動,驅動僅需加載一次即可
try {
Class.forName(DRIVERNAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//接下一頁
}
public class DbConnection {
//接上一頁
//2.獲取數據庫連接
public static Connection getConnection() {
Connection conn=null;
try {
return conn= DriverManager.getConnection(URL, USER,PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void main(String[] args) {
Connection conn=DbConnection.getConnection();
System.out.println("數據庫連接="+conn);
}
}
9.1.4 實踐練習
9.2 PreparedStatement執行DML語句
9.2.1 PreparedStatement接口
- PreparedStatement接口繼承自Statement接口,其比Statement使用更爲靈活高效。
- PreparedStatement接口提供了更爲安全的預處理功能,此功能可以有效防止SQL注入。
- PreparedStatement接口會對sql語句進行預編譯處理(如果JDBC驅動支持的話)。預編譯的sql查詢語句能在將來的查詢中重用,因此查詢速度更快。
- Connection實例生成PreparedStatement 實例時,對於SQL語句中輸入參數的值,創建時並未被指定,而是保留問號“?”作爲佔位符。
PreparedStatement pst = conn.prepareStatement("update Emp set name=?,address=? ,phone=?,Where no=?");
/* 輸入參數賦值時使用setXxx(index,value)方法,其中Xxx爲參數數據類型,index爲參數編號,
value爲參數值 */
pst.setString(1,"李彥宏");
pst.setString(2,"中國北京");
pst.setInt(3,17710398436);
pst.setString(4,"EMP-001" );
9.2.2 使用PreparedStatement執行insert操作
示例: 新增一條員工數據
public class Emp { //員工實體類
private String no;//員工編號
private String name;//姓名
private String birthday;//生日
private String address;//住址
private String post;//職務
//省略屬性的getter和setter方法
}
public class ExecuteStatement {
public boolean insertData(Emp emp){//向數據庫中插入員工數據
...
try {
String sql=" insert into t_emp(no,name,birthday,address,post) values(?,?,?,?,?)";
conn=getConnection();//獲取數據庫連接
//獲取PraparedStatement對象
pStmt=conn.prepareStatement(sql);
//將佔位符“?”使用預處理的方式替換成員工的賬號,1表示第一個“?”佔位符
pStmt.setString(1, emp.getNo());
pStmt.setString(2, emp.getName());
...
//執行SQL語句
return pStat.executeUpdate()>0?true:false;
} catch (Exception e) {
e.printStackTrace();
}finally{ //關閉相關資源 }
return false;
}
public static void main(String[] args) { //測試新增一條員工數據 }
}
public class ExecuteStatement {
public boolean updateData(Emp emp){//更新員工數據
...
try {
String sql=" update t_emp set name=?,birthday=?,address=?,post=?"
+" where no=?";
conn=getConnection();//獲取數據庫連接
//獲取PraparedStatement對象
pStmt=conn.prepareStatement(sql);
pStmt.setString(1, emp.getName());
...
pStmt.setString(5, emp.getNo());
//執行SQL語句
return pStat.executeUpdate()>0?true:false;
} catch (Exception e) {
e.printStackTrace();
}finally{ //關閉相關資源 }
return false;
}
public static void main(String[] args) { //測試更新一條員工數據 }
}
9.2.3 實踐練習
9.3 數據庫操作封裝類DBConnection
9.3.1 定義數據庫操作封裝類
將數據連接與關閉操作封裝成工具類DbConnection
public class DbConnection {
//驅動類的類名
private static final String DRIVERNAME="com.mysql.jdbc.Driver";
//連接數據的URL路徑
private static final String URL="jdbc:mysql://localhost:3306/data";
//數據庫登錄賬號
private static final String USER="root";
//數據庫登錄密碼
private static final String PASSWORD="root";
//1.加載驅動,驅動僅需加載一次即可
static{
try {
Class.forName(DRIVERNAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//接下一頁
}
public class DbConnection {
//接上一頁
public static Connection getConnection() throws Exception {//獲取數據庫連接
try {
return DriverManager.getConnection(URL, USER,PASSWORD);
} catch (SQLException e) {
e.printStackTrace(); throw new Exception();
}
}
//關閉連接
public static void colse(ResultSet rs,Statement stmt,Connection conn) throws Exception{
try { if (rs != null){ rs.close(); }
if (stmt != null) { stat.cancel(); }
if (conn != null) { conn.close(); }
} catch (Exception e) {
e.printStackTrace(); throw new Exception();
}
}
}
9.3.2 實踐練習
9.4 PreparedStatement執行查詢語句
9.4.1 ResultSet對象
- Statement對象的executeQuery()方法的返回值爲ResultSet對象,該對象保存了與SQL語句查詢的結果。
- JDBC使用ResultSet封裝查詢到的結果,然後通過ResultSet記錄的指針來獲取結果集合的內容。
ResultSet類常用方法
方法名 |
作用 |
boolean next() |
判斷Result結果集中是否還有數據,如果有返回true,沒有返回false |
String getString(Stirng columnName) |
按照查詢表的列名,獲取該列所對應的列值 |
String getString(int columnIndex) |
按照查詢表的列的序號,獲取該列所對應的列值 |
9.4.2 操作ResultSet對象
示例:操作員工的ResultSet結果集獲取員工信息
public List<Emp> queryEmp(){
Connection conn=null;
PreparedStatement pStmt=null;
ResultSet rs=null;
try {
String sql="select * from t_emp";
conn=DbConnection.getConnection();
pStmt=conn.prepareStatement(sql);
rs=pStat.executeQuery(); //返回ResultSet實例
List<Emp> empList=new ArrayList<Emp>();
//判斷結果集中是否還有數據
while(rs.next()){
String no=rs.getString("no"); //通過列名爲no獲取對應的列值
String name=rs.getString("name"); //通過列名爲name獲取對應的列值
...
Emp emp=new Emp();
//將從ResultSet結果集獲取到信息封裝至emp對象中
emp.setNo(no);
emp.setName(name);
...
}
return empList;
} catch (Exception e) {e.printStackTrace();}
finally{
try { DbConnection.colse(rs, pStat, conn); //釋放資源 }
catch (Exception e) {e.printStackTrace();}
}
return null;
}
9.4.3 實踐練習
總結:
- 通過JDBC API可連接到數據庫,並使用結構化查詢語句實現對數據庫的查詢、更新等操作。使用JDBC開發數據庫應用可以跨平臺運行,並且可以跨數據庫。
- JDBC編程步驟:1.加載數據庫驅動 2.獲得數據庫連接 3.通過Connection實例獲取Statement對象 4.使用Statement實例執行SQL語句 5.處理ResultRest結果集 6.回收數據庫資源
- PreparedStatement接口繼承自Statement接口,該接口會對sql語句進行預編譯處理,因此查詢速度更快。Connection實例生成PreparedStatement 實例時,對於SQL語句中輸入參數的值,創建時並未被指定,而是保留問號“?”作爲佔位符。
- Statement對象的executeUpdate(String sql) 返回受影響的行數,Statement對象的executeQuery(String sql) 返回查詢結果集,即ResultSet對象。
- 可以通過ResultSet記錄的指針來獲取結果集合的內容。