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 WHERE
name` 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)容讽营,如下圖所示
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 干貨狂男、讀書筆記、成長思考品腹。