多对多解析

多对多查表选课分析
首先,要明白表与表之间的关系.多对多之间的关系.

其次,创建表,student 表 zhongjian表 和 kecheng表…

创建表完成之后,开始创建实体类.

  1. 创建student 实体类.

  2. 实体类中除了要有sid sname 字段之外 还要加一个 List 集合类型的字段属性,(
    用于根据学生的sid 查询到的课程表的集合.)并且都赋予其 getter setter 方法用于
    接值取值.

  3. 创建kecheng表实体类(用于获取课程表数据)

  4. 搭建框架部分省略.
    重点部分: 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 } //因为每一个学生对象都有一个用于存放课程的集合类型字段 所以在此处要 给其遍历一下.
        <c:forEach items="${e.kecheng}" var="s">
           //此处遍历的是每一个学生对象的所有的课程表部分.
             ${s.cname}
        </c:forEach>
        </td>
        <td>
           <input type="button" value="选课"  onclick="xuanke(${e.sid})">
        </td>
    </tr>
    </c:forEach>

总结:查询的是所有的学生对象,然后每一个学生对象都有它的课程集合,目的是查到一个拥有所有学生对象的集合
而这个学生对象内又有了课程表集合.
最终把这个最终集合展示出来
选课操作部分
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

		}
	}

效果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值