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进行分页。

相关推荐
瓦特what?几秒前
位运算核心技巧与应用
java·jvm·算法
人道领域2 分钟前
【LeetCode刷题日记】90.子集Ⅱ--- 归纳题解
java·开发语言·leetcode
zhangjw343 分钟前
MySQL数据库零基础入门,数据库原理、SQL详解、库表操作、字段约束、基础查询全覆盖
数据库·sql·mysql
IT策士4 分钟前
Redis 从入门到精通:数据结构Set 与 Sorted
数据结构·数据库·redis
2401_873479404 分钟前
如何用IP离线库检测DNS隧道和C2通信?企业DNS安全防护指南
网络·数据库·tcp/ip·安全·ip
ch.ju8 分钟前
Java Programming Chapter 4——Characteristics of inheritance
java·开发语言
就叫_这个吧10 分钟前
tomcat在idea控制台乱码问题解决
java·tomcat·intellij-idea
填满你的记忆16 分钟前
10万QPS下,Redis缓存如何避免雪崩?
数据库·redis·缓存
霸道流氓气质20 分钟前
Spring AI Alibaba Skills 完整实战:从零构建智能会议助手
java·人工智能·spring
IT界的老黄牛30 分钟前
MongoDB 主从切换排查实战:从 docker ps 到 jq,一套 SOP 定位死因
数据库·mongodb·docker