# search-mybatis-plus
**Repository Path**: ifrog/search-mybatis-plus
## Basic Information
- **Project Name**: search-mybatis-plus
- **Description**: 基于Mybatis-plus的SQL查询工具,支持连表查询
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 12
- **Forks**: 1
- **Created**: 2021-10-20
- **Last Updated**: 2026-01-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Java, mybatis-plus, SQL
## README
# search-mybatis-plus 查询辅助工具
开源不易,点个赞吧!\
最新版本依赖 mybatis-plus-3.5.16 基于 jdk21,如果想使用jdk8版本的可以切换到jdk8分支
## 项目介绍
search-mybatis-plus 是一款查询辅助工具包,以编程的方式模拟SQL语言进行数据查询/更新/删除,无缝集成Mybatis-plus(支持MySql,Oracle,MariaDB,H2,Postgres),具有以下功能:
- 模拟sql,以lambda方式进行构建SQL查询/更新/删除,无需再写xml文件
- Select中支持Max,Min,Avg等聚合函数,CaseWhen子句,IFNULL函数,CTMFunction自定义函数
- 支持连表查询(left join/inner join/right join/cross join)
- 连表查询支持自连接查询(left join/inner join/right join),自连接适应于SQLQuery/SQLUpdate/SQLDelete
- 支持复杂嵌套查询(可以用Alias方式)
- 支持where多条件构造查询,支持构建CTMCondition自定义函数,支持choose when构造条件
- 支持groupBy,orderBy,having及分页查询
- 支持update语句,以lambda方式构建,支持update join(left join/inner join/right join) order by limit 等语句构建
- 支持delete语句,以lambda方式构建,支持delete join(left join/inner join/right join) order by limit 等语句构建
- 支持子查询(select子查询,from子查询,exist子查询,in子查询等)
- 支持表达式加/减/乘/除/幂/模运算
- 无缝集成mybatis-plus,mapper只需继承QBaseMapper就可使用,对业务无侵入
## 方法介绍(QBaseMapper)
- fetchQuery(SQLQuery) - 根据查询对象获取数据列表,返回对象列表
- fetchQueryInto(SQLQuery,Class) - 根据查询对象获取数据列表,转成对应对象列表
- countQuery(SQLQuery) - 根据查询对应返回对应数据的总条数
- updateQuery(SQLUpdate update) - 执行构建的SQLUpdate,返回影响行数
- deleteQuery(SQLDelete delete) - 执行构建的SQLDelete,返回影响行数
- QDL 工具类包含条件及其他函数的创建引用,例如eq条件 -> QDL.eq()
版本升级信息请查看:https://gitee.com/ifrog/search-mybatis-plus/blob/master/CHANGELOG.md
## 使用
添加 Maven(如果找不到可以用https://repo1.maven.org/maven2/) 依赖或者下载项目执行 "mvn clean install"
```java
com.baomibing
search-mybatis-plus
1.0.7
```
* Mapper继承QBaseMapper(必须)
* 服务实现类集成QDL(推荐),在服务实现类可以调用条件构造
* 构建SQLQuery
* 调用QBaseMapper中方法查询数据
具体例子请参考:https://gitee.com/ifrog/search-mybatis-plus-example
### 查询样例1
```java
SQLQuery query = new SQLQuery();
query.selectFrom(SysButton.class).limitOffset(1, 10);
List list = buttonMapper.fetchQueryInto(query, ButtonDto.class)
int count = buttonMapper.countQuery(query);
```
对应SQL为
```sql
SELECT * FROM sys_button LIMIT 10, OFFSET 0;
SELECT count(1) FROM sys_button
```
### 查询样例2
```java
SQLQuery q = new SQLQuery();
q.selectDistinct(
SysMenu::getId,
SysMenu::getRedirect,
SysMenu::getBeHidden,
SysMenu::getMenuName,
SysMenu::getPriority,
SysMenu::getIcon,
SysMenu::getParentId,
SysResourceApi::getReqUrl)
.from(SysMenu.class)
.leftJoin(SysRoleResource.class, eq(SysRoleResource::getResourceId,SysMenu::getId), eq(SysRoleResource::getResourceType,"MENU"))
.leftJoin(SysRole.class, eq(SysRole::getId,SysRoleResource::getRoleId))
.innerJoin(SysResourceApi.class,eq(SysResourceApi::getResourceId,SysMenu::getId), eq(SysResourceApi::getResourceType,"MENU"))
.where(eq(SysMenu::getMenuType,"BUSINESS"))
.orderByasc(SysMenu::getPriority,SysMenu::getParentId)
.limitOffset(1,10);
List list = qbaseMapper.fetchQuery(q);
```
生成的SQL为
```sql
SELECT DISTINCT
sys_menu.id,
sys_menu.redirect,
sys_menu.be_hidden,
sys_menu.menu_name,
sys_menu.priority,
sys_menu.icon,
sys_menu.parent_id,
sys_resource_api.req_url
FROM
sys_menu f
LEFT JOIN sys_role_resource ON (sys_role_resource.resource_id = sys_menu.id AND sys_role_resource.resource_type = 'MENU')
LEFT JOIN sys_role ON sys_role.id = sys_role_resource.role_id
INNER JOIN sys_resource_api ON (sys_resource_api.resource_id = sys_menu.id AND sys_resource_api.resource_type = 'MENU')
WHERE
sys_menu.menu_type = 'BUSINESS'
ORDER BY
sys_menu.priority,
sys_menu.parent_id ASC
LIMIT 10 OFFSET 0
```
### 查询样例3
```java
Alias alias = alias(
sqlQuery().select(
StudentCourse::getCourseId,
as(max(StudentCourse::getScore),"max_score"),
as(min(StudentCourse::getScore),"min_score"))
.from(StudentCourse.class)
.groupBy(StudentCourse::getCourseId), "t");
SQLQuery query = sqlQuery();
query.select(
Course::getName,
field("t.max_score"),
field("t.min_score"),
as(alias.Fields(StudentCourse::getCourseId),"id"))
.from(Course.class)
.innerJoin(alias, eq(Course::getId, alias.Fields(StudentCourse::getCourseId)));
List courses = courseMapper.fetchQueryInto(query, Course.class);
```
生成的SQL为
```sql
SELECT
course.`name`,
t.max_score,
t.min_score,
t.`course_id` AS id
FROM course
INNER JOIN
(SELECT
student_course.`course_id`,
MAX(student_course.`score`) AS max_score,
MIN(student_course.`score`) AS min_score
FROM student_course
GROUP BY student_course.`course_id`) AS t
ON course.`id` = t.`course_id`
```
### 自连表查询样例
```java
SQLQuery query = new SQLQuery();
Alias alias1 = new Alias(SysGroup.class, "g1");
Alias alias2 = new Alias(SysGroup.class, "g2");
query.selectDistinct(alias2.Fields(SysGroup::getId, SysGroup::getGroupLevel, SysGroup::getGroupName))
.from(alias1)
.leftJoin(alias2, like(alias1.Fields(SysGroup::getParentId), alias2.Fields(SysGroup::getId)), eq(alias2.Fields(SysGroup::getGroupLevel), 1))
.where(eq(alias1.Fields(SysGroup::getId), "R0101"));
```
生成的SQL为
```sql
SELECT DISTINCT
g2.`id`,
g2.`group_level`,
g2.`group_name`
FROM
sys_group AS g1
LEFT JOIN sys_group AS g2 ON (g1.`parent_id` LIKE CONCAT('%', g2.`id`, '%') AND g2.`group_level` = 1)
WHERE
g1.`id` = 'R0101'
```
### 更新样例
```java
SQLUpdate sqlUpdate = new SQLUpdate(SysButton.class);
sqlUpdate
.set(eq(SysButton::getButtonName, "test"), eq(SysButton::getMenuId, "test_menu"))
.where(eq(SysButton::getId, "1442023718292295681"));
Integer updateCount = buttonMapper.updateQuery(sqlUpdate);
```
生成的SQL为
```sql
UPDATE sys_button
SET sys_button.`button_name` = 'test', sys_button.`menu_id` = 'test_menu'
WHERE sys_button.`id` = '1442023718292295681'
```
### 删除样例
```java
SQLDelete sqlDelete = new SQLDelete();
sqlDelete.from(SysButton.class).where(eq(SysButton::getId, "1442023718292295681"));
Integer deleteCount = buttonMapper.deleteQuery(sqlDelete);
```
生成的SQL为
```sql
DELETE FROM sys_button WHERE sys_button.`id` = '1442023718292295681'
```