MyBatis詳解2.MyBatis使用入門(mén)

字節(jié)跳動(dòng)飛書(shū)內(nèi)推厕怜!
北京衩匣、杭州蕾总、武漢、廣州琅捏、深圳生百、上海,六大城市等你來(lái)投午绳。
感興趣的朋友可以私我咨詢&內(nèi)推置侍,也可以通過(guò)鏈接直接投遞
海量HC拦焚,極速響應(yīng)蜡坊,快來(lái)和我成為同事吧。
今日頭條赎败、抖音丛肢、Tik Tok也可以內(nèi)推~

點(diǎn)擊進(jìn)入我的博客

MyBatis詳解1.概述
MyBatis詳解2.MyBatis使用入門(mén)
MyBatis詳解3.MyBatis配置詳解
MyBatis詳解4.映射器Mapper
MyBatis詳解5.動(dòng)態(tài)SQL
MyBatis詳解6.MyBatis技術(shù)內(nèi)幕
MyBatis詳解7.插件
MyBatis詳解8.集成Spring

1 MyBatis的結(jié)構(gòu)

  • SqlSessionFactoryBuilder(構(gòu)造器):它會(huì)根據(jù)配置信息或者代碼來(lái)生成SqISessionFactory。
  • SqISessionFactory(工廠接口):依靠工廠來(lái)生成SqlSession
  • SqlSession(會(huì)話):是一個(gè)既可以發(fā)送SQL去執(zhí)行并返回結(jié)果纠屋,也可以獲取 Mapper的接口岖圈。
  • SQL Mapper:它是MyBatis新設(shè)計(jì)的組件,它是由一個(gè)Java接口和XML文件(或注解)構(gòu)成的搞糕,需要給出對(duì)應(yīng)的SQL和映射規(guī)則勇吊。它負(fù)責(zé)發(fā)送SQL去執(zhí)行,并返回結(jié)果窍仰。
MyBatis構(gòu)成

2 構(gòu)建SqISessionFactory

每個(gè)MyBatis應(yīng)用都是以SqlSessionFactory的實(shí)例為中心的汉规。 SqlSessionFactory的實(shí)例可以通過(guò)SqlSessionFactoryBuilder獲得。MyBatis提供了兩種模式去創(chuàng)建SqlSessionFactory:基于XML配置的方式和基于代碼的方式驹吮。


SqlSessionFactory類圖
Configuration類

Configuration類對(duì)象保存著我們配置在MyBatis的信息针史,這個(gè)對(duì)象將存在于整個(gè)MyBatis應(yīng)用的生命期中,以便重復(fù)讀取和運(yùn)用碟狞。我們可以解析一次配置的XML文件保存到Configuration類對(duì)象中啄枕,方便我們從這個(gè)對(duì)象中讀取配置信息。

兩個(gè)SqlSessionFactory的實(shí)現(xiàn)類

在MyBatis中提供了兩個(gè)SqlSessionFactory的實(shí)現(xiàn)類族沃,DefaultSqlSessionFactory和SqlSessionManager频祝。不過(guò)SqlSessionManager目前還沒(méi)有使用,MyBatis中目前使用的是DefaultSqlSessionFactory脆淹。

2.1 通過(guò)XML方式配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 配置每個(gè)DO的別名 -->
    <typeAliases>
        <typeAlias type="com.ankeetc.spring.domain.UserDomain" alias="user"/>
    </typeAliases>
    <!-- 配置環(huán)境內(nèi)容 -->
    <environments default="dev">
        <environment id="dev">
            <!-- 采用JDBC的事務(wù)管理模式 -->
            <transactionManager type="JDBC"/>
            <!-- 數(shù)據(jù)庫(kù)的連接信息 -->=
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置映射器 -->
    <mappers>
        <mapper resource="mappers/TbNameMapper.xml"/>
    </mappers>
</configuration>
    public SqlSessionFactory getSqlSessionFactory() throws Exception {
        // 獲取config源文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 通過(guò)SqlSessionFactoryBuilder構(gòu)造
        return new SqlSessionFactoryBuilder().build(is);
    }

2.2 通過(guò)編碼方式

    public SqlSessionFactory getSqlSessionFactory() throws Exception {
        // 構(gòu)建數(shù)據(jù)庫(kù)連接池
        PooledDataSource dataSource = new PooledDataSource();
        dataSource.setDriver("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUsername("root");

        // 構(gòu)建數(shù)據(jù)庫(kù)事務(wù)模式
        TransactionFactory transactionFactory = new JdbcTransactionFactory();

        // 創(chuàng)建數(shù)據(jù)庫(kù)運(yùn)行環(huán)境
        Environment environment = new Environment("dev", transactionFactory, dataSource);

        // 創(chuàng)建 Configuration 對(duì)象
        Configuration configuration = new Configuration(environment);
        // 配置MyBatis上下文別名
        configuration.getTypeAliasRegistry().registerAlias("user", UserDomain.class);
        // 配置映射器
        configuration.addMapper(TbNameMapper.class);
        // 使用SqlSessionFactoryBuilderg構(gòu)建SqlSessionFactory
        return new SqlSessionFactoryBuilder().build(configuration);
    }

3 創(chuàng)建SqlSession

SqlSession是一個(gè)接口類智润,扮演著門(mén)面的作用,而真正干活的是Executor接口未辆。只需要SqlSession參數(shù)信息和執(zhí)行的方法窟绷,然后等待返回的結(jié)果,而不需要關(guān)心Executor是怎么工作的咐柜。

SqlSession的兩個(gè)實(shí)現(xiàn)類
  • DefaultSqlSession
  • SqlSession
SqlSession的用法

SqlSession接口類似于一個(gè)JDBC中的Connection接囗對(duì)象兼蜈,我們需要保證每次用完正常關(guān)閉它攘残。正確的做法是把關(guān)閉SqlSession接口的代碼寫(xiě)在finally句中保證每次都會(huì)
關(guān)閉SqlSession,讓連接資源歸還給數(shù)據(jù)庫(kù)为狸。

    public void func(SqlSessionFactory sqlSessionFactory) {
        // 打開(kāi)SqlSession會(huì)話
        try (SqlSession sqlSession = sqlSessionFactory.openSession()){
            // doSomething()
            sqlSession.commit();
        } catch (Exception e) {
            // handle Exception
        }
    }
SqlSession的用途
  1. 獲取映射器歼郭,讓映射器通過(guò)命名空間和方法名稱找到對(duì)應(yīng)的SQL,發(fā)送給數(shù)據(jù)庫(kù)執(zhí)行后返回結(jié)果辐棒。
  2. 直接通過(guò)命名信息去執(zhí)行SQL返回結(jié)果病曾,這是 iBatis版本留下的方式。在SqlSession層我們可以通過(guò)update漾根、insert泰涂、select、delete等方法辐怕,帶上SQL的id來(lái)操作在XML中配置好的SQL逼蒙,從而完成我們的工作;與此同時(shí)它也支持事務(wù)寄疏,通過(guò) commit是牢、rollback方法提交或者回滾事務(wù)。

4 映射器

映射器的作用

映射器是由Java接口和XML文件(或注解)共同組成的陕截,作用如下:

  • 定義參數(shù)類型驳棱。
  • 描述緩存。
  • 描述SQL語(yǔ)句农曲。
  • 定義查詢結(jié)果和POJO的映射關(guān)系
映射器的兩種實(shí)現(xiàn)方式有兩種
  • 通過(guò)XML文件方式實(shí)現(xiàn)蹈胡,
  • 通過(guò)代碼方式實(shí)現(xiàn),在Configuration里面注冊(cè)Mapper接口

4.1 XML方式實(shí)現(xiàn)Mapper

  1. 定義了一個(gè)XML Mapper文件朋蔫,而且在配置文件mybatis-config.xml中配置了的該文件,所以 MyBatis會(huì)讀取這個(gè)配置文件却汉,生成映射器驯妄。
  2. 定義了一個(gè)命名空間為 com.ankeetc.spring.mapper.TbNameMapper 的SQL Mapper,這個(gè)命名空間和我們定義的接口的全限定名是一致的合砂。
  3. 定義了一個(gè)select元素青扔,id和接口方法名UserDomain select(Long id)是一致的,parameterType則表示我們傳遞給這條SQL的是一個(gè)Long型參數(shù)翩伪,resultType則定義我們需要返回的數(shù)據(jù)類型微猖。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ankeetc.spring.mapper.TbNameMapper">

    <select id="select" resultType="com.ankeetc.spring.domain.UserDomain" parameterType="java.lang.Long">
        SELECT * FROM tb_name WHERE id = #{id}
    </select>
</mapper>
public interface TbNameMapper {
    UserDomain select(Long id);
}
public static void func(SqlSessionFactory sqlSessionFactory) {
        // 打開(kāi)SqlSession會(huì)話
        try (SqlSession sqlSession = sqlSessionFactory.openSession()){
            // 獲取映射器Mapper
            TbNameMapper tbNameMapper = sqlSession.getMapper(TbNameMapper.class);
            // 執(zhí)行查詢
            UserDomain userDomain = tbNameMapper.select(18L);
            System.out.println(userDomain.getName());
            sqlSession.commit();
        } catch (Exception e) {
            // handle Exception
        }
    }

4.2 注解方式實(shí)現(xiàn)Mapper

public interface TbNameMapper2 {
    @Select("SELECT * FROM tb_name WHERE id = #{id}")
    UserDomain select(Long id);
}

在使用注解時(shí),要向SqlSessionFactory中手動(dòng)添加Mapper

    public SqlSessionFactory getSqlSessionFactory() throws Exception {
        // 在使用注解時(shí)缘屹,要向SqlSessionFactory中手動(dòng)添加Mapper
        configuration.addMapper(TbNameMapper.class);
        //
    }

4.3 Mapper實(shí)現(xiàn)方式簡(jiǎn)述

我們使用的僅僅是Java接口和一個(gè)XML文件(或者注解)去實(shí)現(xiàn) Mapper凛剥,一個(gè)沒(méi)有實(shí)現(xiàn)類的接口怎么能夠運(yùn)行呢?這里其實(shí)是運(yùn)用到Java語(yǔ)言的動(dòng)態(tài)代理去實(shí)現(xiàn)轻姿,而實(shí)現(xiàn)Java語(yǔ)言的動(dòng)態(tài)代理的方式有多種犁珠。這里我們還是集中于它的用法逻炊,所以可以這樣理解:我們會(huì)在 MyBatis 上下文中描述這個(gè)接口,而MyBatis會(huì)為這個(gè)接口生成代理類對(duì)象犁享,代理對(duì)象會(huì)根據(jù)“接口全路徑+方法名”去匹配,找到對(duì)應(yīng)的XML文件(或注解)去完成它所需要的任務(wù)余素,返回我們需要的結(jié)果。

5 生命周期

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder是利用XML或者Java編碼獲得資源來(lái)構(gòu)建SqlSessionFactory的炊昆,一旦我們構(gòu)建了SqlSessionFactory桨吊,它的作用就已經(jīng)完結(jié),所以它的生命周期只存在于方法的局部凤巨。

SqlSessionFactory

SqlSessionFactory的作用是創(chuàng)建SqlSession视乐,而SqlSession就是一個(gè)會(huì)話,每次訪問(wèn)數(shù)據(jù)庫(kù)都需要通過(guò)SqlSessionFactory創(chuàng)建SqlSession磅甩,所以SqlSessionFactory應(yīng)該在 MyBatis應(yīng)用的整個(gè)生命周期中炊林。而且SqlSessionFactory我們只是用它來(lái)創(chuàng)建SqlSession,只需要一個(gè)示例卷要,所以需要用采用單例模式渣聚。

    public synchronized SqlSessionFactory initSqlSessionFactory() {
        try {
            if (sqlSessionFactory == null) {
                InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            }
            return sqlSessionFactory;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
SqlSession

SqlSession是一個(gè)會(huì)話,它的生命周期應(yīng)該是在請(qǐng)求數(shù)據(jù)庫(kù)處理事務(wù)的過(guò)程中僧叉。它是一個(gè)線程不安全的對(duì)象奕枝,在涉及多線程的時(shí)候我們需要特別的當(dāng)心,操作數(shù)據(jù)庫(kù)需要注意其隔離級(jí)別瓶堕,數(shù)據(jù)庫(kù)鎖等高級(jí)特性隘道。每次創(chuàng)建的SqlSession都必須及時(shí)關(guān)閉它。

Mapper

Mapper是一個(gè)接口郎笆,它的作用是發(fā)送SQL然后返回我們需要的結(jié)果谭梗;或者執(zhí)行SQL從而修改數(shù)據(jù)庫(kù)的數(shù)據(jù)。因此它應(yīng)該在一個(gè)SqlSession事務(wù)方法之內(nèi)宛蚓,是一個(gè)方法級(jí)別的東西激捏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凄吏,隨后出現(xiàn)的幾起案子远舅,更是在濱河造成了極大的恐慌,老刑警劉巖痕钢,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件图柏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡任连,警方通過(guò)查閱死者的電腦和手機(jī)蚤吹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)随抠,“玉大人距辆,你說(shuō)我怎么就攤上這事余佃。” “怎么了跨算?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵爆土,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我诸蚕,道長(zhǎng)步势,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任背犯,我火速辦了婚禮坏瘩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漠魏。我一直安慰自己倔矾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布柱锹。 她就那樣靜靜地躺著哪自,像睡著了一般。 火紅的嫁衣襯著肌膚如雪禁熏。 梳的紋絲不亂的頭發(fā)上壤巷,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音瞧毙,去河邊找鬼胧华。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宙彪,可吹牛的內(nèi)容都是我干的矩动。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼释漆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悲没!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起灵汪,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柑潦,沒(méi)想到半個(gè)月后享言,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渗鬼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年览露,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片譬胎。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡差牛,死狀恐怖命锄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情偏化,我是刑警寧澤脐恩,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站侦讨,受9級(jí)特大地震影響驶冒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜韵卤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一骗污、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沈条,春花似錦需忿、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至季稳,卻和暖如春擅这,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背景鼠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工仲翎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铛漓。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓溯香,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親浓恶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玫坛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • 1 Mybatis入門(mén) 1.1 單獨(dú)使用jdbc編程問(wèn)題總結(jié) 1.1.1 jdbc程序 上邊使...
    哇哈哈E閱讀 3,295評(píng)論 0 38
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL包晰、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥(niǎo)慢飛閱讀 5,453評(píng)論 0 4
  • Mybatis介紹 MyBatis 本是apache的一個(gè)開(kāi)源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache...
    day_Sunny閱讀 2,650評(píng)論 0 6
  • 雙手?jǐn)n起來(lái)一彎臂膀的雨 狠狠地砸向這個(gè)夏天 屋頂跳躍起來(lái)的昨夜遺留下的故事 稀碎在濕潤(rùn)里 涂滿嘴唇的胭脂色微張 天...
    百字生閱讀 501評(píng)論 1 6
  • 為加強(qiáng)學(xué)校學(xué)生對(duì)食品安全的認(rèn)識(shí)湿镀,引導(dǎo)學(xué)生正確對(duì)待食品安全問(wèn)題,我校利用周一班會(huì)時(shí)間伐憾,在各班開(kāi)展了食品安全...
    梁宇婷_ab7f閱讀 424評(píng)論 0 0