這也許是你不曾留意過的 Mybatis 細(xì)節(jié)

image

Mybatis 可以說是 Java 后端的必備技能,可能你和我一樣經(jīng)常使用到它絮蒿。但有時(shí) cv 多了,會(huì)忘記了一些細(xì)節(jié)處理叁鉴,比如為什么要加上這個(gè)注解土涝?它的作用是什么等等。

這篇文章是我以前寫的一些關(guān)于 Mybatis 細(xì)節(jié)幌墓,希望對(duì)各位有起到查漏補(bǔ)缺的作用但壮。

1. 配置文件

SqlMapConfig.xml 文件各參數(shù)介紹:

?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>
    <!-- 加載屬性文件 -->
    <properties resource="jdbc.properties">
        <!--properties中還可以配置一些屬性名和屬性值  -->
        <!-- <property name="jdbc.driver" value=""/> -->
    </properties>

    <!-- 全局配置參數(shù)冀泻,需要時(shí)再設(shè)置 -->
    <settings>
        <!-- 打開延遲加載的開關(guān),默認(rèn)為false -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 將積極加載改為消極加載即按需要加載茵肃,默認(rèn)為true -->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!-- 開啟二級(jí)緩存腔长,默認(rèn)為true -->
        <setting name="cacheEnabled" value="true"/>
        <!-- 使用jdbc的getGeneratedKeys獲取數(shù)據(jù)庫自增主鍵值 -->
        <setting name="useGeneratedKeys" value="true"/>
    </settings>

    <!-- 別名定義 -->
    <typeAliases>

        <!-- 針對(duì)單個(gè)別名定義
        type:類型的路徑
        alias:別名
         -->
        <!-- <typeAlias type="com.iot.mybatis.po.User" alias="user"/> -->
        <!-- 批量別名定義
        指定包名,mybatis自動(dòng)掃描包中的po類验残,自動(dòng)定義別名捞附,別名就是類名(首字母大寫或小寫都可以)
        -->
        <package name="com.iot.mybatis.po"/>

    </typeAliases>

    <!-- 和spring整合后 environments配置將廢除-->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事務(wù)管理,事務(wù)控制由mybatis-->
            <transactionManager type="JDBC"/>
            <!-- 數(shù)據(jù)庫連接池,由mybatis管理-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

<!--加載映射文件有 3 種方法您没,如下所示-->
<mappers> 
<mapper resource="sqlmap/User.xml"/>
        <!--1. 通過 resource 方法一次加載一個(gè)映射文件 -->
        <!-- <mapper resource="mapper/UserMapper.xml"/> -->

        <!-- 2. 通過 mapper 接口加載單個(gè)映射文件
        遵循一些規(guī)范:需要將 mapper 接口類名和 mapper.xml 映射文件名稱保持一致鸟召,且在一個(gè)目錄中
         -->
        <!-- <mapper class="com.iot.mybatis.mapper.UserMapper"/> -->

        <!-- 3. 批量加載 mapper
        指定 mapper 接口的包名,mybatis 自動(dòng)掃描包下邊所有 mapper 接口進(jìn)行加載
        遵循一些規(guī)范:需要將 mapper 接口類名和 mapper.xml映射文件名稱保持一致氨鹏,且在一個(gè)目錄中
         -->
        <package name="com.iot.mybatis.mapper"/>

<mappers/>

2. # 和 $ 的區(qū)別

使用 #{parameterName} 引用參數(shù)的時(shí)候欧募,Mybatis 會(huì)把這個(gè)參數(shù)認(rèn)為是一個(gè)字符串,例如在下面的 sql 傳入?yún)?shù) “Smith”仆抵,
Select from emp where name = #{employeeName}

就會(huì)被轉(zhuǎn)換為:
Select from emp where name = ‘Smith’;

同理在下面 sql 傳入?yún)?shù) “Smith”:
Select from emp where name = ${employeeName}

使用的時(shí)候就會(huì)被轉(zhuǎn)換為 :
Select from emp where name = Smith;

簡單來說跟继, #{} 是經(jīng)過預(yù)編譯的,是安全的,而 ${} 是未經(jīng)過預(yù)編譯的,僅僅是取變量的值,是非安全的,存在 sql 注入的危險(xiǎn)。# 將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串镣丑,會(huì)對(duì)自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號(hào)舔糖。

使用 ${} 的情況,order by莺匠、like 語句只能用 ${} 了,用 #{} 會(huì)多個(gè) ’ ’ 導(dǎo)致 sql 語句失效.此外動(dòng)態(tài)拼接 sql金吗,模糊查詢時(shí)也要用 ${}。

舉個(gè)栗子趣竣,假如 name=陳,那么該 sql 就是 ... LiKE '%陳%'摇庙,
DELETE FROM stu WHERE name LIKE '%${name}%'

上面話有點(diǎn)長,這里小小總結(jié)下:
#{} :編譯好 SQL 語句再取值
${} :取值以后再去編譯SQL語句

3. SQL 語句中的列名與關(guān)鍵字沖突時(shí)怎么辦

比如:name 字段遥缕。

解決方法:在列名兩邊加上兩個(gè) 即可卫袒,如下: DELETE FROM stu WHEREname` LIKE '%${name}%'

4. 列名和 bean 屬性名不一樣,導(dǎo)致獲取不到數(shù)據(jù)時(shí)怎么辦

那么為什么會(huì)導(dǎo)致查詢的 SQL 語句無法得到正確結(jié)果呢通砍?

因?yàn)?mybatis 會(huì)通過反射得到 bean 玛臂,由于字段名和屬性名不一樣,導(dǎo)致無法將查詢到的表字段數(shù)據(jù) set 到 bean 屬性中封孙。

解決方法:
【不推薦】修改表字段名稱或 bean 屬性名稱,使它們同名即可

【推薦】修改 標(biāo)簽中的相應(yīng)內(nèi)容讽营,如下圖所示

image

5. @Param 參數(shù)的作用

作用:相當(dāng)于給其修飾的參數(shù)指定一個(gè)別名虎忌。

若接口只有一個(gè)參數(shù)則可以不用指定別名,List 參數(shù)除外橱鹏。當(dāng)有多個(gè)參數(shù)時(shí)一定要指定膜蠢,否則 mybatis 映射不到對(duì)應(yīng)的字段堪藐。

如下代碼:
List<Book> queryAll(@Param("offset")int offset, @Param("limit")int limit);

該接口方法對(duì)應(yīng)的 mapper 實(shí)現(xiàn)如下:

<select id="queryAll" resultType="Book">
       SELECT
           book_id,
           `name`,
           `number`
       FROM
           book
       ORDER BY
           book_id
       LIMIT #{offset}, #{limit}
</select>

可以看到 #{} 里面的值是和 @Param("value") 保持一致的,也一定要一致挑围,否則 mybatis 會(huì)找不到這個(gè)值而導(dǎo)致報(bào)錯(cuò)礁竞。另外,@Param("value") 中的 value 可以是任意的杉辙。

參考:

https://github.com/liyifeng1994/ssm
https://github.com/brianway/springmvc-mybatis-learning/blob/master/sourcecode/mybatis/config/SqlMapConfig.xml

PS:我是七淅 (xī)模捂,后臺(tái)回復(fù)「Java」,送你 13 本 Java 經(jīng)典電子書蜘矢。公眾號(hào)專注分享 Java 干貨狂男、讀書筆記、成長思考品腹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岖食,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舞吭,更是在濱河造成了極大的恐慌泡垃,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羡鸥,死亡現(xiàn)場(chǎng)離奇詭異蔑穴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)兄春,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門澎剥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赶舆,你說我怎么就攤上這事哑姚。” “怎么了芜茵?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵叙量,是天一觀的道長。 經(jīng)常有香客問我九串,道長绞佩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任猪钮,我火速辦了婚禮品山,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烤低。我一直安慰自己肘交,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布扑馁。 她就那樣靜靜地躺著涯呻,像睡著了一般凉驻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上复罐,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天涝登,我揣著相機(jī)與錄音,去河邊找鬼效诅。 笑死胀滚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的填帽。 我是一名探鬼主播蛛淋,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼篡腌!你這毒婦竟也來了褐荷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤嘹悼,失蹤者是張志新(化名)和其女友劉穎叛甫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杨伙,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡其监,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了限匣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抖苦。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖米死,靈堂內(nèi)的尸體忽然破棺而出锌历,到底是詐尸還是另有隱情,我是刑警寧澤峦筒,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布究西,位于F島的核電站,受9級(jí)特大地震影響物喷,放射性物質(zhì)發(fā)生泄漏卤材。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一峦失、第九天 我趴在偏房一處隱蔽的房頂上張望扇丛。 院中可真熱鬧,春花似錦尉辑、人聲如沸晕拆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽实幕。三九已至,卻和暖如春堤器,著一層夾襖步出監(jiān)牢的瞬間昆庇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工闸溃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留整吆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓辉川,卻偏偏與公主長得像表蝙,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乓旗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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