mybatis-plus集成springboot實(shí)現(xiàn)XML映射器方式
主要功能
SQL 映射配置
1、定義復(fù)雜的 SQL 查詢語(yǔ)句
2、配置數(shù)據(jù)庫(kù)操作與 Java 方法的映射關(guān)系
3、處理動(dòng)態(tài) SQL 語(yǔ)句
補(bǔ)充注解方式的不足
1、當(dāng) @Select、@Insert 等注解無(wú)法滿足復(fù)雜 SQL 需求時(shí)
2、更好地管理長(zhǎng) SQL 語(yǔ)句,提高代碼可讀性
3、支持復(fù)雜的條件判斷和循環(huán)操作
動(dòng)態(tài) SQL 支持
1、使用 <if>、<choose>、<when>、<otherwise> 等標(biāo)簽
2、實(shí)現(xiàn)條件查詢和動(dòng)態(tài)參數(shù)綁定
3、支持集合遍歷等復(fù)雜操作
使用場(chǎng)景
1、復(fù)雜查詢: 多表關(guān)聯(lián)查詢、嵌套查詢等
2、動(dòng)態(tài)條件: 根據(jù)不同參數(shù)構(gòu)建不同的 SQL 語(yǔ)句
3、批量操作: 批量插入、更新等操作
4、自定義 SQL: 當(dāng) MyBatis-Plus 提供的通用方法無(wú)法滿足需求時(shí)
XML 映射器本質(zhì)上是 MyBatis 的特性,在 MyBatis-Plus 中同樣適用,可以與通用 Mapper 方法并存使用。
應(yīng)用
1.依賴
???????<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.9</version>
</dependency>2.配置
在application.properties文件中配置:
# 指定Mapper接口的xml文件位置 mybatis-plus.mapper-locations=classpath*:mapper/**/*.xml # 實(shí)體類包名 mybatis-plus.type-aliases-package=com.example.demo.pojo
3.創(chuàng)建xml文件
在mapper文件夾下新建xml包,新建UserMapper.xml文件,寫(xiě)入以下測(cè)試內(nèi)容:
<?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.example.demo.mapper.UserMapper" >
<!--這里寫(xiě)了一個(gè)方便區(qū)分的sql-->
<delete id="deleteUserAaaaa">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>4.聲明方法
在UserMapper文件里聲明:
//記得加上@mapper注解
@Mapper
public interface UserMapper extends BaseMapper<User> {
int deleteUserAaaaa(@Param("id") Long id);
}5.使用
這里在測(cè)試類里測(cè)試,
@Test
void testLogicDelete(){
int affectedRows = userMapper.deleteUserAaaaa(4L);
System.out.println("刪除了" + affectedRows + "條記錄");
}運(yùn)行后顯示成功。。。。
常見(jiàn)SQL操作實(shí)現(xiàn)
(以下是官方的文檔XML 映射器_MyBatis中文網(wǎng))
1.Select
<select id="selectPerson" parameterType="int" parameterMap="deprecated" resultType="hashmap" resultMap="personResultMap" flushCache="false" useCache="true" timeout="10" fetchSize="256" statementType="PREPARED" resultSetType="FORWARD_ONLY">
屬性:
id | 在命名空間中唯一的標(biāo)識(shí)符,可以被用來(lái)引用這條語(yǔ)句。 |
parameterType | 將會(huì)傳入這條語(yǔ)句的參數(shù)的類全限定名或別名。這個(gè)屬性是可選的,因?yàn)?/span> MyBatis 可以通過(guò)類型處理器(TypeHandler)推斷出具體傳入語(yǔ)句的參數(shù),默認(rèn)值為未設(shè)置(unset)。 |
parameterMap | 用于引用外部 parameterMap 的屬性,目前已被廢棄。請(qǐng)使用行內(nèi)參數(shù)映射和 parameterType 屬性。 |
resultType | 期望從這條語(yǔ)句中返回結(jié)果的類全限定名或別名。 注意,如果返回的是集合,那應(yīng)該設(shè)置為集合包含的類型,而不是集合本身的類型。 resultType 和 resultMap 之間只能同時(shí)使用一個(gè)。 |
resultMap | 對(duì)外部 resultMap 的命名引用。結(jié)果映射是 MyBatis 最強(qiáng)大的特性,如果你對(duì)其理解透徹,許多復(fù)雜的映射問(wèn)題都能迎刃而解。 resultType 和 resultMap 之間只能同時(shí)使用一個(gè)。 |
flushCache | 將其設(shè)置為 true 后,只要語(yǔ)句被調(diào)用,都會(huì)導(dǎo)致本地緩存和二級(jí)緩存被清空,默認(rèn)值:false。 |
useCache | 將其設(shè)置為 true 后,將會(huì)導(dǎo)致本條語(yǔ)句的結(jié)果被二級(jí)緩存緩存起來(lái),默認(rèn)值:對(duì) select 元素為 true。 |
timeout | 這個(gè)設(shè)置是在拋出異常之前,驅(qū)動(dòng)程序等待數(shù)據(jù)庫(kù)返回請(qǐng)求結(jié)果的秒數(shù)。默認(rèn)值為未設(shè)置(unset)(依賴數(shù)據(jù)庫(kù)驅(qū)動(dòng))。 |
fetchSize | 這是一個(gè)給驅(qū)動(dòng)的建議值,嘗試讓驅(qū)動(dòng)程序每次批量返回的結(jié)果行數(shù)等于這個(gè)設(shè)置值。 默認(rèn)值為未設(shè)置(unset)(依賴驅(qū)動(dòng))。 |
statementType | 可選 STATEMENT,PREPARED 或 CALLABLE。這會(huì)讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認(rèn)值:PREPARED。 |
resultSetType | FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等價(jià)于 unset) 中的一個(gè),默認(rèn)值為 unset (依賴數(shù)據(jù)庫(kù)驅(qū)動(dòng))。 |
databaseId | 如果配置了數(shù)據(jù)庫(kù)廠商標(biāo)識(shí)(databaseIdProvider),MyBatis 會(huì)加載所有不帶 databaseId 或匹配當(dāng)前 databaseId 的語(yǔ)句;如果帶和不帶的語(yǔ)句都有,則不帶的會(huì)被忽略。 |
resultOrdered | 這個(gè)設(shè)置僅針對(duì)嵌套結(jié)果 select 語(yǔ)句:如果為 true,將會(huì)假設(shè)包含了嵌套結(jié)果集或是分組,當(dāng)返回一個(gè)主結(jié)果行時(shí),就不會(huì)產(chǎn)生對(duì)前面結(jié)果集的引用。 這就使得在獲取嵌套結(jié)果集的時(shí)候不至于內(nèi)存不夠用。默認(rèn)值:false。 |
2.insert, update 和 delete
<insert id="insertAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" keyProperty="" keyColumn="" useGeneratedKeys="" timeout="20">
<update id="updateAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" timeout="20">
<delete id="deleteAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" timeout="20">
屬性:
id | 在命名空間中唯一的標(biāo)識(shí)符,可以被用來(lái)引用這條語(yǔ)句。 |
parameterType | 將會(huì)傳入這條語(yǔ)句的參數(shù)的類全限定名或別名。這個(gè)屬性是可選的,因?yàn)?/span> MyBatis 可以通過(guò)類型處理器(TypeHandler)推斷出具體傳入語(yǔ)句的參數(shù),默認(rèn)值為未設(shè)置(unset)。 |
parameterMap | 用于引用外部 parameterMap 的屬性,目前已被廢棄。請(qǐng)使用行內(nèi)參數(shù)映射和 parameterType 屬性。 |
flushCache | 將其設(shè)置為 true 后,只要語(yǔ)句被調(diào)用,都會(huì)導(dǎo)致本地緩存和二級(jí)緩存被清空,默認(rèn)值:(對(duì) insert、update 和 delete 語(yǔ)句)true。 |
timeout | 這個(gè)設(shè)置是在拋出異常之前,驅(qū)動(dòng)程序等待數(shù)據(jù)庫(kù)返回請(qǐng)求結(jié)果的秒數(shù)。默認(rèn)值為未設(shè)置(unset)(依賴數(shù)據(jù)庫(kù)驅(qū)動(dòng))。 |
statementType | 可選 STATEMENT,PREPARED 或 CALLABLE。這會(huì)讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認(rèn)值:PREPARED。 |
useGeneratedKeys | (僅適用于 insert 和 update)這會(huì)令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來(lái)取出由數(shù)據(jù)庫(kù)內(nèi)部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)的自動(dòng)遞增字段),默認(rèn)值:false。 |
keyProperty | (僅適用于 insert 和 update)指定能夠唯一識(shí)別對(duì)象的屬性,MyBatis 會(huì)使用 getGeneratedKeys 的返回值或 insert 語(yǔ)句的 selectKey 子元素設(shè)置它的值,默認(rèn)值:未設(shè)置(unset)。如果生成列不止一個(gè),可以用逗號(hào)分隔多個(gè)屬性名稱。 |
keyColumn | (僅適用于 insert 和 update)設(shè)置生成鍵值在表中的列名,在某些數(shù)據(jù)庫(kù)(像 PostgreSQL)中,當(dāng)主鍵列不是表中的第一列的時(shí)候,是必須設(shè)置的。如果生成列不止一個(gè),可以用逗號(hào)分隔多個(gè)屬性名稱。 |
databaseId | 如果配置了數(shù)據(jù)庫(kù)廠商標(biāo)識(shí)(databaseIdProvider),MyBatis 會(huì)加載所有不帶 databaseId 或匹配當(dāng)前 databaseId 的語(yǔ)句;如果帶和不帶的語(yǔ)句都有,則不帶的會(huì)被忽略。 |
3.動(dòng)態(tài)SQL
<!-- if標(biāo)簽-->
<select id="selectUsers" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
<!-- choose/when/otherwise 標(biāo)簽-->
<select id="selectUsers" resultType="User">
SELECT * FROM user
WHERE 1=1
<choose>
<when test="name != null">
AND name = #{name}
</when>
<when test="email != null">
AND email = #{email}
</when>
<otherwise>
AND status = 1
</otherwise>
</choose>
</select>
<!-- where 標(biāo)簽 (自動(dòng)處理 WHERE 和 AND/OR)-->
<select id="selectUsers" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
<!-- set 標(biāo)簽 (用于 UPDATE 語(yǔ)句)-->
<update id="updateUser">
UPDATE user
<set>
<if test="name != null">name=#{name},</if>
<if test="age != null">age=#{age},</if>
<if test="email != null">email=#{email},</if>
</set>
WHERE id=#{id}
</update>4.常見(jiàn)問(wèn)題解決
參數(shù)為 null 的判斷
<if test="name != null and name != ''"> <!-- 同時(shí)檢查null和空字符串 -->
AND name = #{name}
</if>集合判空
<if test="ids != null and ids.size() > 0">
AND id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>動(dòng)態(tài)排序
<if test="orderBy != null">
ORDER BY ${orderBy}
<if test="asc != null and asc">
ASC
</if>
<if test="asc != null and !asc">
DESC
</if>
</if>總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 從拋出異常到返回JSON/XML:SpringBoot?異常處理全鏈路深度解析
- springboot中配置logback-spring.xml的方法
- SpringBoot集成JasperReports實(shí)現(xiàn)PDF、HTML、XML的一鍵生成
- SpringBoot使用MyBatis的XML文件進(jìn)行SQL語(yǔ)句編寫(xiě)
- SpringBoot+MyBatis進(jìn)行XML中循環(huán)處理List參數(shù)的終極指南
- SpringBoot項(xiàng)目配置logback-spring.xml屏蔽特定路徑的日志
- SpringBoot的pom.xml文件中設(shè)置多環(huán)境配置信息方法詳解
相關(guān)文章
Java使用集合實(shí)現(xiàn)斗地主分牌完整代碼
在斗地主游戲中,通常是將一副牌平均分成3份,每份17張牌,并留3張底牌,我們可以使用集合來(lái)實(shí)現(xiàn)這一功能,這篇文章主要給大家介紹了關(guān)于Java使用集合實(shí)現(xiàn)斗地主分牌的相關(guān)資料,需要的朋友可以參考下2024-05-05
Springboot 使用 JSR 303 對(duì) Controller 控制層校驗(yàn)及 Service 服務(wù)層 AOP 校驗(yàn)
這篇文章主要介紹了Springboot 使用 JSR 303 對(duì) Controller 控制層校驗(yàn)及 Service 服務(wù)層 AOP 校驗(yàn) 使用消息資源文件對(duì)消息國(guó)際化的相關(guān)知識(shí),需要的朋友可以參考下2017-12-12
Java基礎(chǔ)第二篇方法與數(shù)據(jù)成員
在上一篇文章中介紹了Java基礎(chǔ) 從HelloWorld到面向?qū)ο螅覀兂醪搅私饬藢?duì)象(object)。對(duì)象中的數(shù)據(jù)成員表示對(duì)象的狀態(tài)。對(duì)象可以執(zhí)行方法,表示特定的動(dòng)作。這篇文章我們進(jìn)一步深入到對(duì)象。了解Java中方法與數(shù)據(jù)成員的一些細(xì)節(jié)。2021-09-09
eclipse中maven的pom.xml文件中增加依賴的方法
日 在Maven項(xiàng)目中,可以使用pom.xml文件來(lái)添加依賴包,本文主要介紹了eclipse中maven的pom.xml文件中增加依賴的方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
基于JavaBean編輯器讀取peroperties文件的實(shí)例
下面小編就為大家?guī)?lái)一篇基于JavaBean編輯器讀取peroperties文件的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10

