您好,登錄后才能下訂單哦!
本篇文章為大家展示了SpringBoot怎樣整合mybatis-plus進(jìn)階的詳解教程,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
Wrapper : 條件構(gòu)造抽象類,最頂端父類,抽象類中提供4個(gè)方法西面貼源碼展示
AbstractWrapper : 用于查詢條件封裝,生成 sql 的 where 條件
AbstractLambdaWrapper : Lambda 語(yǔ)法使用 Wrapper統(tǒng)一處理解析 lambda 獲取 column。
LambdaQueryWrapper :看名稱也能明白就是用于Lambda語(yǔ)法使用的查詢Wrapper
LambdaUpdateWrapper : Lambda 更新封裝Wrapper
QueryWrapper : Entity 對(duì)象封裝操作類,不是用lambda語(yǔ)法
UpdateWrapper : Update 條件封裝,用于Entity對(duì)象更新操作
上一節(jié)我們完成了基于mybatis-plus的CRUD操作,這一節(jié)我們來(lái)學(xué)習(xí)一下使用mybatis-plus中的條件構(gòu)造器——AbstractWrapper。
QueryWrapper(LambdaQueryWrapper)
和UpdateWrapper(LambdaUpdateWrapper)
的父類用于生成 sql 的 where 條件, entity 屬性也用于生成 sql 的 where 條件
注意: entity 生成的 where 條件與 使用各個(gè) api 生成的 where 條件沒(méi)有任何關(guān)聯(lián)行為
首先我們來(lái)介紹一下AbstractWrapper,下圖是AbstractWrapper的一個(gè)繼承結(jié)構(gòu):
由于其中方法太多就不一一贅述,想看全部方法用法可以看官網(wǎng)介紹或者看我的實(shí)例代碼
查詢id在1 - 30且性別為男、姓名帶有test的用戶:
@SpringBootTest @SuppressWarnings("unchecked") public class UserWrapperTest { @Autowired UserMapper userMapper; @Test public void TestQueryWrapper(){ QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(); userQueryWrapper.like("name","test"); userQueryWrapper.eq("sex","男"); userQueryWrapper.between("id",1,30); userMapper.selectList(userQueryWrapper).forEach(System.out::println); } }
注:eq是equals的簡(jiǎn)寫,該方法兩個(gè)參數(shù),column和value,表示column的值和value要相等。
此處like方法就是查詢name中包含“test”字樣的記錄;between方法三個(gè)參數(shù),分別是column、value1、value2,該方法表示column的值要在value1和value2之間。
注意column是數(shù)據(jù)表對(duì)應(yīng)的字段,而非實(shí)體類屬性字段。
運(yùn)行日志
LambdaQueryWrapper是mybatis plus中的一個(gè)條件構(gòu)造器對(duì)象,只是是需要使用Lambda 語(yǔ)法使用 Wrapper
@Test public void TestLambdaQueryWrapper() { LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>(); lambdaWrapper.like(User::getName,"test"); lambdaWrapper.eq(User::getSex,"男"); lambdaWrapper.between(User::getId,1,30); userMapper.selectList(lambdaWrapper).forEach(System.out::println); }
運(yùn)行日志
我們?cè)龠M(jìn)行更新或者刪除的時(shí)候,有時(shí)候where條件復(fù)雜的話,可以使用UpdateWrapper來(lái)構(gòu)造條件
他們有部分方法是和上面的QueryWrapper(LambdaQueryWrapper)
相同的。這里演示不同之處
將名字包含test1的用戶名改為test1.1 :
@Test public void TestUpdateWrapper() { UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); //繼承自 AbstractWrapper ,自身的內(nèi)部屬性 entity 也用于生成 where 條件 //及 LambdaUpdateWrapper, 可以通過(guò) new UpdateWrapper().lambda() 方法獲取! User user = User.builder().build(); //修改語(yǔ)句 updateWrapper.set("name", "test1.1"); //條件 updateWrapper.like("name", "test1"); userMapper.update(user, updateWrapper); }
運(yùn)行日志
@Test public void TestLambdaUpdateWrapper() { LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>(); //LambdaUpdateWrapper<User> updateWrapper = new UpdateWrapper<User>().lambda(); User user = User.builder().build(); //修改語(yǔ)句 updateWrapper.set(User::getName, "test1.1"); //條件 updateWrapper.like(User::getName, "test1"); userMapper.update(user, updateWrapper); }
mybatis-plus提供了很多好用的插件,而且配置簡(jiǎn)單,使用方便。接下來(lái)一起看看MP的插件如何使用。
BaseMapper的selectPage方法和AR提供的selectPage方法都不是物理分頁(yè),需要配置分頁(yè)插件后才是物理分頁(yè),那么現(xiàn)在就來(lái)看看如何配置這個(gè)插件。分頁(yè)查詢
import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @program: springboot * @description: * @author: King * @create: 2021-09-08 13:18 */ @Configuration public class MybatisPlusConfig { /** * 新的分頁(yè)插件,一緩和二緩遵循mybatis的規(guī)則,需要設(shè)置 MybatisConfiguration#useDeprecatedExecutor = false 避免緩存出現(xiàn)問(wèn)題 * 3.4.3不用設(shè)置 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2)); return interceptor; } }
這個(gè)配置摘抄自官方示例
@Autowired UserMapper userMapper; @Test public void Test2() { //配置了分頁(yè)插件后,使用selectpage方法, //但是現(xiàn)在就是真正的物理分頁(yè)了,sql語(yǔ)句中有l(wèi)imit了 Page<User> page = new Page<>(1, 10); IPage<User> selectPage = userMapper.selectPage(page, null); System.out.println(selectPage); System.out.println("================= 相關(guān)的分頁(yè)信息 =================="); System.out.println("總條數(shù):" + selectPage.getTotal()); System.out.println("當(dāng)前頁(yè)碼:" + selectPage.getCurrent()); System.out.println("總頁(yè)數(shù):" + selectPage.getPages()); System.out.println("每頁(yè)顯示條數(shù):" + selectPage.getSize()); System.out.println("是否有上一頁(yè):" + page.hasPrevious()); System.out.println("是否有下一頁(yè):" + page.hasNext()); System.out.println("查詢結(jié)果:"); List<User> list = selectPage.getRecords(); list.forEach(o -> System.out.println(o)); // page.getRecords().forEach(o -> System.out.println(o)); //還可以將查詢到的結(jié)果set進(jìn)page對(duì)象中 page.setRecords(list); //也可以通過(guò)page調(diào)用相關(guān)方法獲取到相關(guān)的分頁(yè)信息,而且還可以把查詢到的結(jié)果set回page對(duì)象中,方便前端使用。 }
運(yùn)行結(jié)果
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@17aa8a11] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1963906615 wrapping com.mysql.cj.jdbc.ConnectionImpl@5190010f] will not be managed by Spring
==> Preparing: SELECT COUNT(*) FROM User
==> Parameters:
<== Columns: COUNT(*)
<== Row: 31
<== Total: 1
==> Preparing: SELECT id,name,sex,pwd,email FROM User LIMIT ?
==> Parameters: 10(Long)
<== Columns: id, name, sex, pwd, email
<== Row: 2, test1.1, 女, aaaa, 1231@qq.com
<== Row: 3, test2, 男, aaaa, 1232@qq.com
<== Row: 4, test3, 女, aaaa, 1233@qq.com
<== Row: 5, test4, 男, aaaa, 1234@qq.com
<== Row: 6, test5, 女, aaaa, 1235@qq.com
<== Row: 7, test6, 男, aaaa, 1236@qq.com
<== Row: 8, test7, 女, aaaa, update@qq.com
<== Row: 9, test8, 男, aaaaaa, 1238@qq.com
<== Row: 42, test, 男, aaa, a@qq.com
<== Row: 43, test, 男, aaa, a@qq.com
<== Total: 10
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@17aa8a11]
com.baomidou.mybatisplus.extension.plugins.pagination.Page@44286963
================= 相關(guān)的分頁(yè)信息 ==================
總條數(shù):31
當(dāng)前頁(yè)碼:1
總頁(yè)數(shù):4
每頁(yè)顯示條數(shù):10
是否有上一頁(yè):false
是否有下一頁(yè):true
查詢結(jié)果:
User(id=2, name=test1.1, sex=女, pwd=aaaa, email=1231@qq.com)
User(id=3, name=test2, sex=男, pwd=aaaa, email=1232@qq.com)
User(id=4, name=test3, sex=女, pwd=aaaa, email=1233@qq.com)
User(id=5, name=test4, sex=男, pwd=aaaa, email=1234@qq.com)
User(id=6, name=test5, sex=女, pwd=aaaa, email=1235@qq.com)
User(id=7, name=test6, sex=男, pwd=aaaa, email=1236@qq.com)
User(id=8, name=test7, sex=女, pwd=aaaa, email=update@qq.com)
User(id=9, name=test8, sex=男, pwd=aaaaaa, email=1238@qq.com)
User(id=42, name=test, sex=男, pwd=aaa, email=a@qq.com)
User(id=43, name=test, sex=男, pwd=aaa, email=a@qq.com)
可以看到通過(guò)分頁(yè)插件 sql語(yǔ)句中已經(jīng)有了limit,是物理分頁(yè)了。并且是否有上一頁(yè)下一頁(yè)也有展示非常好用
示例:
只需要在你的 UserMapper.java 中加入你自定義的分頁(yè)方法,也可以按你自定義方法實(shí)現(xiàn)分頁(yè)。UserMapper可以繼承或者不繼承BaseMapper
@Mapper //表明這是一個(gè)Mapper,也可以在啟動(dòng)類上加上包掃描 //Mapper 繼承該接口后,無(wú)需編寫 mapper.xml 文件,即可獲得CRUD功能 public interface UserMapper extends BaseMapper<User> { /** * 查詢 : 根據(jù)性別查詢用戶列表,分頁(yè)顯示 * @param page 分頁(yè)對(duì)象,xml中可以從里面進(jìn)行取值,傳遞參數(shù) Page 即自動(dòng)分頁(yè),必須放在第一位(你可以繼承Page實(shí)現(xiàn)自己的分頁(yè)對(duì)象) * @param sex 性別 * @return 分頁(yè)對(duì)象 */ @Select("SELECT * FROM user WHERE sex = #{sex}") IPage<User> selectPageBySex(Page<?> page, String sex); }
測(cè)試代碼
@Test public void Test3() { Page<User> page = new Page<>(2, 10); IPage<User> selectPage = userMapper.selectPageBySex(page, "男"); System.out.println("================= 相關(guān)的分頁(yè)信息 =================="); System.out.println("總條數(shù):" + selectPage.getTotal()); System.out.println("當(dāng)前頁(yè)碼:" + selectPage.getCurrent()); System.out.println("總頁(yè)數(shù):" + selectPage.getPages()); System.out.println("每頁(yè)顯示條數(shù):" + selectPage.getSize()); System.out.println("是否有上一頁(yè):" + page.hasPrevious()); System.out.println("是否有下一頁(yè):" + page.hasNext()); System.out.println("分頁(yè)結(jié)果"); selectPage.getRecords().forEach(System.out::println); }
運(yùn)行結(jié)果
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6a0f2853] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1312762120 wrapping com.mysql.cj.jdbc.ConnectionImpl@7e87ef9e] will not be managed by Spring
==> Preparing: SELECT COUNT(*) FROM user WHERE sex = ?
==> Parameters: 男(String)
<== Columns: COUNT(*)
<== Row: 17
<== Total: 1
==> Preparing: SELECT * FROM user WHERE sex = ? LIMIT ? OFFSET ?
==> Parameters: 男(String), 10(Long), 10(Long)
<== Columns: id, name, sex, pwd, email
<== Row: 52, test28, 男, aaaa, a28@qq.com
<== Row: 54, test30, 男, aaaa, a30@qq.com
<== Row: 56, test32, 男, aaaa, a32@qq.com
<== Row: 58, test34, 男, aaaa, a34@qq.com
<== Row: 60, test36, 男, aaaa, a36@qq.com
<== Row: 62, test38, 男, aaaa, a38@qq.com
<== Row: 64, Test, 男, aaaaa, 1234@qq.com
<== Total: 7
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6a0f2853]
================= 相關(guān)的分頁(yè)信息 ==================
總條數(shù):17
當(dāng)前頁(yè)碼:2
總頁(yè)數(shù):2
每頁(yè)顯示條數(shù):10
是否有上一頁(yè):true
是否有下一頁(yè):false
分頁(yè)結(jié)果
User(id=52, name=test28, sex=男, pwd=aaaa, email=a28@qq.com)
User(id=54, name=test30, sex=男, pwd=aaaa, email=a30@qq.com)
User(id=56, name=test32, sex=男, pwd=aaaa, email=a32@qq.com)
User(id=58, name=test34, sex=男, pwd=aaaa, email=a34@qq.com)
User(id=60, name=test36, sex=男, pwd=aaaa, email=a36@qq.com)
User(id=62, name=test38, sex=男, pwd=aaaa, email=a38@qq.com)
User(id=64, name=Test, sex=男, pwd=aaaaa, email=1234@qq.com)
這個(gè)插件PerformanceInterceptor
在3.2.0被移除了,如果想進(jìn)行性能分析,用第三方的,官方這樣寫的“該插件 3.2.0 以上版本移除推薦使用第三方擴(kuò)展 執(zhí)行 SQL 分析打印 功能
”
–防止全表更新與刪除
和上面的分頁(yè)插件類似
//BlockAttackInnerInterceptor //針對(duì) update 和 delete 語(yǔ)句 作用: 阻止惡意的全表更新刪除 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor3() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 執(zhí)行分析插件 interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); return interceptor; }
@Test public void Test4(){ //條件為null,就是刪除全表,執(zhí)行分析插件會(huì)終止該操作 userMapper.delete(null); }
運(yùn)行該junit測(cè)試,可以看到報(bào)如下錯(cuò)誤,說(shuō)明該插件生效了。
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e9f2c32] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@480645280 wrapping com.mysql.cj.jdbc.ConnectionImpl@49433c98] will not be managed by Spring
original SQL: DELETE FROM User
SQL to parse, SQL: DELETE FROM User
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e9f2c32]org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error updating database. Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of full table deletion
### The error may exist in com/king/mybatis_plus/mapper/UserMapper.java (best guess)
### The error may involve com.king.mybatis_plus.mapper.UserMapper.delete
### The error occurred while executing an update
### Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of full table deletion
上述內(nèi)容就是SpringBoot怎樣整合mybatis-plus進(jìn)階的詳解教程,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。