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

相关推荐
四七伵4 分钟前
Spring Boot项目中varchar字段为什么不用NULL?告别空指针从建表开始
数据库·后端
Mr.45677 分钟前
JDK17+Druid+SpringBoot3+ShardingSphere5 多表分库分表完整实践(MySQL+PostgreSQL)
java·数据库·spring boot·mysql·postgresql
tsyjjOvO8 分钟前
Spring Boot 入门
java·spring boot·后端
Elastic 中国社区官方博客13 分钟前
使用 ES|QL 变量控件将仪表板转变为调查工具
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·全文检索
RuoyiOffice14 分钟前
SpringBoot+Vue3+Uniapp实现PC+APP双端考勤打卡设计:GPS围栏/内网双模打卡、节假日方案、定时预生成——附数据结构和核心源码讲解
java·spring·小程序·uni-app·vue·产品运营·ruoyi
feng68_16 分钟前
Ansible还原数据库节点
linux·运维·数据库·ansible
StackNoOverflow18 分钟前
Spring Boot 核心知识点总结
java·spring boot·后端
世界哪有真情19 分钟前
使用 Arthas 精准排查 SpringBoot 多模块项目中未使用的类(安全清理无用代码)
java·后端
乐hh19 分钟前
清理MySQL数据
数据库·mysql
EasyCVR22 分钟前
国标GB28181/RTSP/ONVIF/RTMP视频监控平台EasyCVR视频质量诊断花屏/蓝屏/画面模糊/冻结检测
网络·数据库·音视频