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

MyBatisPlus的使用最全實例詳解

 更新時間:2025年09月20日 14:04:40   作者:Leo_lc—lc  
MyBatis-Plus是MyBatis增強工具,簡化開發(fā)并提升效率,內(nèi)置通用Mapper、Service及條件構造器,支持動態(tài)SQL、分頁查詢與注解配置,適用于單表操作,復雜SQL可手動編寫,減少樣板代碼,優(yōu)化開發(fā)體驗

一、MyBatis-Plus 是什么?

  • ??定位??:MyBatis 的增強工具,簡化開發(fā),提高效率。
  • ??特點??:內(nèi)置通用 Mapper、通用 Service、條件構造器、分頁插件等,無需編寫繁瑣的 XML。
  • ??核心思想??:通過少量配置實現(xiàn)單表 CRUD 操作,復雜 SQL 仍可手寫。

二、快速開始(Spring Boot 環(huán)境)

1. 添加依賴

在 pom.xml 中引入:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>最新版本(如3.5.3)</version>
</dependency>
<!-- 數(shù)據(jù)庫驅(qū)動(如MySQL) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.25</version>
</dependency>

2. 配置數(shù)據(jù)庫

在 application.yml 中:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

3. 創(chuàng)建實體類

@Data  // Lombok 注解,自動生成 getter/setter
@TableName("user")  // 對應數(shù)據(jù)庫表名
public class User {
    @TableId(type = IdType.AUTO)  // 主鍵自增
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

4. 創(chuàng)建 Mapper 接口

public interface UserMapper extends BaseMapper<User> {
    // 無需寫 XML,直接繼承 BaseMapper 即具備 CRUD 方法
}

5. 在啟動類添加注解

@SpringBootApplication
@MapperScan("com.example.mapper")  // 掃描 Mapper 接口所在包
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

三、基本 CRUD 操作

1. 插入數(shù)據(jù)

User user = new User();
user.setName("張三");
user.setAge(25);
user.setEmail("zhangsan@example.com");
userMapper.insert(user);  // 插入后自動回填主鍵

2. 查詢操作

// 根據(jù) ID 查詢
User user = userMapper.selectById(1L);
// 條件查詢(查詢 name=張三且 age=25 的用戶)
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "張三").eq("age", 25);
List<User> users = userMapper.selectList(queryWrapper);

3. 更新操作

User user = new User();
user.setId(1L);
user.setAge(30);
userMapper.updateById(user);  // 根據(jù) ID 更新

4. 刪除操作

userMapper.deleteById(1L);  // 根據(jù) ID 刪除
// 條件刪除
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("age", 25);
userMapper.delete(wrapper);

四、條件構造器(Wrapper)

1.QueryWrapper詳解

(1)基本用法

QueryWrapper<User> wrapper = new QueryWrapper<>();

(2)常用條件方法

a. 等值條件

wrapper.eq("name", "張三")     // name = '張三'
       .ne("age", 20)         // age != 20
       .isNotNull("email");   // email IS NOT NULL

b. 范圍條件

wrapper.gt("age", 18)        // age > 18
       .ge("age", 20)        // age >= 20
       .lt("age", 30)        // age < 30
       .le("age", 25)        // age <= 25
       .between("age", 20, 30) // age BETWEEN 20 AND 30
       .notBetween("age", 20, 30); // age NOT BETWEEN 20 AND 30

c. 模糊查詢

wrapper.like("name", "張")    // name LIKE '%張%'
       .likeLeft("name", "三")  // name LIKE '%三'
       .likeRight("name", "張") // name LIKE '張%'
       .notLike("name", "李");  // name NOT LIKE '%李%'

d. 邏輯條件

wrapper.and(w -> w.eq("name", "張三").gt("age", 20))  // AND (name = '張三' AND age > 20)
       .or(w -> w.eq("name", "李四").lt("age", 30)); // OR (name = '李四' OR age < 30)

e. 排序與分組

wrapper.orderByAsc("age")     // ORDER BY age ASC
       .orderByDesc("id")    // ORDER BY id DESC
       .groupBy("department"); // GROUP BY department

f. 指定返回字段

wrapper.select("id", "name", "age"); // SELECT id, name, age

g. 子查詢

wrapper.inSql("id", "SELECT id FROM user WHERE age > 18")  // id IN (SELECT id ...)
       .notInSql("id", "SELECT id FROM user WHERE age < 10");

(3)動態(tài)條件拼接

根據(jù)業(yè)務邏輯動態(tài)添加條件:

QueryWrapper<User> wrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(name)) {
    wrapper.like("name", name);
}
if (age != null) {
    wrapper.gt("age", age);
}
List<User> users = userMapper.selectList(wrapper);

2.LambdaQueryWrapper詳解

(1)為什么用Lambda

  • ??優(yōu)勢??:避免字段名硬編碼,編譯時檢查,重構友好。
  • ??語法??:通過 User::getXxx 引用字段。

(2)基本用法

LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();

(3)常用方法

lambdaWrapper.eq(User::getName, "張三")
             .gt(User::getAge, 20)
             .between(User::getAge, 20, 30)
             .like(User::getName, "張")
             .orderByAsc(User::getAge);

 (4)動態(tài)條件示例

lambdaWrapper
    .eq(name != null, User::getName, name) // 僅當 name 不為空時生效
    .gt(age != null, User::getAge, age);

3.復雜條件組合

(1)嵌套條件

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.and(w -> w.eq("name", "張三").or().eq("name", "李四"))
       .and(w -> w.gt("age", 20).lt("age", 30));

生成的SQL:

WHERE (name = '張三' OR name = '李四') AND (age > 20 AND age < 30)

 (2)多OR條件

wrapper.or(w -> w.eq("name", "張三").eq("name", "李四"));

生成的SQL:

WHERE name = '張三' OR name = '李四'

4.條件構造器的鏈式調(diào)用優(yōu)化

(1)直接鏈式挑戰(zhàn)

List<User> users = userMapper.selectList(
    new QueryWrapper<User>()
        .eq("name", "張三")
        .gt("age", 20)
        .orderByDesc("id")
);

(2)復用 Wrapper 對象

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("status", 1);
// 根據(jù)不同場景追加條件
if (isAdmin) {
    wrapper.eq("is_admin", 1);
} else {
    wrapper.eq("department", "IT");
}

5.條件構造器的實際應用場景

(1)動態(tài)搜索功能

public List<User> searchUsers(String keyword, Integer minAge, Integer maxAge) {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.like(StringUtils.isNotBlank(keyword), User::getName, keyword)
           .or()
           .like(StringUtils.isNotBlank(keyword), User::getEmail, keyword)
           .ge(minAge != null, User::getAge, minAge)
           .le(maxAge != null, User::getAge, maxAge);
    return userMapper.selectList(wrapper);
}

(2)多表聯(lián)查中的條件傳遞

// 假設聯(lián)查用戶表和訂單表
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.inSql("id", "SELECT user_id FROM order WHERE amount > 1000");
List<User> users = userMapper.selectList(wrapper);

6.總結(jié)表格

方法名作用示例
eq() / ne()等于 / 不等于eq("name", "張三")
gt() / lt()大于 / 小于gt("age", 20)
between()范圍查詢between("age", 20, 30)
like() / notLike()模糊查詢like("name", "張")
and() / or()邏輯與 / 或and(w -> w.eq(...))
orderByAsc()升序排序orderByAsc("age")
select()指定返回字段select("id", "name")
inSql()子查詢inSql("id", "SELECT id FROM ...")

五、分頁查詢

1. 配置分頁插件

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

2. 使用分頁

// 第 2 頁,每頁 5 條
Page<User> page = new Page<>(2, 5);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 20);
Page<User> result = userMapper.selectPage(page, wrapper);
// 獲取結(jié)果
List<User> users = result.getRecords();
long total = result.getTotal();

六、常用注解

1.@TableName

  • 指定實體類對應的表名。
  • 示例:@TableName("sys_user")

2.@TableId

  • 標記主鍵字段。
  • 可選主鍵策略:
    • IdType.AUTO:數(shù)據(jù)庫自增
    • IdType.ASSIGN_ID:雪花算法生成 ID(默認)

3.@TableField

  • 解決字段名與數(shù)據(jù)庫列名不一致問題。
  • 示例:@TableField("nick_name")

七、總結(jié)

  • ??優(yōu)點??:減少樣板代碼,提高開發(fā)效率。
  • ??適用場景??:單表操作、簡單查詢。
  • ??復雜 SQL??:仍可通過 XML 或注解方式編寫。

到此這篇關于MyBatisPlus的使用的文章就介紹到這了,更多相關MyBatisPlus使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot深入淺出分析初始化器

    SpringBoot深入淺出分析初始化器

    這篇文章主要介紹了SpringBoot初始化器的分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Spring 依賴注入實現(xiàn)示例

    Spring 依賴注入實現(xiàn)示例

    這篇文章主要介紹了Spring 依賴注入實現(xiàn)示例的相關資料,幫助大家更好的理解和使用spring框架,感興趣的朋友可以了解下
    2020-11-11
  • Java中使用標簽(label)來控制循環(huán)的執(zhí)行流程

    Java中使用標簽(label)來控制循環(huán)的執(zhí)行流程

    java 和 label 兩個完全不相干的詞,今天我把他們連接在一起了,試想一個問題,雙循環(huán)在不使用 return 的情況下,如何停止外循環(huán)?所以本文給大家介紹了Java中使用標簽(label)來控制循環(huán)的執(zhí)行流程,需要的朋友可以參考下
    2024-06-06
  • Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)

    Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)

    XMLType是Oracle支持的一種基于XML格式存儲的數(shù)據(jù)類型,這里我們共同來探究Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)的方法:
    2016-07-07
  • SpringBoot緩存方法返回值的方法詳解

    SpringBoot緩存方法返回值的方法詳解

    如何緩存方法的返回值?應該會有很多的辦法,這篇文章主要為大家介紹兩個比較常見并且比較容易實現(xiàn)的辦法:自定義注解和SpringCache,希望對大家有所幫助
    2023-10-10
  • Spring Boot集成Logback終極指南之從基礎到高級配置實戰(zhàn)指南

    Spring Boot集成Logback終極指南之從基礎到高級配置實戰(zhàn)指南

    Logback是一個可靠、通用且快速的Java日志框架,作為Log4j的繼承者,由Log4j創(chuàng)始人設計,這篇文章主要介紹了Spring Boot集成Logback終極指南之從基礎到高級配置實戰(zhàn)指南,需要的朋友可以參考下
    2025-05-05
  • 30分鐘入門Java8之方法引用學習

    30分鐘入門Java8之方法引用學習

    在Java8中,我們可以直接通過方法引用來簡寫lambda表達式中已經(jīng)存在的方法,這篇文章主要介紹了30分鐘入門Java8之方法引用學習,有興趣可以了解一下。
    2017-04-04
  • SpringMVC中常用注解與使用方法詳解

    SpringMVC中常用注解與使用方法詳解

    這篇文章主要介紹了SpringMVC中常用注解與使用方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • Kotlin中的抽象類實現(xiàn)

    Kotlin中的抽象類實現(xiàn)

    這篇文章主要介紹了Kotlin中的抽象類實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解

    SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解

    這篇文章主要介紹了SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評論

雷山县| 山东省| 浠水县| 顺义区| 江北区| 岳阳县| 镇原县| 屯留县| 利辛县| 汕头市| 堆龙德庆县| 双江| 扶沟县| 清镇市| 申扎县| 库尔勒市| 金寨县| 洛南县| 长治市| 辽宁省| 鄂托克前旗| 株洲县| 郑州市| 漳平市| 林口县| 赫章县| 自贡市| 张家界市| 巴南区| 正定县| 日喀则市| 北辰区| 丹巴县| 抚顺市| 澎湖县| 昭觉县| 天祝| 南平市| 军事| 盱眙县| 丁青县|