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

[size=large]Mybatis的分页功能可不可以通过数据库中的存储过程动态执行查询来帮助实现?[/size]

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

目前这篇讲的是
[size=large]第一部分:存储过程动态分页之存储过程的实现[/size]


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


在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只需要负责调用该分页的存储过程即可。

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

具体实现方式是过滤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



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


调用该存储过程


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);



至此数据库部分工作告一段落。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值