若依项目中pageHelper分页查询报错如何解决?

若依pageHelper分页报错
需求:使用mybatis分页查询数据库表,以HashMap格式返回
报错信息:pageHelper获取到表总数后,查询时出了问题

16:02:03.439 [http-nio-8080-exec-1] INFO  o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet'
16:02:03.560 [http-nio-8080-exec-1] DEBUG c.r.p.m.D.queryDynamicTableDetails_COUNT - [debug,135] - ==>  Executing: SELECT count(0) FROM table1
16:02:03.565 [http-nio-8080-exec-1] DEBUG c.r.p.m.D.queryDynamicTableDetails_COUNT - [debug,135] - <==      Total: 1
16:02:03.566 [http-nio-8080-exec-1] DEBUG c.r.p.m.D.queryDynamicTableDetails - [debug,135] - ==>  Executing: select * from table1 LIMIT ?
16:02:03.597 [http-nio-8080-exec-1] ERROR c.r.f.w.e.GlobalExceptionHandler - [handleRuntimeException,100] - 请求地址'/project/dynamicTable/list',发生未知异常.
org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 2
### The error may exist in file [E:\RuoYi-Vue\ruoyi-system\target\classes\mapper\project\DynamicTableMapper.xml]
### The error may involve com.ruoyi.project.mapper.DynamicTableMapper.queryDynamicTableDetails
### The error occurred while executing a query
### SQL: select * from table1  LIMIT ?
### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 2
  • controller
@RestController
@RequestMapping("/project/dynamicTable")
public class DynamicTableController extends BaseController {
    @Autowired
    private IDynamicTableService dynamicTableService;
    @ApiOperation("获取表格信息")
    @GetMapping("/list")
    public TableDataInfo list(@RequestParam String tableName, Integer pageNum, Integer pageSize)
    {
        startPage();
        List<HashMap<String, Objects>> hashMaps = dynamicTableService.queryDynamicTableDetails(tableName);
        return getDataTable(hashMaps);
    }
}
  • iservice
public interface IDynamicTableService {
    public List<HashMap<String, Objects>> queryDynamicTableDetails(String tableName);
}
  • serviceImpl
@Service
public class DynamicTableServiceImpl implements IDynamicTableService {
    @Resource
    private DynamicTableMapper dynamicTableMapper;
    @Override
    public List<HashMap<String, Objects>> queryDynamicTableDetails(String tableName) {
        List<HashMap<String, Objects>> list = dynamicTableMapper.queryDynamicTableDetails(tableName);
        return list;
    }
}
  • mapper
public interface DynamicTableMapper {
    public List<HashMap<String, Objects>> queryDynamicTableDetails(String tableName);
}
  • mapper.xml
<mapper namespace="com.ruoyi.project.mapper.DynamicTableMapper">
    <select id="queryDynamicTableDetails" resultType="HashMap" statementType="STATEMENT">
        select * from ${tableName}
    </select>
</mapper>

如果不使用分页功能,可以正常返回数据。
尝试在serviceImpl中使用PageHelper.startPage(pageNum, pageSize)方法,还是同样的问题
求大佬指点

阅读 1.2k
avatarAI BotBETA

根据你提供的错误信息和代码,问题主要出现在MyBatis的XML映射文件中,特别是在处理分页时SQL语句的构造上。由于你使用了statementType="STATEMENT",这会导致MyBatis直接解释SQL语句,而不会进行参数替换(如?),因此在使用分页时(尤其是LIMIT ?部分)会出现SQL语法错误。

解决方案

  1. 修改Mapper XML中的statementType
    statementType="STATEMENT"改为statementType="PREPARED"(或移除statementType属性,因为PREPARED是MyBatis的默认类型)。这样MyBatis就会正确处理参数替换。

    修改后的mapper.xml应该如下:

    <mapper namespace="com.ruoyi.project.mapper.DynamicTableMapper">
        <select id="queryDynamicTableDetails" resultType="HashMap" parameterType="map">
            select * from ${tableName}
            LIMIT #{offset}, #{pageSize}
        </select>
    </mapper>

    注意:这里我添加了parameterType="map",虽然你的方法签名中并未直接传递分页参数,但如果你打算在Service层调用PageHelper.startPage(pageNum, pageSize),MyBatis将能够通过分页插件自动处理offsetpageSize。不过,由于你的Mapper接口方法签名中只包含tableName,你可能需要在Service层中处理分页逻辑,并直接传递分页参数到Mapper中(如果需要的话)。

  2. 调整Service层以支持分页
    由于你的Mapper接口方法签名未包含分页参数,你可能需要在Service层中添加分页逻辑,或者修改Mapper接口以包含这些参数。但如果你使用的是PageHelper,通常不需要修改Mapper接口,因为PageHelper会在查询执行前拦截并修改SQL以添加分页参数。

    确保在Controller层调用startPage()之前传入分页参数:

    @GetMapping("/list")
    public TableDataInfo list(@RequestParam String tableName, @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<HashMap<String, Objects>> hashMaps = dynamicTableService.queryDynamicTableDetails(tableName);
        return getDataTable(hashMaps);
    }
  3. 检查MyBatis和PageHelper的配置
    确保你的项目中已经正确配置了MyBatis和PageHelper的依赖和插件。如果使用的是Spring Boot,通常可以通过在application.propertiesapplication.yml中配置PageHelper的属性来启用它。

通过以上步骤,你应该能够解决分页查询时出现的SQL语法错误问题。如果问题仍然存在,请检查你的MyBatis版本和PageHelper版本是否兼容,并查看是否有其他配置错误。

1 个回答

机器人说的对着呢,statementType="STATEMENT"错了,只有prepareStatement才能预编译,你不要加这个设置项

另外你这个SQL这么写,SQL注入严重,这个接口可以查到库中所有的数据

推荐问题
宣传栏