1. 程式人生 > >原生JDBC開發步驟

原生JDBC開發步驟

【JDBC查詢步驟】

我們先看看我們最熟悉也是最基礎的通過JDBC查詢資料庫資料,一般需要以下七個步驟:

(1)  載入JDBC驅動
(2)  建立並獲取資料庫連線
(3)  建立 JDBC Statements 物件
(4)  設定SQL語句的傳入引數
(5)  執行SQL語句並獲得查詢結果
(6)  對查詢結果進行轉換處理並將處理結果返回

(7)  釋放相關資源(關閉Connection,關閉Statement,關閉ResultSet)

程式碼展示:

	package cn.itcast.mybatis.jdbc;
	
	import java.sql.Connection;
	import java.sql.DriverManager;
	import java.sql.PreparedStatement;
	import java.sql.ResultSet;
	import java.sql.SQLException;
	
	public class JdbcTest {
		
		public static void main(String[] args) {
			
			//資料庫連線
			Connection connection = null;
			//預編譯的Statement,使用預編譯的Statement提高資料庫效能
			PreparedStatement preparedStatement = null;
			//結果 集
			ResultSet resultSet = null;
			
			try {
				//載入資料庫驅動                                                               
				Class.forName("com.mysql.jdbc.Driver");
				
				//通過驅動管理類獲取資料庫連結
				connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "mysql");
				//定義sql語句 ?表示佔位符
				String sql = "select * from user where username = ?";
				//獲取預處理statement
				preparedStatement = connection.prepareStatement(sql);
				//設定引數,第一個引數為sql語句中引數的序號(從1開始),第二個引數為設定的引數值
				preparedStatement.setString(1, "王五");
				//向資料庫發出sql執行查詢,查詢出結果集
				resultSet =  preparedStatement.executeQuery();
				//遍歷查詢結果集
				while(resultSet.next()){
					System.out.println(resultSet.getString("id")+"  "+resultSet.getString("username"));
				}
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				//釋放資源
				if(resultSet!=null){
					try {
						resultSet.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if(preparedStatement!=null){
					try {
						preparedStatement.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if(connection!=null){
					try {
						connection.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
	
			}
	
	
		}
	}
【問題】

1、資料庫連線,使用時就建立,不使用立即釋放,對資料庫進行頻繁連線開啟和關閉,造成資料庫資源浪費,影響 資料庫效能。使用資料庫連線池管理資料庫連線。但是現在連線池多種多樣,可能存在變化,有可能採用DBCP的連線池,也有可能採用容器本身的JNDI資料庫連線池。

設想:我們可以通過DataSource進行隔離解耦,我們統一從DataSource裡面獲取資料庫連線,DataSource具體由DBCP實現還是由容器的JNDI實現都可以,所以我們將DataSource的具體實現通過讓使用者配置來應對變化。
 
2、將sql語句硬編碼到java程式碼中,如果sql 語句修改,需要重新編譯java程式碼,不利於系統維護。而且在每個功能都會對資料表進行操作,很多時候就會遇到一個SQL重複的問題,幾個功能的SQL語句其實都差不多,有些可能是SELECT後面那段不同、有些可能是WHERE語句不同。有時候表結構改了,那麼我們就需要改多個地方,不利於維護。

設想:將sql語句配置在xml配置檔案中,即使sql變化,不需要對java程式碼進行重新編譯。當我們的程式碼程式出現重複程式碼時怎麼辦?將重複的程式碼抽離出來成為獨立的一個類,然後在各個需要使用的地方進行引用。對於SQL重複的問題,我們也可以採用這種方式,通過將SQL片段模組化,將重複的SQL片段獨立成一個SQL塊,然後在各個SQL語句引用重複的SQL塊,這樣需要修改時只需要修改一處即可。
 
 
3、向preparedStatement中設定引數,對佔位符號位置和設定引數值,硬編碼在java程式碼中,不利於系統維護。

設想:將sql語句及佔位符號和引數全部配置在xml中。
 
4、從resutSet中遍歷結果集資料時,存在硬編碼,將獲取表的欄位進行硬編碼,,不利於系統維護。

設想:將查詢的結果集,自動對映成java物件。

【總結】

既然jdbc有這麼多可以改進的空間,那麼就是mybatis和hibernate出現的理由,敬請期待呦