Java面向對象筆記 • 【第9章 JDBC編程】

全部章節   >>>>


本章目錄

9.1 JDBC基礎

9.1.1 JDBC簡介

9.1.2 JDBC常用API簡介

JDBC 常用API功能說明

9.1.3 JDBC編程步驟

9.1.4 實踐練習

9.2 PreparedStatement執行DML語句

9.2.1 PreparedStatement接口

9.2.2 使用PreparedStatement執行insert操作

9.2.3 實踐練習

9.3 數據庫操作封裝類DBConnection

9.3.1 定義數據庫操作封裝類

9.3.2 實踐練習

9.4 PreparedStatement執行查詢語句

9.4.1 ResultSet對象

ResultSet類常用方法

9.4.2 操作ResultSet對象

9.4.3 實踐練習

總結:


9.1 JDBC基礎

9.1.1 JDBC簡介

JDBCJava Database ConnectivityJava數據庫連接是一種可以執行SQL語句的Java API

  • 通過JDBC API連接到數據庫,並使用結構查詢語句實現對數據庫的查詢、更新等操作
  • 使用JDBC開發數據庫應用可以跨平臺運行並且可以數據庫
  • 通過JDBC API,不必爲訪問SybaseDB2等數據庫學習新的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

用於執行 INSERTUPDATE DELETE 語句以及 SQL DDL語句(例如 CREATE TABLE DROP TABLE)。

INSERTUPDATE 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、回收數據庫資源

回收數據庫資源,包括關閉ResultSetStatementConnection資源

示例:演示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記錄的指針來獲取結果集合的內容。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章