原生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出現的理由,敬請期待呦