MyBatisPlus項(xiàng)目的創(chuàng)建和使用
本文主要介紹了 MyBatisPlus項(xiàng)目的創(chuàng)建和使用,具體如下:
1. 快速上手
1.1. 項(xiàng)目的創(chuàng)建和配置
首先,創(chuàng)建一個(gè) Spring Boot 工程,添加 MyBatis Plus 和 MySQL 對(duì)應(yīng)的依賴,然后,和 MyBatis 一樣,需要在 yml 文件中配置數(shù)據(jù)庫(kù)連接信息
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.9</version> </dependency>
創(chuàng)建好項(xiàng)目之后,需要根據(jù)數(shù)據(jù)庫(kù)中的字段來寫相應(yīng)的實(shí)體類
@Data public class UserInfo { private Integer id; private String userName; private String password; private Integer deleteFlag; private Date createTime; private Date updateTime; }
MybatisPlus 提供了一個(gè)基礎(chǔ)的 BaseMapper 接口,已經(jīng)實(shí)現(xiàn)了單表的增刪查改操作,自定義的 Mapper 只需要繼承這個(gè) BaseMapper,就不用自己實(shí)現(xiàn)相應(yīng)的單表增刪查改操作了
為了讓 Spring 掃描到這個(gè)類,也是需要加上 @Mapper
注解的,或者在啟動(dòng)類上加上@MapperScan
注解,參數(shù)就寫包的路徑
@Mapper public interface UserInfoMapper extends BaseMapper<UserInfo> { }
1.2. 增刪查改的簡(jiǎn)單演示
之后就可以進(jìn)行增刪查改的單元測(cè)試了
查詢:
@SpringBootTest class UserInfoMapperTest { @Autowired private UserInfoMapper userInfoMapper; //查詢 @Test void testSelect(){ System.out.println(userInfoMapper.selectById(1)); } }
和使用 Mybatis 時(shí)的結(jié)果是一樣的
那么就有一個(gè)問題,Mapper 中不寫 sql 語句是怎么知道要操作哪張表的,其實(shí)就是繼承的BaseMapper<UserInfo>
中傳入的泛型參數(shù),會(huì)將 Java 中類的命名規(guī)范改為數(shù)據(jù)庫(kù)中的命名規(guī)范,類中的屬性也是按照規(guī)范映射到數(shù)據(jù)庫(kù)中表的字段的,那么就會(huì)有一個(gè)問題,如果說類名或者屬性名沒有按照規(guī)范來定義,還能知道操作的是哪張表嗎
把類名修改以后就報(bào)錯(cuò)了,報(bào)錯(cuò)信息為數(shù)據(jù)庫(kù)中找不到這個(gè)表,如果命名規(guī)范的話是可以把UserInfo
轉(zhuǎn)化為表名user_info
的
這時(shí)候使用 @TableName
來指定一下具體要操作哪張表就可以了
同理,屬性名如果命名不規(guī)范也是不能自動(dòng)轉(zhuǎn)化成功的
把規(guī)范的駝峰命名方式修改一下就又報(bào)錯(cuò)了,這時(shí)候,就要使用@TableField
注解來指定對(duì)應(yīng)的表的字段
然后來看 insert 方法
@Test void testInsert(){ UserInfo userinfo = new UserInfo(); userinfo.setUserName("java"); userinfo.setPassword("java"); userInfoMapper.insert(userinfo); }
雖然說插入成功了,但是數(shù)據(jù)好像不太對(duì),這里的 id 并沒有按照自增的方式來增加,而且設(shè)置為了一個(gè)新的 id,原因就是沒有指定數(shù)據(jù)庫(kù)中的主鍵
通過@TableId
注解可以設(shè)置 id 的一些屬性,這里傳入?yún)?shù)(type = IdType.AUTO)
表示自增
再來看修改和刪除操作
@Test void testUpdate(){ UserInfo userinfo = new UserInfo(); userinfo.setId(3); userinfo.setPassword("00000"); userInfoMapper.updateById(userinfo); }
@Test void testDelete(){ userInfoMapper.deleteById(3); }
這里演示的都是通過 id 來進(jìn)行操作的,這里的 id 必須是對(duì)應(yīng)實(shí)體類所映射表的主鍵
1.3. 日志打印
和 Mybatis 一樣,也可以進(jìn)行配置打印日志,來觀察對(duì)應(yīng)的 sql 語句
mybatis-plus: configuration: # 配置打印 MyBatis日志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2. 條件構(gòu)造器
MyBatis-Plus 提供了一套強(qiáng)大的條件構(gòu)造器(Wrapper),用于構(gòu)建復(fù)雜的數(shù)據(jù)庫(kù)查詢條件。
- AbstractWrapper:這是一個(gè)抽象基類,提供了所有 Wrapper 類共有的方法和屬性。
- QueryWrapper:專門用于構(gòu)造查詢條件,支持基本的等于、不等于、大于、小于等各種常見操作。它允許你以鏈?zhǔn)秸{(diào)用的方式添加多個(gè)查詢條件,并且可以組合使用
and
和or
邏輯。 - UpdateWrapper:用于構(gòu)造更新條件,可以在更新數(shù)據(jù)時(shí)指定條件。與 QueryWrapper 類似,它也支持鏈?zhǔn)秸{(diào)用和邏輯組合。使用 UpdateWrapper 可以在不創(chuàng)建實(shí)體對(duì)象的情況下,直接設(shè)置更新字段和條件。
- LambdaQueryWrapper:這是一個(gè)基于 Lambda 表達(dá)式的查詢條件構(gòu)造器,它通過 Lambda 表達(dá)式來引用實(shí)體類的屬性,從而避免了硬編碼字段名。這種方式提高了代碼的可讀性和可維護(hù)性,尤其是在字段名可能發(fā)生變化的情況下。
- LambdaUpdateWrapper:類似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表達(dá)式的更新條件構(gòu)造器。它允許你使用 Lambda 表達(dá)式來指定更新字段和條件,同樣避免了硬編碼字段名的問題。
2.1. QueryWrapper
@Test void testQueryWrapper() { QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>(); queryWrapper.select("user_name", "password") .eq("delete_flag", 0) .like("user_name", "min"); userInfoMapper.selectList(queryWrapper).forEach(System.out::println); }
eq 就構(gòu)造了一個(gè)相等條件,like 構(gòu)造了一個(gè)模糊查詢的條件,除此之外還有其他的一些模糊查詢的構(gòu)造
這就相當(dāng)于下面的這條 sql 語句
部分方法名的表示含義:
方法名 | 表示 |
lt | "less than"的縮寫,表示小于. |
le | "less than or equal to"的縮寫,表示小于等于 |
ge | "greater than or equal to"的縮寫,表示大于等于. |
gt | "greater than"的縮寫,表示大于. |
eq | "equals"的縮寫,表示等于. |
ne | "not equals"的縮寫,表示不等于 |
如果要使用 delete 的話也是可以使用 QueryWrapper 來構(gòu)造一個(gè)判斷條件,然后再調(diào)用 delete 方法
2.2. UpdateWrapper
來看一下還用 QueryWrapper 來構(gòu)造條件進(jìn)行更新:
@Test void testQueryWrapper2() { QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>(); queryWrapper.lt("id", 2); UserInfo userInfo = new UserInfo(); userInfo.setDeleteFlag(1); userInfoMapper.update(userInfo, queryWrapper); }
還是先用 QueryWrapper 構(gòu)造出判斷條件,然后和要更新的對(duì)象傳入 update 方法中,這樣就有些麻煩了,來看使用 UpdateWrapper 來進(jìn)行簡(jiǎn)化
@Test void testUpdateWrapper() { UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>(); updateWrapper.set("delete_flag", 0) .lt("id", 2); userInfoMapper.update(updateWrapper); }
這里直接就可以構(gòu)造出要更新的內(nèi)容和判斷條件,然后直接傳入 update 方法中
再來看批量修改的方式:
@Test void testUpdateWrapper1() { UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>(); updateWrapper.set("delete_flag", 1) .in("id", List.of(1, 2, 3)); userInfoMapper.update(updateWrapper); }
這里通過 in 方法來構(gòu)造 sql 語句中的 in
再來看涉及到表達(dá)式的 sql 語句怎么構(gòu)造
@Test void testUpdateWrapper2(){ UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>(); updateWrapper.setSql("age = age + 10") .in("id",List.of(1,2,3)); userInfoMapper.update(updateWrapper); }
可以直接通過 setSql 方法來設(shè)置 sql 語句
2.3. LambdaQueryWrapper
在上面的示例中,傳入的參數(shù)都是字符串,也就是硬編碼字段名,如果發(fā)生修改的話,不方便維護(hù),寫起來容易出錯(cuò),就可以使用 LambdaQueryWrapper 來通過 lambda 表達(dá)式的方式來引用類的屬性
@Test void testLambdaQueryWrapper(){ QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda() .select(UserInfo :: getId,UserInfo :: getUserName,UserInfo :: getPassword) .eq(UserInfo::getId ,2); System.out.println(userInfoMapper.selectOne(queryWrapper)); }
直接使用就不用調(diào)用 lambda 方法了
@Test void testLambdaQueryWrapper() { LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper .select(UserInfo::getId, UserInfo::getUserName, UserInfo::getPassword) .eq(UserInfo::getId, 2); System.out.println(userInfoMapper.selectOne(lambdaQueryWrapper)); }
通過這樣的方式就避免了字符串容易寫錯(cuò)的問題
2.4. LambdaUpdateWrapper
與之對(duì)應(yīng)的,還有 LambdaUpdateWrapper,使用方法也是類似的
@Test void testLambdaUpdateWrapper(){ UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda() .set(UserInfo::getDeleteFlag, 0) .in(UserInfo::getId, List.of(1, 2, 3)); userInfoMapper.update(updateWrapper); }
也是直接使用,就不用調(diào)用 lambda 方法了
@Test void testLambdaUpdateWrapper() { LambdaUpdateWrapper<UserInfo> lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); lambdaUpdateWrapper .set(UserInfo::getDeleteFlag, 1) .in(UserInfo::getId, List.of(1, 2, 3)); userInfoMapper.update(lambdaUpdateWrapper); }
3. 自定義 sql
Mybatis plus 提供的方法可能不能滿足一些其他需求,這是就可以自定義 sql,第一種實(shí)現(xiàn)方式還是之前 Mybatis 的寫法,直接把 sql 語句寫在注解里,或者是使用 XML 的方式
除此之外,Mybatis plus 也提供了另一種構(gòu)造自定義 sql 的方式,來看官方文檔中的介紹
@Mapper public interface UserInfoMapper extends BaseMapper<UserInfo> { @Select("select * from user_info ${ew.customSqlSegment}") List<UserInfo> selectByCustom(@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper); }
通過 ${ew.customSqlSegment}
引入了 Wrapper 對(duì)象生成的 SQL 片段,來實(shí)現(xiàn)自定義 sql,然后調(diào)用方法,傳入一個(gè) Wrapper 對(duì)象
XML 方式也是一樣的,把注解中的 sql 語句寫到 XML 中就可以了
再來看上面 sql 表達(dá)式的例子
來自定義一下上面的 sql 語句
@Update("update user_info set age = age + #{age} ${ew.customSqlSegment}") Integer updateByCustom(@Param("age") Integer age,@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);
@Test void updateByCustom() { QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>(); queryWrapper.in("in",List.of(1,2,3)); userInfoMapper.updateByCustom(10,queryWrapper); }
到此這篇關(guān)于MyBatisPlus項(xiàng)目的創(chuàng)建和使用的文章就介紹到這了,更多相關(guān)MyBatisPlus項(xiàng)目創(chuàng)建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java使用FuncGPT慧函數(shù)對(duì)Mybatis進(jìn)行一對(duì)一查詢映射處理
這篇文章主要介紹了java使用FuncGPT慧函數(shù)對(duì)Mybatis進(jìn)行一對(duì)一查詢映射處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Java利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏
這篇文章主要介紹了利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏,首先在需要進(jìn)行脫敏的VO字段上面標(biāo)注相關(guān)脫敏注解,具體實(shí)例代碼文中給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10Mybatis查不到數(shù)據(jù)查詢返回Null問題
mybatis突然查不到數(shù)據(jù),查詢返回的都是Null,但是 select count(*) from xxx查詢數(shù)量,返回卻是正常的。好多朋友遇到這樣的問題不知所措,下面小編通過本教程簡(jiǎn)單給大家說明下2016-08-08Java實(shí)現(xiàn)小型圖書館管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)小型圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11Spring Cache優(yōu)化數(shù)據(jù)庫(kù)訪問的項(xiàng)目實(shí)踐
本文主要介紹了Spring Cache優(yōu)化數(shù)據(jù)庫(kù)訪問的項(xiàng)目實(shí)踐,將創(chuàng)建一個(gè)簡(jiǎn)單的圖書管理應(yīng)用作為示例,并演示如何通過緩存減少對(duì)數(shù)據(jù)庫(kù)的頻繁查詢,感興趣的可以了解一下2024-01-01五分鐘解鎖springboot admin監(jiān)控新技巧
本文不會(huì)講如何搭建企業(yè)的運(yùn)維監(jiān)控系統(tǒng),有興趣的可以去找找成熟的比如Zabbix、Prometheus,甚至比較簡(jiǎn)單的Wgcloud都能滿足一定的需求,不在此贅述。本文講解如何使用Springboot admin對(duì)spring boot項(xiàng)目進(jìn)行應(yīng)用監(jiān)控,感興趣的朋友一起看看吧2021-06-06