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

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

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

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

1. 快速上手

1.1. 項(xiàng)目的創(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)建好項(xiàng)目之后,需要根據(jù)數(shù)據(jù)庫中的字段來寫相應(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 提供了一個基礎(chǔ)的 BaseMapper 接口,已經(jīng)實(shí)現(xiàn)了單表的增刪查改操作,自定義的 Mapper 只需要繼承這個 BaseMapper,就不用自己實(shí)現(xiàn)相應(yīng)的單表增刪查改操作了

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

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

1.2. 增刪查改的簡單演示

之后就可以進(jìn)行增刪查改的單元測試了

查詢:

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;

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

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

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

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

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

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

把規(guī)范的駝峰命名方式修改一下就又報(bào)錯了,這時(shí)候,就要使用@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 來進(jìn)行操作的,這里的 id 必須是對應(yīng)實(shí)體類所映射表的主鍵

1.3. 日志打印

和 Mybatis 一樣,也可以進(jìn)行配置打印日志,來觀察對應(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ù)庫查詢條件。

  • AbstractWrapper:這是一個抽象基類,提供了所有 Wrapper 類共有的方法和屬性。
  • QueryWrapper:專門用于構(gòu)造查詢條件,支持基本的等于、不等于、大于、小于等各種常見操作。它允許你以鏈?zhǔn)秸{(diào)用的方式添加多個查詢條件,并且可以組合使用 and 和 or 邏輯。
  • UpdateWrapper:用于構(gòu)造更新條件,可以在更新數(shù)據(jù)時(shí)指定條件。與 QueryWrapper 類似,它也支持鏈?zhǔn)秸{(diào)用和邏輯組合。使用 UpdateWrapper 可以在不創(chuàng)建實(shí)體對象的情況下,直接設(shè)置更新字段和條件。
  • LambdaQueryWrapper:這是一個基于 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)造了一個相等條件,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)造條件進(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)造出判斷條件,然后和要更新的對象傳入 update 方法中,這樣就有些麻煩了,來看使用 UpdateWrapper 來進(jì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ù),寫起來容易出錯,就可以使用 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));
}

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

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

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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

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

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

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

    java 對象的序列化和反序列化詳細(xì)介紹

    這篇文章主要介紹了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實(shí)現(xiàn)解析Excel復(fù)雜表頭

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

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

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

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

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

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

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

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

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

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

    @RefreshScope 自動刷新配置文件的實(shí)例講解

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

最新評論

息烽县| 太仓市| 北海市| 平武县| 新邵县| 中方县| 鄢陵县| 长乐市| 安吉县| 达孜县| 和林格尔县| 苍梧县| 宝兴县| 新余市| 伊川县| 永顺县| 永平县| 新化县| 根河市| 大英县| 宝山区| 汝州市| 靖州| 扶风县| 平江县| 福清市| 河北省| 武隆县| 辽中县| 进贤县| 芒康县| 拜泉县| 项城市| 太康县| 应城市| 普定县| 大厂| 贵南县| 彰武县| 衡水市| 邳州市|