淺談JDBC與MyBatis

淺談JDBC與MyBatis

MyBatis是一個(gè)基于Java的、封裝了JDBC的持久層框架撰糠。

1 JDBC

JDBC(Java Data Base Connectivity)表示Java數(shù)據(jù)庫(kù)連接峦筒。在Java語(yǔ)言中,我們使用JDBC來(lái)操作關(guān)系型數(shù)據(jù)庫(kù)窗慎。

1.1 案例代碼

package core;

import java.sql.*;

/**
 * JDBC案例類.
 *
 * @author 李程鵬
 */
public class JDBC {
    public static void main(String[] args) {
        // 定義連接對(duì)象
        Connection connection = null;
        // 定義預(yù)編譯語(yǔ)句對(duì)象
        PreparedStatement preparedStatement = null;
        // 定義結(jié)果集對(duì)象
        ResultSet resultSet = null;
        try {
            // 加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)
            Class.forName("com.mysql.jdbc.Driver");
            // 通過(guò)數(shù)據(jù)庫(kù)驅(qū)動(dòng)獲取數(shù)據(jù)庫(kù)連接
            connection = DriverManager.
                    getConnection("jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf-8", "root", "root");
            // 定義并初始化SQL語(yǔ)句
            String sql = "select * from user where id = ?";
            // 創(chuàng)建預(yù)編譯語(yǔ)句對(duì)象
            preparedStatement = connection.prepareStatement(sql);
            // 設(shè)置查詢參數(shù)
            preparedStatement.setString(1, "1");
            // 向數(shù)據(jù)庫(kù)發(fā)出SQL并執(zhí)行查詢,獲取查詢結(jié)果集.
            resultSet = preparedStatement.executeQuery();
            // 遍歷查詢結(jié)果集
            while (resultSet.next()) {
                // 輸出查詢結(jié)果
                System.out.println("id = " + resultSet.getString("id"));
                System.out.println("name = " + resultSet.getString("name"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally { // 釋放資源
            if (resultSet != null) {
                try {
                    // 關(guān)閉結(jié)果集對(duì)象
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (preparedStatement != null) {
                try {
                    // 關(guān)閉預(yù)編譯語(yǔ)句對(duì)象
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (connection != null) {
                try {
                    // 關(guān)閉連接對(duì)象
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

1.2 問(wèn)題分析

上面的JDBC代碼存在以下幾個(gè)問(wèn)題:

  • 頻繁地開(kāi)啟和關(guān)閉數(shù)據(jù)庫(kù)連接,嚴(yán)重地影響了數(shù)據(jù)庫(kù)的性能卤材。
  • 代碼中存在硬編碼遮斥。每當(dāng)需求變更時(shí),都需要修改源代碼然后重新編譯扇丛,系統(tǒng)不易維護(hù)术吗。硬編碼的具體體現(xiàn):
    • SQL語(yǔ)句中的查詢條件(String sql = "select * from user where id = ?";)。如果需求變更帆精,改為根據(jù)用戶主鍵和用戶名進(jìn)行查詢较屿,那么就需要修改源代碼。
    • 設(shè)置查詢參數(shù)時(shí)的參數(shù)位置和參數(shù)值(preparedStatement.setString(1, "1");)卓练。如果SQL語(yǔ)句由于需求變更而發(fā)生變化隘蝎,那么原來(lái)編寫(xiě)的賦值語(yǔ)句就可能出錯(cuò),需要修改源代碼襟企。
    • 獲取查詢結(jié)果時(shí)指定的列名(resultSet.getString("name");)嘱么。如果數(shù)據(jù)表的字段名發(fā)生了變化,那么就需要修改源代碼顽悼。
  • 設(shè)置查詢參數(shù)的過(guò)程繁瑣曼振。因?yàn)樵谠O(shè)置查詢參數(shù)的過(guò)程中,需要為查詢語(yǔ)句中不同位置上的占位符設(shè)置不同的值蔚龙。
  • 獲取查詢結(jié)果的過(guò)程繁瑣冰评。因?yàn)樵讷@取查詢結(jié)果的過(guò)程中,需要遍歷查詢結(jié)果集木羹,而且在遍歷的過(guò)程中還需要根據(jù)數(shù)據(jù)表的列名才可以獲取出其值甲雅。

2 MyBatis

MyBatis是一個(gè)優(yōu)秀的持久層框架,它對(duì)JDBC操作數(shù)據(jù)庫(kù)的過(guò)程進(jìn)行了封裝汇跨,使開(kāi)發(fā)者只需要關(guān)注SQL本身务荆,而不需要花費(fèi)精力去處理例如注冊(cè)驅(qū)動(dòng)、創(chuàng)建連接穷遂、創(chuàng)建執(zhí)行語(yǔ)句函匕、手動(dòng)設(shè)置參數(shù)和結(jié)果集檢索等繁雜的過(guò)程。

MyBatis通過(guò)封裝JDBC解決了它在編程中出現(xiàn)的問(wèn)題蚪黑,解決的技術(shù)方案主要有以下五種:

  • 數(shù)據(jù)庫(kù)連接池盅惜。我們可以在MyBatis的全局配置文件SqlMapConfig.xml中配置數(shù)據(jù)庫(kù)連接池中剩,使用它來(lái)管理數(shù)據(jù)庫(kù)連接,這樣就可以避免由于頻繁地創(chuàng)建和釋放數(shù)據(jù)庫(kù)連接而造成的資源浪費(fèi)抒寂。
  • SQL配置文件结啼。MyBatis將SQL語(yǔ)句與Java源文件進(jìn)行分離,將SQL語(yǔ)句放置到配置文件Mapper.xml中屈芜。如果有需求變更需要修改SQL語(yǔ)句郊愧,那么只需要修改配置文件即可。修改配置文件的維護(hù)成本比修改Java源文件的成本要低井佑,因?yàn)樾薷呐渲梦募笾貑⑾到y(tǒng)就可以生效属铁,但是如果修改的是Java源文件,那么就需要經(jīng)過(guò)修改躬翁、編譯焦蘑、打包、發(fā)布和重啟五個(gè)步驟盒发。
  • 動(dòng)態(tài)SQL語(yǔ)句例嘱。MyBatis使用動(dòng)態(tài)SQL技術(shù)解決了JDBC編程中存在的SQL硬編碼的問(wèn)題。
  • 輸入映射宁舰。MyBatis通過(guò)輸入映射技術(shù)將Java對(duì)象映射至SQL語(yǔ)句拼卵,SQL語(yǔ)句可以通過(guò)使用該Java對(duì)象取出查詢參數(shù)值,簡(jiǎn)化了JDBC中設(shè)置查詢參數(shù)的過(guò)程蛮艰。
  • 輸出映射间学。MyBatis通過(guò)輸出映射技術(shù)將SQL的執(zhí)行結(jié)果映射至Java對(duì)象,省去了JDBC編程中對(duì)結(jié)果集檢索的過(guò)程印荔。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末低葫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仍律,更是在濱河造成了極大的恐慌嘿悬,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件水泉,死亡現(xiàn)場(chǎng)離奇詭異善涨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)草则,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)钢拧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人炕横,你說(shuō)我怎么就攤上這事源内。” “怎么了份殿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵膜钓,是天一觀的道長(zhǎng)嗽交。 經(jīng)常有香客問(wèn)我,道長(zhǎng)颂斜,這世上最難降的妖魔是什么夫壁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮沃疮,結(jié)果婚禮上盒让,老公的妹妹穿的比我還像新娘。我一直安慰自己司蔬,他們只是感情好糯彬,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著葱她,像睡著了一般。 火紅的嫁衣襯著肌膚如雪似扔。 梳的紋絲不亂的頭發(fā)上吨些,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音炒辉,去河邊找鬼豪墅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛黔寇,可吹牛的內(nèi)容都是我干的偶器。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼缝裤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屏轰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起憋飞,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤霎苗,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后榛做,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體唁盏,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年检眯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厘擂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锰瘸,死狀恐怖刽严,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情避凝,我是刑警寧澤港庄,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布倔既,位于F島的核電站,受9級(jí)特大地震影響鹏氧,放射性物質(zhì)發(fā)生泄漏渤涌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一把还、第九天 我趴在偏房一處隱蔽的房頂上張望实蓬。 院中可真熱鬧,春花似錦吊履、人聲如沸安皱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酌伊。三九已至,卻和暖如春缀踪,著一層夾襖步出監(jiān)牢的瞬間居砖,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工驴娃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奏候,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓唇敞,卻偏偏與公主長(zhǎng)得像蔗草,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疆柔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容