欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring、Mybatis、Mysql 通过存储过程实现分页--存储过程实现

程序员文章站 2022-05-08 18:34:20
...
Mybatis的分页功能可不可以通过数据库中的存储过程动态执行查询来帮助实现?

Spring、Mybatis、Mysql 通过存储过程实现分页博客一共有3部分
第一部分:存储过程动态分页之存储过程实现
第二部分:存储过程动态分页之Mybatis实现
第三部分:存储过程动态分页之实际工程demo

目前这篇讲的是
第一部分:存储过程动态分页之存储过程的实现



有了这个想法就去实践了下,初步感觉是可以的。


在Mysql中可以动态的执行SQL 例如:


CREATE PROCEDURE `dynamic_sql`(sql varchar(500))
BEGIN
PREPARE stmt FROM sql;
EXECUTE stmt;
END


调用该存储过程

CALL dynamic_sql('select * from table');


是可以正确的返回SQL执行的结果。

数据库存储过程可以动态的执行SQL,Mybatis只需要负责调用该分页的存储过程即可。

需要额外做处理的部分是:禁止动态的SQL执行修改数据的操作。

具体实现方式是过滤Mysql修改数据的字符串,例如:update,delete等。


初步实现dynamic_paging,代码为


CREATE PROCEDURE `dynamic_paging`(sql varchar(500),page_begin int,size int)
BEGIN
set @lowercase:=lower(sql);
if(!LOCATE('call',@lowercase) && !LOCATE('delete',@lowercase) && !LOCATE('drop',@lowercase) && !LOCATE('truncate',@lowercase) && !LOCATE('update',@lowercase) && !LOCATE('delete',@lowercase) && !LOCATE('alter',@lowercase) )then
set @temp:='';
if(LOCATE('select',@lowercase))then
set @temp:=concat(@lowercase,' limit ',page_begin,',',page_end);
PREPARE stmt FROM @temp;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
end if;
end if;
END




参数及逻辑说明:
参数:
sql:动态查询的分页语句
page_begin,size:为limit的2个参数(limit page_begin,size)
逻辑:
将分页语句转为小写后,做修改数据关键字过滤,然后再分页语句最后加上 limit 操作。



调用该存储过程

CALL dynamic_sql('select * from tableA',0,10);
##或者
CALL dynamic_sql('select * from tableA,tableB where tableA.id=tableB.uid',0,10);
##或
CALL dynamic_sql('select * from tableA order by id desc',0,10);



至此数据库部分工作告一段落。