最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatisPlus項目的創(chuàng)建和使用

 更新時間:2024年11月24日 09:35:15   作者:2的n次方_  
本文介紹了MyBatis-Plus的基本使用方法,包括項目的創(chuàng)建和配置、增刪查改操作、日志打印以及條件構(gòu)造器的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文主要介紹了 MyBatisPlus項目的創(chuàng)建和使用,具體如下:

1. 快速上手

1.1. 項目的創(chuàng)建和配置

首先,創(chuàng)建一個 Spring Boot 工程,添加 MyBatis Plus 和 MySQL 對應(yīng)的依賴,然后,和 MyBatis 一樣,需要在 yml 文件中配置數(shù)據(jù)庫連接信息

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
  <version>3.5.9</version>
</dependency>

創(chuàng)建好項目之后,需要根據(jù)數(shù)據(jù)庫中的字段來寫相應(yīng)的實體類

@Data
public class UserInfo {
    private Integer id;
    private String userName;
    private String password;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

MybatisPlus 提供了一個基礎(chǔ)的 BaseMapper 接口,已經(jīng)實現(xiàn)了單表的增刪查改操作,自定義的 Mapper 只需要繼承這個 BaseMapper,就不用自己實現(xiàn)相應(yīng)的單表增刪查改操作了

為了讓 Spring 掃描到這個類,也是需要加上 @Mapper注解的,或者在啟動類上加上@MapperScan注解,參數(shù)就寫包的路徑

@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}

1.2. 增刪查改的簡單演示

之后就可以進行增刪查改的單元測試了

查詢:

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;

    //查詢
    @Test
    void testSelect(){
        System.out.println(userInfoMapper.selectById(1));
    }
}

和使用 Mybatis 時的結(jié)果是一樣的

那么就有一個問題,Mapper 中不寫 sql 語句是怎么知道要操作哪張表的,其實就是繼承的BaseMapper<UserInfo>中傳入的泛型參數(shù),會將 Java 中類的命名規(guī)范改為數(shù)據(jù)庫中的命名規(guī)范,類中的屬性也是按照規(guī)范映射到數(shù)據(jù)庫中表的字段的,那么就會有一個問題,如果說類名或者屬性名沒有按照規(guī)范來定義,還能知道操作的是哪張表嗎

把類名修改以后就報錯了,報錯信息為數(shù)據(jù)庫中找不到這個表,如果命名規(guī)范的話是可以把UserInfo轉(zhuǎn)化為表名user_info

這時候使用 @TableName來指定一下具體要操作哪張表就可以了

同理,屬性名如果命名不規(guī)范也是不能自動轉(zhuǎn)化成功的

把規(guī)范的駝峰命名方式修改一下就又報錯了,這時候,就要使用@TableField注解來指定對應(yīng)的表的字段

然后來看 insert 方法

@Test
void testInsert(){
    UserInfo userinfo = new UserInfo();
    userinfo.setUserName("java");
    userinfo.setPassword("java");
    userInfoMapper.insert(userinfo);
}

雖然說插入成功了,但是數(shù)據(jù)好像不太對,這里的 id 并沒有按照自增的方式來增加,而且設(shè)置為了一個新的 id,原因就是沒有指定數(shù)據(jù)庫中的主鍵

通過@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 來進行操作的,這里的 id 必須是對應(yīng)實體類所映射表的主鍵

1.3. 日志打印

和 Mybatis 一樣,也可以進行配置打印日志,來觀察對應(yīng)的 sql 語句

mybatis-plus:
  configuration: # 配置打印 MyBatis日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2. 條件構(gòu)造器

MyBatis-Plus 提供了一套強大的條件構(gòu)造器(Wrapper),用于構(gòu)建復(fù)雜的數(shù)據(jù)庫查詢條件。

  • AbstractWrapper:這是一個抽象基類,提供了所有 Wrapper 類共有的方法和屬性。
  • QueryWrapper:專門用于構(gòu)造查詢條件,支持基本的等于、不等于、大于、小于等各種常見操作。它允許你以鏈式調(diào)用的方式添加多個查詢條件,并且可以組合使用 and 和 or 邏輯。
  • UpdateWrapper:用于構(gòu)造更新條件,可以在更新數(shù)據(jù)時指定條件。與 QueryWrapper 類似,它也支持鏈式調(diào)用和邏輯組合。使用 UpdateWrapper 可以在不創(chuàng)建實體對象的情況下,直接設(shè)置更新字段和條件。
  • LambdaQueryWrapper:這是一個基于 Lambda 表達式的查詢條件構(gòu)造器,它通過 Lambda 表達式來引用實體類的屬性,從而避免了硬編碼字段名。這種方式提高了代碼的可讀性和可維護性,尤其是在字段名可能發(fā)生變化的情況下。
  • LambdaUpdateWrapper:類似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表達式的更新條件構(gòu)造器。它允許你使用 Lambda 表達式來指定更新字段和條件,同樣避免了硬編碼字段名的問題。

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)造了一個相等條件,like 構(gòu)造了一個模糊查詢的條件,除此之外還有其他的一些模糊查詢的構(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)造一個判斷條件,然后再調(diào)用 delete 方法

2.2. UpdateWrapper

來看一下還用 QueryWrapper 來構(gòu)造條件進行更新:

@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)造出判斷條件,然后和要更新的對象傳入 update 方法中,這樣就有些麻煩了,來看使用 UpdateWrapper 來進行簡化

@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

再來看涉及到表達式的 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ā)生修改的話,不方便維護,寫起來容易出錯,就可以使用 LambdaQueryWrapper 來通過 lambda 表達式的方式來引用類的屬性

@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));
}

通過這樣的方式就避免了字符串容易寫錯的問題

2.4. LambdaUpdateWrapper

與之對應(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,第一種實現(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 對象生成的 SQL 片段,來實現(xiàn)自定義 sql,然后調(diào)用方法,傳入一個 Wrapper 對象

XML 方式也是一樣的,把注解中的 sql 語句寫到 XML 中就可以了

再來看上面 sql 表達式的例子

來自定義一下上面的 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項目的創(chuàng)建和使用的文章就介紹到這了,更多相關(guān)MyBatisPlus項目創(chuàng)建內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Java連接并操作Sedna XML數(shù)據(jù)庫的方法

    Java連接并操作Sedna XML數(shù)據(jù)庫的方法

    這篇文章主要介紹了Java連接并操作Sedna XML數(shù)據(jù)庫的方法,較為詳細的說明了Sedna XML數(shù)據(jù)庫的原理與功能,并給出了基于java操作Sedna XML數(shù)據(jù)庫的方法,需要的朋友可以參考下
    2015-06-06
  • java 對象的序列化和反序列化詳細介紹

    java 對象的序列化和反序列化詳細介紹

    這篇文章主要介紹了java 對象的序列化和反序列化的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • java學(xué)習(xí)之一維數(shù)組中重復(fù)元素的去除

    java學(xué)習(xí)之一維數(shù)組中重復(fù)元素的去除

    關(guān)于一維數(shù)組中有重復(fù)的元素該怎么剔除,作為java初學(xué)者的我整理出不調(diào)用任何特殊庫的基礎(chǔ)方法,這種思想在其他語言也適用,有需要的朋友可以借鑒參考下
    2021-09-09
  • 詳解SSM框架下結(jié)合log4j、slf4j打印日志

    詳解SSM框架下結(jié)合log4j、slf4j打印日志

    本篇文章主要介紹了詳解SSM框架下結(jié)合log4j、slf4j打印日志,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Java實現(xiàn)解析Excel復(fù)雜表頭

    Java實現(xiàn)解析Excel復(fù)雜表頭

    這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)解析Excel復(fù)雜表頭功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • Web三大組件之Filter,Listener和Servlet詳解

    Web三大組件之Filter,Listener和Servlet詳解

    這篇文章主要為大家詳細介紹了Web三大組件之Filter,Listener和Servlet,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • MyBatis-plus+達夢數(shù)據(jù)庫實現(xiàn)自動生成代碼的示例

    MyBatis-plus+達夢數(shù)據(jù)庫實現(xiàn)自動生成代碼的示例

    這篇文章主要介紹了MyBatis-plus+達夢數(shù)據(jù)庫實現(xiàn)自動生成代碼的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • form表單數(shù)據(jù)通過@RequestBody解析成java實體類的實現(xiàn)過程

    form表單數(shù)據(jù)通過@RequestBody解析成java實體類的實現(xiàn)過程

    解決@RequestBody請求無法接收前端數(shù)據(jù)問題:前端通過axios提交數(shù)據(jù),后端使用fastJSON解析時出現(xiàn)NULL,通過在實體類上添加@JSONField注解指定屬性對應(yīng)關(guān)系,可以成功接收數(shù)據(jù)
    2025-12-12
  • springboot實現(xiàn)rabbitmq的隊列初始化和綁定

    springboot實現(xiàn)rabbitmq的隊列初始化和綁定

    這篇文章主要介紹了springboot實現(xiàn)rabbitmq的隊列初始化和綁定,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • @RefreshScope 自動刷新配置文件的實例講解

    @RefreshScope 自動刷新配置文件的實例講解

    efreshScope(org.springframework.cloud.context.scope.refresh)是spring cloud提供的一種特殊的scope實現(xiàn),用來實現(xiàn)配置、實例熱加載,這篇文章主要介紹了@RefreshScope 自動刷新配置文件,需要的朋友可以參考下
    2022-11-11

最新評論

南投市| 新竹县| 广宗县| 东辽县| 阳曲县| 塘沽区| 罗源县| 元江| 亚东县| 赤壁市| 望奎县| 南岸区| 盐城市| 阳谷县| 科技| 图们市| 顺平县| 烟台市| 札达县| 克拉玛依市| 河北省| 正镶白旗| 瑞金市| 呼玛县| 柳林县| 昔阳县| 阿合奇县| 松桃| 黎城县| 岫岩| 桐乡市| 庆云县| 桃园市| 黄梅县| 高清| 古浪县| 连平县| 法库县| 奉节县| 黑河市| 三都|