跳到主要内容

方法名派生查询

根据方法名自动生成 SQL

概述

MyBatisGX 支持根据 DAO 接口方法名自动派生 SQL,无需编写 XML 或注解。

查询方法

基本格式

// find/get/query/select 开头
List<User> findByName(String name);
User getByName(String name);
List<User> queryByName(String name);
List<User> selectByName(String name);

条件组合

// AND 条件
List<User> findByNameAndAge(String name, Integer age);

// OR 条件
List<User> findByNameOrAge(String name, Integer age);

// 复杂组合
List<User> findByNameAndAgeOrDept(String name, Integer age, String dept);

排序

// 单字段排序
List<User> findByNameOrderByAgeDesc(String name);

// 多字段排序
List<User> findByNameOrderByAgeDescNameAsc(String name);

限制结果

// Top 关键字
List<User> findTop10ByAgeGt(Integer age);
User findFirstByName(String name);
User findTopByName(String name);

统计查询

// count 开头
Long countByAgeGt(Integer age);
Long countByNameLike(String name);

更新方法

基本格式

// update/modify 开头,By 后面是条件
int updateNameById(String name, Long id);
int modifyAgeByName(Integer age, String name);

条件组合

int updateNameByAgeAndDept(String name, Integer age, String dept);

批量更新

@BatchOperation
int updateStatusBatch(@BatchData List<User> users, @BatchSize int batchSize);

删除方法

基本格式

// delete/remove 开头,By 后面是条件
int deleteByName(String name);
int removeByAge(Integer age);

条件组合

int deleteByNameAndAge(String name, Integer age);

批量删除

@BatchOperation
int deleteBatchByIds(@BatchData List<Long> ids, @BatchSize int batchSize);

新增方法

基本格式

// insert/add 开头
int insertUser(User user);
int addUser(User user);

批量新增

@BatchOperation
int insertBatch(@BatchData List<User> users, @BatchSize int batchSize);

条件关键字

比较运算符

关键字说明SQL示例
Eq / Equal等于=findByNameEq
Lt小于<findByAgeLt
Lteq小于等于<=findByAgeLteq
Gt大于>findByAgeGt
Gteq大于等于>=findByAgeGteq

模糊运算符

关键字说明SQL示例
Like模糊匹配LIKE '%x%'findByNameLike
StartingWith前缀匹配LIKE 'x%'findByNameStartingWith
EndingWith后缀匹配LIKE '%x'findByNameEndingWith

范围运算符

关键字说明SQL示例
Between区间BETWEENfindByAgeBetween
In包含INfindByIdIn

空值运算符

关键字说明SQL示例
IsNull为空IS NULLfindByNameIsNull
IsNotNull / NotNull非空IS NOT NULLfindByNameNotNull

逻辑运算符

关键字说明示例
AndfindByNameAndAge
OrfindByNameOrAge
Not非(可组合)findByNameNotLike

Not 组合使用

// Not 和比较运算符组合
List<User> findByAgeNotGt(Integer age); // age NOT > ?

// Not 和模糊运算符组合
List<User> findByNameNotLike(String name); // name NOT LIKE ?

// Not 和范围运算符组合
List<User> findByAgeNotBetween(Integer a, Integer b); // age NOT BETWEEN ? AND ?
List<User> findByIdNotIn(List<Long> ids); // id NOT IN (?)

方法命名规则

┌─────────────────────────────────────────────────────────────────┐
│ 方法命名结构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ (操作)(条件)(排序) │
│ │
│ find ByNameAndAge OrderByAgeDesc │
│ ├─── └────────────┘ └─────────────┘ │
│ 操作 条件 排序 │
│ │
│ update NameByAgeAndDept │
│ ────── └──┘└────────────┘ │
│ 操作 SET WHERE条件 │
│ │
└─────────────────────────────────────────────────────────────────┘

参数顺序

方法参数顺序与条件字段顺序一致:

// 参数顺序:name, age, dept
List<User> findByNameAndAgeOrDept(String name, Integer age, String dept);

注意事项

  1. 字段名大小写敏感:方法名中的字段名首字母大写,与实体字段对应

  2. 条件优先级

    @Statement 注解 > 实体/QueryEntity 参数 > 方法名关键字
  3. XML 优先:如果在 mapper.xml 中定义了同名方法,使用 XML 中的 SQL

  4. 复杂查询建议:条件过多时建议使用 QueryEntity@Statement

下一步