关于mybatis+sqlserver 的多表关联的分页(注意要先分页在多表关联)

 在这里浅谈下mybatis+sqlserver 遇到的小坑,当我们在mapper.xml 中写sql 语句 取参的时候注意不能用#{}去取值 top 关键字是不支持的 然后会报java.sql.SQLException: ‘@P0‘ 附近有语法错误 只能用${}去取值 SELECT * FROM(    SELECT TOP ${pageSize}* FROM st_student s    WHERE s.stu_id NOT IN  (    SELECT TOP ${pageId} s.stu_id FROM st_student s ORDER BY s.stu_id ASC    )ORDER BY s.stu_id ASC     )as a    left join st_stucourse sc    on a.stu_id=sc.stu_id    left join st_course c    on sc.co_id=c.co_id  

-- 准备数据
-- 创建数据库
create database EASTETWO;
use EASTETWO
go
create table st_student(
stu_id int not null primary key IDENTITY(1,1),
stu_name varchar(30),
stu_s int not null,
stu_birth datetime,
stu_birthplace varchar(30),
stu_email varchar(20)
)
go
select * from st_student;
go
set identity_insert st_student ON;
go
insert into st_student (stu_id,stu_name,stu_s,stu_birth,stu_birthplace,stu_email) values(1,‘小张‘,1,‘2016-12-28‘,‘上海‘,‘[email protected]‘);
insert into st_student (stu_id,stu_name,stu_s,stu_birth,stu_birthplace,stu_email) values(2,‘小华‘,1,‘2016-12-27‘,‘上海‘,‘[email protected]‘);
insert into st_student (stu_id,stu_name,stu_s,stu_birth,stu_birthplace,stu_email) values(3,‘小明‘,1,‘2016-12-26‘,‘上海‘,‘[email protected]‘);
insert into st_student (stu_id,stu_name,stu_s,stu_birth,stu_birthplace,stu_email) values(4,‘小文‘,1,‘2016-11-28‘,‘上海‘,‘[email protected]‘);
insert into st_student (stu_id,stu_name,stu_s,stu_birth,stu_birthplace,stu_email) values(5,‘小郭‘,1,‘2016-11-26‘,‘上海‘,‘[email protected]‘);
insert into st_student (stu_id,stu_name,stu_s,stu_birth,stu_birthplace,stu_email) values(6,‘小刘‘,1,‘2016-10-28‘,‘上海‘,‘[email protected]‘);
insert into st_student (stu_id,stu_name,stu_s,stu_birth,stu_birthplace,stu_email) values(7,‘小雯‘,1,‘2016-10-27‘,‘上海‘,‘[email protected]‘);
go
set identity_insert st_student off;
go
--创建课程表
create table st_course(
co_id int not null primary key IDENTITY(1,1),
co_name varchar(30)
)
go
use EASTETWO;
select * from st_student;
create table st_stucourse(
 id int not null primary key IDENTITY(1,1),
 stu_id int not null,
 co_id int not null,
 co_score int not null
)
go
-- 在这里注意当插入数据的时候 一定要将 identity_insert 开启
set identity_insert st_stucourse ON
go
insert into st_stucourse (id,stu_id,co_id,co_score) values(10,1,1,90);
insert into st_stucourse (id,stu_id,co_id,co_score) values(11,1,2,70);
insert into st_stucourse (id,stu_id,co_id,co_score) values(12,1,3,88);
insert into st_stucourse (id,stu_id,co_id,co_score) values(13,1,4,88);
insert into st_stucourse (id,stu_id,co_id,co_score) values(14,1,5,98);
insert into st_stucourse (id,stu_id,co_id,co_score) values(6,2,2,88);
insert into st_stucourse (id,stu_id,co_id,co_score) values(7,2,3,90);
insert into st_stucourse (id,stu_id,co_id,co_score) values(8,2,4,99);
insert into st_stucourse (id,stu_id,co_id,co_score) values(9,2,6,88);
-- 执行完一定要关闭 否则在另一张表会报错
set identity_insert st_stucourse OFF
go
select * from st_stucourse;
set identity_insert st_course ON
go
insert into st_course (co_id,co_name) values(1,‘历史‘);
go
insert into st_course (co_id,co_name) values(2,‘数学‘);
insert into st_course (co_id,co_name) values(3,‘语文‘);
insert into st_course (co_id,co_name) values(4,‘英语‘);
insert into st_course (co_id,co_name) values(5,‘地理‘);
insert into st_course (co_id,co_name) values(6,‘政治‘);
go
set identity_insert st_course OFF
go

go
-- 在实际开发中最好不要用*
    SELECT * FROM(
    SELECT TOP 10* FROM st_student s
    WHERE s.stu_id NOT IN  (
    SELECT TOP 0 s.stu_id FROM st_student s ORDER BY s.stu_id DESC
    ) ORDER BY s.stu_id DESC
    )as a
    left join st_stucourse sc
    on a.stu_id=sc.stu_id
    left join st_course c
    on sc.co_id=c.co_id
go
-- 遇到的坑就是先分页还是先关联 如果你先关联表(如果有一 对异常多的) 那么你在前台页面会遇到
-- 个问题就是在显示第一页的数据时会出现显示的记录数会少于我们的要求显示的记录数
go
SELECT  TOP  10 * FROM st_student s,
st_stucourse sc,
st_course c
where s.stu_id=sc.stu_id and sc.co_id=c.co_id
and s.stu_id NOT IN
    (
    SELECT TOP 0 s.stu_id FROM st_student s ORDER BY s.stu_id DESC
     )
ORDER BY s.stu_id DESC
go
-- row_number() 会效率更高些
use EASTETWO;
select * from (
select  top 10 *
from
(
 select row_number() over(order by s.stu_id DESC) as rownumber,* from st_student s
) A
where rownumber > 0
)as a
left join st_stucourse sc
on a.stu_id=sc.stu_id
left join st_course c
on sc.co_id=c.co_id
时间: 2024-08-11 16:13:57

关于mybatis+sqlserver 的多表关联的分页(注意要先分页在多表关联)的相关文章

sqlserver 2008修改数据库表的时候错误提示“阻止保存要求重新创建表的更改”

当用户在在SQL Server 2008企业管理器中更改表结构时,必须要先删除原来的表,然后重新创建新表,才能完成表的更改,如果强行更改会出现以下提示:不允许保存更改.您所做的更改要求删除并重新创建以下表.您对无法重新创建的标进行了更改或者启用了“阻止保存要求重新创建表的更改”选项.如果要去掉此提示,可从“工具”菜单中选择“选项”,在“选项”对话框中,选Designers,选择“表设计器和数据库设计器”,清除“ 阻止保存要求重新创建表的更改”复选框. 转载请注明出处:http://www.cnb

数据库表的查询操作(实验二),数据库表查询实验

[实验目的]:了解SQL语言的使用,进一步理解关系运算,巩固数据库的基础知识.[实验要求]:掌握利用Select语句进行各种查询操作:单表查询.多表连接及查询.嵌套查询.集合查询等.[实验内容]一.单表查询1.简单查询打开查询分析器,根建立teacher表,并加入数据.从teacher表中分别检索出教师的所有信息,以及仅查询教工号.姓名和职称.语句如下: select * from teacher select tno, tname from teacher 如要查询时改变列标题的显示,则从te

mybatis常用分页插件,快速分页处理

在未分享整个查询分页的执行代码之前,先了解一下执行流程. 1.总体上是利用mybatis的插件拦截器,在sql执行之前拦截,为查询语句加上limit X X 2.用一个Page对象,贯穿整个执行流程,这个Page对象需要用java编写前端分页组件 3.用一套比较完整的三层entity,dao,service支持这个分页架构 4.这个分页用到的一些辅助类 注:分享的内容较多,这边的话我就不把需要的jar一一列举,大家使用这个分页功能的时候缺少什么就去晚上找什么jar包即可,尽可能用maven包导入

路飞项目搭建5 课程模块: 表设计,表关系优化,群查接口模块(分页组件,搜索组件,排序组件)

课程 准备工作 """ 1)创建course应用 2)dev中注册 3)建立子urls完成路由分发 4)配置课程业务相关表,并录入测试数据(见课件) 5)完成课程分类与课程两个群查接口 """ 课程分类群查接口 serializers.py from rest_framework import serializers from . import models class CourseCategorySerializer(serializers.M

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 扩展 iptables应用在一个网段 http://www.aminglinux.com/bbs/thread-177-1-1.html sant,dnat,masquerade http://www.aminglinux.com/bbs/thread-7255-1-1.html iptables限制syn速率 http://www.aminglinux.com/bbs/thre

oracle创建表之前判断表是否存在,如果存在则删除已有表

Mysql 创建表之前判断表是否存在,如果存在则删除已有表 DROP TABLE IF EXISTS sys_area; CREATE TABLE sys_area ( id varchar(64) NOT NULL COMMENT '编号', parent_id varchar(64) NOT NULL COMMENT '父级编号', parent_ids varchar(2000) NOT NULL COMMENT '所有父级编号', name varchar(100) NOT NULL C

【Access2007】将Excel表导入至Access2007的其中一张已存在的表之中

将Excel表导入至Access2007,你会发现万恶的Access2007会帮你自动创建一张表,完全没有问你是否要插入一张已存在的表之中. 那么,我们需要这样解决: 一.按照正常的步骤先将Excel表导入至Access2007 1.选择标签栏上的"外部数据"->excel 2.弹出的对话框中的指定数据源选择要导入的excel文件,点击"确定" 3.选择要导入的工作表点下一步 4.看此表是否第一列包含表头,一般都包含的,把第一行包含列标题勾上,点下一步,再点下

mysql建立表及表的简单操作-插入数据-删除主键-删除表-修改表的数据-删除表的数据

-- 1.使用数据库 USE ren; -- 2.建立student表 CREATE TABLE student ( sid INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,   -- UNSIGNED(无符号) AUTO_INCREMENT(自增) sname VARCHAR(10),    -- 只能保存10个字符 saddress VARCHAR(15)   -- 只能保存15个字符 )ENGINE=MYISAM DEFAULT CHARSET=utf8;

5-5-广义表(头尾链表存储表示)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 广义表(头尾链表存储表示) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceString.c