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