一个动态sql的问题最后还是用了存储过程,全当增加知识储备了 但是我觉得他好慢哈哈
先来一段理论知识
什么是存储过程:存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。
存储过程的好处:
1.由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高。
2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。
3.通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。
然后解释
声明存储过程:
CREATE PROCEDURE demo_in_parameter(IN p_in int)
demo_in_parameter 存储过程的名字
IN p_in int 传入一个名字为p_in 的int类型的参数
存储过程开始和结束符号:
BEGIN … END
附值
SET @p_in=1
来一个案例
CREATE DEFINER=`root`@`%` PROCEDURE `statistical_scores`(in collegeId VARCHAR(20),majorId VARCHAR(20),classId VARCHAR(20),type VARCHAR(20),startTime VARCHAR(50),endTime VARCHAR(50),pageSize int(10),pageNum int(10))
begin
set @sql=null;
select GROUP_CONCAT(DISTINCT CONCAT('sum(case p.name',' when ''',p.name,''' then t.user_score else 0 end) as ''',p.name,'''')) into @sql from account_student as s left join (select a.user_score,a.user_id,a.paper_id from exam_paper_user_record as a ,(select user_id ,paper_id,max(add_time) as maxtime from exam_paper_user_record group by user_id, paper_id)as b WHERE a.user_id=b.user_id AND a.paper_id=b.paper_id AND a.add_time = b.maxtime) as t on t.user_id=s.user_id left join exam_paper as p on p.paper_id=t.paper_id;
set @sql =CONCAT('select s.student_name as 姓名, ',@sql,'from account_student as s
left join
(select a.user_score,a.user_id,a.paper_id
from exam_paper_user_record as a
, (select user_id ,paper_id,max(add_time) as maxtime from exam_paper_user_record group by user_id, paper_id)as b WHERE a.user_id=b.user_id AND a.paper_id=b.paper_id AND a.add_time = b.maxtime
) as t on t.user_id=s.user_id
left join exam_paper as p on p.paper_id=t.paper_id where 0=0');
IF(collegeId is not null and collegeId!='')then set @sql=CONCAT_WS(' ', @sql,'and s.college_id=',collegeId); end if;
IF(majorId is not null and majorId!='')then set @sql=CONCAT_WS(' ',@sql,'and s.major_id=',majorId); end if;
IF(classId is not null and classId!='')then set @sql=CONCAT_WS(' ', @sql,'and s.class_id=',classId); end if;
IF(type is not null and type!='')then set @sql=CONCAT_WS(' ', @sql,'and p.type=',type); end if;
IF(startTime is not null and startTime!='')then set @sql=CONCAT_WS(' ',@sql, 'and',startTime,' >= left (p.start_time,10)'); end if;
IF(endTime is not null and endTime!='')then set @sql=CONCAT_WS(' ', @sql,'and left (p.startTime,10)>=',endTime); end if;
set @sql=CONCAT_WS(' ', @sql,' GROUP BY s.user_id');
set @sql=CONCAT_WS(' ', @sql,'limit ',pageNum,',',pageSize);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
查看sql SELECT @sql;
在mybatis的mapper调用
{call statistical_scores(#{testStat.collegeId},#{testStat.majorId},#{testStat.classId},#{testStat.type},#{testStat.startTime},#{testStat.endTime},#{testStat.pageSize},#{testStat.pageNum})}
这个没有办法用pagehelper 分页了否则会报错
加油!!!