# 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>
@Data
@TableName("user") // 指定表名
public class User {
@TableId(type = IdType.AUTO) // 主鍵自增
private Long id;
private String name;
private Integer age;
private String email;
}
public interface UserMapper extends BaseMapper<User> {
// 繼承BaseMapper即擁有基本CRUD方法
}
// 通過主鍵查詢
User user = userMapper.selectById(1L);
// 批量主鍵查詢
List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
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);
方法名 | 說明 | 示例 |
---|---|---|
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)) |
LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();
lambdaWrapper.eq(User::getName, "張三")
.gt(User::getAge, 20);
List<User> users = userMapper.selectList(lambdaWrapper);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByAsc("age") // 按年齡升序
.orderByDesc("create_time"); // 按創建時間降序
// 配置分頁插件
@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);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("avg(age) as avgAge", "max(age) as maxAge");
Map<String, Object> map = userMapper.selectMaps(wrapper).get(0);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("age, count(*) as userCount")
.groupBy("age")
.having("count(*) > 1");
List<Map<String, Object>> list = userMapper.selectMaps(wrapper);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.nested(i -> i.eq("name", "張三").or().eq("name", "李四"))
.and(i -> i.gt("age", 20).lt("age", 30));
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);
}
@Select("select * from user where age > #{age}")
List<User> selectByAge(@Param("age") Integer age);
<!-- UserMapper.xml -->
<select id="selectByName" resultType="User">
SELECT * FROM user WHERE name LIKE CONCAT('%',#{name},'%')
</select>
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id", "name", "email");
@Data
public class UserVO {
private Long userId;
private String userName;
}
@Select("select id as userId, name as userName from user")
List<UserVO> selectUserVOs();
# application.properties
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
@TableField(value = "db_column") // 指定數據庫字段名
private String myField;
// 實體類添加注解
@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的查詢功能,可以顯著提高開發效率,減少樣板代碼,讓開發者更專注于業務邏輯的實現。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。