溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis-Plus如何實現普通查詢

發布時間:2021-12-15 11:42:51 來源:億速云 閱讀:375 作者:小新 欄目:大數據
# MyBatis-Plus如何實現普通查詢

## 一、MyBatis-Plus簡介

### 1.1 MyBatis-Plus概述
MyBatis-Plus(簡稱MP)是MyBatis的增強工具,在MyBatis的基礎上只做增強不做改變,簡化開發、提高效率。它提供了通用的Mapper和Service封裝,通過少量配置即可實現單表大部分CRUD操作。

### 1.2 核心特性
- **無侵入**:只做增強不做改變
- **損耗小**:啟動即會自動注入基本CRUD
- **強大的CRUD操作**:內置通用Mapper、通用Service
- **支持Lambda形式調用**:通過Lambda表達式編寫查詢條件
- **支持主鍵自動生成**:支持多種主鍵策略
- **內置分頁插件**:無需額外配置
- **內置性能分析插件**:可輸出SQL語句及其執行時間

## 二、環境準備

### 2.1 添加依賴
```xml
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>

2.2 實體類配置

@Data
@TableName("user")  // 指定表名
public class User {
    @TableId(type = IdType.AUTO)  // 主鍵自增
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

2.3 Mapper接口

public interface UserMapper extends BaseMapper<User> {
    // 繼承BaseMapper即擁有基本CRUD方法
}

三、基礎查詢方法

3.1 根據ID查詢

// 通過主鍵查詢
User user = userMapper.selectById(1L);

// 批量主鍵查詢
List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));

3.2 條件構造器查詢

3.2.1 QueryWrapper基礎用法

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "張三")  // name = '張三'
       .gt("age", 20)     // age > 20
       .isNotNull("email"); // email is not null

List<User> users = userMapper.selectList(wrapper);

3.2.2 常用條件方法

方法名 說明 示例
eq 等于 = eq(“name”, “張三”)
ne 不等于 <> ne(“name”, “張三”)
gt 大于 > gt(“age”, 18)
ge 大于等于 >= ge(“age”, 18)
lt 小于 < lt(“age”, 65)
le 小于等于 <= le(“age”, 65)
between BETWEEN 值1 AND 值2 between(“age”, 18, 30)
like LIKE ‘%值%’ like(“name”, “張”)
notLike NOT LIKE ‘%值%’ notLike(“name”, “張”)
in 字段 IN (值1, 值2…) in(“age”, Arrays.asList(18,20))

3.3 Lambda查詢

LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();
lambdaWrapper.eq(User::getName, "張三")
             .gt(User::getAge, 20);

List<User> users = userMapper.selectList(lambdaWrapper);

四、高級查詢功能

4.1 排序查詢

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByAsc("age")  // 按年齡升序
       .orderByDesc("create_time"); // 按創建時間降序

4.2 分頁查詢

// 配置分頁插件
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

// 分頁查詢
Page<User> page = new Page<>(1, 10); // 當前頁,每頁大小
Page<User> result = userMapper.selectPage(page, null);

4.3 聚合查詢

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("avg(age) as avgAge", "max(age) as maxAge");
Map<String, Object> map = userMapper.selectMaps(wrapper).get(0);

4.4 分組查詢

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("age, count(*) as userCount")
       .groupBy("age")
       .having("count(*) > 1");
List<Map<String, Object>> list = userMapper.selectMaps(wrapper);

五、復雜條件組合

5.1 AND/OR嵌套

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

5.2 動態條件拼接

public List<User> queryUsers(String name, Integer minAge, Integer maxAge) {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    if (StringUtils.isNotBlank(name)) {
        wrapper.like("name", name);
    }
    if (minAge != null) {
        wrapper.ge("age", minAge);
    }
    if (maxAge != null) {
        wrapper.le("age", maxAge);
    }
    return userMapper.selectList(wrapper);
}

六、自定義SQL查詢

6.1 注解方式

@Select("select * from user where age > #{age}")
List<User> selectByAge(@Param("age") Integer age);

6.2 XML方式

<!-- UserMapper.xml -->
<select id="selectByName" resultType="User">
    SELECT * FROM user WHERE name LIKE CONCAT('%',#{name},'%')
</select>

七、查詢結果處理

7.1 返回Map

List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);

7.2 返回指定列

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id", "name", "email");

7.3 結果集映射

@Data
public class UserVO {
    private Long userId;
    private String userName;
}

@Select("select id as userId, name as userName from user")
List<UserVO> selectUserVOs();

八、性能優化建議

8.1 索引使用建議

  • 為常用查詢條件建立索引
  • 避免在索引列上使用函數
  • 遵循最左前綴原則

8.2 查詢優化技巧

  • 只查詢需要的列(避免select *)
  • 合理使用批量查詢
  • 對大表查詢使用分頁
  • 緩存常用查詢結果

九、常見問題解答

9.1 如何打印SQL日志?

# application.properties
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

9.2 如何處理字段名與屬性名不一致?

@TableField(value = "db_column")  // 指定數據庫字段名
private String myField;

9.3 如何實現邏輯刪除?

// 實體類添加注解
@TableLogic
private Integer deleted;

// 全局配置
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

十、總結

MyBatis-Plus提供了豐富而強大的查詢功能,從簡單的ID查詢到復雜的動態條件組合,都能通過簡潔的API實現。通過合理使用條件構造器、Lambda表達式和自定義SQL,可以滿足絕大多數業務場景的查詢需求。同時,MyBatis-Plus的性能優化建議也能幫助開發者編寫更高效的查詢語句。

在實際開發中,建議: 1. 優先使用Lambda表達式保證類型安全 2. 復雜查詢考慮使用自定義SQL 3. 注意SQL注入風險,避免拼接SQL 4. 合理使用緩存提高查詢性能

通過掌握MyBatis-Plus的查詢功能,可以顯著提高開發效率,減少樣板代碼,讓開發者更專注于業務邏輯的實現。 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女