多对多查表选课分析
首先,要明白表与表之间的关系.多对多之间的关系.
其次,创建表,student 表 zhongjian表 和 kecheng表…
创建表完成之后,开始创建实体类.
-
创建student 实体类.
-
实体类中除了要有sid sname 字段之外 还要加一个 List 集合类型的字段属性,(
用于根据学生的sid 查询到的课程表的集合.)并且都赋予其 getter setter 方法用于
接值取值. -
创建kecheng表实体类(用于获取课程表数据)
-
搭建框架部分省略.
重点部分: serivce层.
代码:
//创建持久层对象
StuDao stu=new StuDao();
//获取学生集合方法
public List getList() {//通过持久层getList方法获取到所有学生 List list=stu.getList();
//此时,就已经获取到了拥有所有student 对象的集合 对其进行遍历,获取每个学生对象的sid 然后根据 sid 当做条件去匹配 所有是该sid所对应的对象的课程表数据.
//sql语句为
select*from 中间表 a left join 课程表 b on a.cid=b.cid where a.sid=”?”;
for(Object object:list){//由于没有设置泛型所以在这里要用Object 遍历 .之后要强制转换成student 类型(不然无法调用set 方法获取sid); Student student=(Student)object; //遍历获取到每一个学生对象的sid
int sid=student.getSid();
//获取到的每一个学生Sid 可以当做条件 查每一个学生要学几门课程每查完一个学生的课程就放入一个list 集合
List c=stu.getkechengList(sid);
收
//每一个拥有学生课程的集合再存入到学生对象里边.根据程序自上向下执行的原理最终返回的拥有学生对象的集合中 每一个学生对象中都有了他的相对应课程
student.setKecheng©;
}
//最终返回的list
return list ;
}
跳转不做介绍:
附:
//持久层代码, 获取学生对象的方法
public List getList() {
// TODO Auto-generated method stub
String sql=“select*from student”;
return JdbcUtil.getList(sql, Student.class);
}
持久层代码, 课程根据学生对象sid 获取相对应的课程的方法
public List getkechengList(int sid) {
// TODO Auto-generated method stub
String sql=“select*from zhong a left join kecheng b on a.cid=b.cid where a.sid=”+sid;
return JdbcUtil.getList(sql, Ke.class);
}
跳转到JSP页面
//首先遍历学生对象集合编号 | 学生姓名 | 学生课程 | 操作 |
${e.sid } | ${e.sname } | //因为每一个学生对象都有一个用于存放课程的集合类型字段 所以在此处要 给其遍历一下. |
总结:查询的是所有的学生对象,然后每一个学生对象都有它的课程集合,目的是查到一个拥有所有学生对象的集合
而这个学生对象内又有了课程表集合.
最终把这个最终集合展示出来
选课操作部分
Jsp前台代码:
<script type="text/javascript">
//点击事件所触发的方法. 要往后台传一个要选课的学生的ID对其已经选的课进行回显
function xuanke(sid){
location.href="stu_xuanke.action?student.sid="+sid;
}
</script>
</head>
编号 | 学生姓名 | 学生课程 | 操作 |
${e.sid } | ${e.sname } | ${s.cname} | //加一个点击事件 要往后台传一个要选课的学生的ID对其已经选的课进行回显 |
//声明一个list集合并为其设定get set 方法
private List list;
//声明一个Student 对象并为其设定 get set 方法(注意: 一定要记得给get set 方法否则无法收值取值)
private Student student;
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
//action 层里的回显学生,以及该sid 所对应的课表记录 的方法 跳转到选课Jsp 页
public String xuanke() throws Exception {
//获取学生表,并在业务层为每个学生表的课程集合字段赋值
student =stu.getStudentBySid(student.getSid());
//查询所有的课程表内容
list=stu.getKeList();
//跳转到选课页面
return "xunke";
}
展示并回显选课表业务层操作
public Student getStudentBySid(int sid) {
// TODO Auto-generated method stub
// 首先根据jsp层传到action 层 后又传到这的sid去查询该学生
而此时该学生对象,里的课程集合属性 还没有值 所以要给其赋值
Student student=stu.getStudentBysid(sid);
// 这一步就是去根据该学生的sid 去查询其所对应的课程表
List sc=stu.getkechengList(sid);
student.setKecheng(sc);//查到的结果集合赋给学生
return student;
}
//查询课程表 返回到action 一个拥有所有的课程 的集合
public List getKeList() {
// TODO Auto-generated method stub
return stu.getzongke();
}
持久层代码
public Student getStudentBysid(int sid) {
// TODO Auto-generated method
//查学生表
String sql=“select*from student where sid=”+sid;
return (Student) JdbcUtil.getObjectById(sql, Student.class);
}
//课程根据学生对象sid 获取相对应的课程的方法(之前查表时就写过此处可直接调用)
public List getkechengList(int sid) {
// TODO Auto-generated method stub
String sql=“select*from zhong a left join kecheng b on a.cid=b.cid where a.sid=”+sid;
return JdbcUtil.getList(sql, Ke.class);
}
public List getzongke() {
// TODO Auto-generated method stub
//查课程表
String sql=“select *from kecheng”;
return JdbcUtil.getList(sql, Ke.class);
}
跳转到选课jsp页面
//提交到action 层选课方法 ///展示学生名学生姓名 | ${student.sname} //隐藏域提交给后台一个学生sid(这个必须得有,否则无法知道你要给哪个学生选课 | |||||||
学生课程 | //遍历拥有所有课程表的集合 //用到复选框 |
Action 层选课方法
//此时要定义一个用于接收cid值的属性字段并给其get,set 方法(用于接收选中课的cid)
//学生对象也拿到了sid (通过隐藏域提交过来的)
cid 也有了sid 也有了现在只需要把他们添加到中间表上就可以实现选课效果
public String doxuanke() throws Exception {
// TODO Auto-generated method stub
stu.xuanke(cids,student.getSid());
//选课执行成功跳转到列表页面
return “success”;
}
业务层
public void xuanke(String cids, int sid) {
// TODO Auto-generated method stub
//这一步很重要,每次对选课表有动作之前都需要把之前的中间表内容删除掉
这是因为如果不删除就点选课他会出现重复添加选课效果,(即使不操作,只要点击选课按钮就相当于一次添加,之前的就会累加,所以这里选课操作之前要把之前的清空)
stu.dodelzhong(sid);//删除中间表
//前台传过来的是一个字符串拼接形式的(通过拦截器实现的) cid所以在此处先进行判断一下是否为空
if(cids!=null){
//如果不为空就把其以’,’分隔,存入数组中对数组进行遍历(注意:因为往中间表添加必须是一个记录一个记录的添加 ,而不可能把多条记录都添加到一行,否则将无法查出数据,所以在此处要对其分隔到数组进行遍历最终实现单个添加)
String[] sp=cids.split(",");
//对数组进行遍历
for(String cid:sp){
//每次循环就能得到一个单个字符形式的cid 就执行一次添加方法 ,直到数组中再也没有字符就执行完毕跳出循环 最终实现了把每一个sid 和每一个单个的cid 加到中间表中
stu.addzhong(sid,cid);
Sid=1 cid=1
Sid=1 cid=2
Sid=1 cid=3
}
}
效果