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

相关推荐
twj_one1 小时前
Arthas使用
java
lizz312 小时前
C++模板编程:从入门到精通
java·开发语言·c++
Evan芙2 小时前
RDBMS的库、表、视图、索引、设计范式总结
数据库
shoubepatien2 小时前
JAVA -- 05
java·开发语言
寰天柚子2 小时前
Java并发编程中的线程安全问题与解决方案全解析
java·开发语言·python
memgLIFE2 小时前
Springboot 分层结构
java·spring boot·spring
一叶飘零_sweeeet3 小时前
从单机到集群:Redis部署全攻略
数据库·redis·缓存
shoubepatien3 小时前
JAVA -- 08
java·后端·intellij-idea
kong79069283 小时前
Java新特性-(二)Java基础语法
java·新特性·java 基础语法
yangminlei3 小时前
springboot pom.xml配置文件详细解析
java·spring boot·后端