Mybatis执行自定义SQL并使用PageHelper进行分页

Mybatis执行自定义SQL并使用PageHelper进行分页

基于Mybatis,让程序可以执行动态传入的SQL,而不需要在xml或者@Select语句中定义。

代码示例

pom.xml 依赖

xml 复制代码
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

application.properties 配置数据库连接,这里使用的数据库是MySQL默认的示例数据库:world

复制代码
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mappers/*xml
#指定Mybatis的实体目录
mybatis.type-aliases-package=com.example.db.mybatis.entity
# 应用服务 WEB 访问端口
server.port=28084

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/world?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=true&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8
spring.datasource.username=root
spring.datasource.password=root

定义controller,用以动态传入需要执行的sql:

java 复制代码
@RestController
@Slf4j
public class DBController {

    @Autowired
    private UserService userService;

    @GetMapping("/query")
    public Object query() {
        String sql = "select * from city";
        return userService.executeDynamicSql(sql);
    }
}

定义service,用于调用mapper方法:

java 复制代码
@Service
public class UserService {
    @Autowired
    private DynamicSqlMapper dynamicSqlMapper;

    public List<Map<String, Object>> executeDynamicSql(String sql) {
        PageHelper.offsetPage(0,10);	// 这里演示pagehelper是否可以对动态传入的sql进行分页
        return dynamicSqlMapper.executeDynamicSql(sql);
    }
}

定义mapper接口,用以承载sql语句的执行:

java 复制代码
@Mapper
public interface DynamicSqlMapper {
    @SelectProvider(type = MySqlProvider.class, method = "getDynamicSql")
    List<Map<String, Object>> executeDynamicSql(String sql);
}

定义sql语句的获取方式:

java 复制代码
public class MySqlProvider {
    public String getDynamicSql(String sql) {
        return sql;
    }
}

执行结果

访问接口:http://localhost:28084/query

使用 JTracker 插件可以查看到具体执行的sql语句如下,第一次查询count,第二次进行分页查询:

复制代码
-- com.example.db.demos.web.mapper.DynamicSqlMapper#executeDynamicSql_COUNT --
-- [21:10:03.894] [2.00ms]
SELECT count(0) FROM city

-- com.example.db.demos.web.mapper.DynamicSqlMapper#executeDynamicSql --
-- [21:10:03.917] [1.00ms]
select * from city
 LIMIT 10 

结论

使用 @SelectProvider 注解可以动态执行传入的sql,并使用pageHelper进行分页。

相关推荐
蝎子莱莱爱打怪3 分钟前
我的2025年年终总结
java·后端·面试
沛沛老爹5 分钟前
Web开发者5分钟上手:Agent Skills环境搭建与基础使用实战
java·人工智能·llm·llama·rag·agent skills
奋进的芋圆10 分钟前
TokenRetryHelper 详解与 Spring Boot 迁移方案
java·spring boot·后端
CV工程师的自我修养24 分钟前
你的SQL为什么慢?看懂MySQL EXPLAIN执行计划,快速定位性能瓶颈
数据库·mysql
毕设源码-赖学姐25 分钟前
【开题答辩全过程】以 音像租借管理系统为例,包含答辩的问题和答案
java
一壶纱26 分钟前
UniApp + Pinia 数据持久化
前端·数据库·uni-app
小宇的天下28 分钟前
Calibre 3Dstack --每日一个命令day7【Centers】(3-7)
java·服务器·数据库
用户03048059126332 分钟前
Spring Boot 配置文件加载大揭秘:优先级覆盖与互补合并机制详解
java·后端
青莲84333 分钟前
Java内存回收机制(GC)完整详解
java·前端·面试
CRUD酱38 分钟前
微服务分模块后怎么跨模块访问资源
java·分布式·微服务·中间件·java-ee