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

相关推荐
2201_757830873 小时前
全局异常处理器
java
小徐Chao努力4 小时前
【Langchain4j-Java AI开发】09-Agent智能体工作流
java·开发语言·人工智能
Coder_Boy_4 小时前
SpringAI与LangChain4j的智能应用-(理论篇2)
人工智能·spring boot·langchain·springai
Coder_Boy_4 小时前
SpringAI与LangChain4j的智能应用-(理论篇3)
java·人工智能·spring boot·langchain
Coder_Boy_5 小时前
基于SpringAI的智能平台基座开发-(六)
java·数据库·人工智能·spring·langchain·langchain4j
热爱专研AI的学妹5 小时前
数眼搜索API与博查技术特性深度对比:实时性与数据完整性的核心差异
大数据·开发语言·数据库·人工智能·python
hopsky5 小时前
ShardingSphere功能简介
数据库·sql
talenteddriver5 小时前
mysql: MySQL索引和排序相关名词概念汇总
数据库·mysql
武昌库里写JAVA6 小时前
iview-CRUD模板
vue.js·spring boot·sql·layui·课程设计
伯明翰java6 小时前
Java数据类型与变量
java·开发语言