数据库课程实训作业——基于SSM 框架

HAUE_CS 实训作业

大三数据库课程实践作业,需要做一个 XX 管理系统
便想用上自己最近学习的 SSM 框架,以及 一些实用的小玩意

前言

1、本人 SSM 纯属自学,且是上手做的第一个项目,本项目适合新手参考,也欢迎大佬指出问题;
2、本项目并非最终版本,很多地方有很多不足之处,可以拿来练手或者参考结构;
3、第一次写博客,编辑器用法不够熟练,看官酌情观看

使用到的软件及版本信息

eclipse IDE 2019-06
mysql 5.7
spring 5.0
mybatis
echarts 3
tomcat 9
JavaSE-1.8
没用 Maven ,所以相关 jar 包需要自行导入

整体结构

1 、有几分冗余的项目结构
在这里插入图片描述在这里插入图片描述
2 、尚待完善的数据库结构
数据库用的是课本 《数据库系统概论》第五版 上最为著名的 Student,Course,Sc 三张表的学生信息管理
自己又加入了 user 表进行登录的验证
整体结构如下:
在这里插入图片描述
3、丑陋的界面
在这里插入图片描述

配置文件

1、web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>ControllerTest</display-name>

	<!-- 配置 spring 核心监听器,默认会以 /WEB-INF/applicationContext.xml 作为配置文件 -->
	<listener>
			<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	<!-- contextConfigLocation参数用来指定Spring的配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext*.xml</param-value>
	</context-param>

	<!-- 定义Spring MVC的前端控制器 -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/springmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <!-- 让Spring MVC的前端控制器拦截所有请求 -->
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
  <!-- 编码过滤器 -->
  <filter>
		<filter-name>characterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
 </filter>
	<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

2、spring

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd     
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- 自动扫描该包,spring MVC 会将包下使用了@Controller 注解的类注册为 Spring 的 controller  -->
	<context:component-scan base-package="org.student.controller" />
	
	<!-- 默认装配方案 -->
	<mvc:annotation-driven/>
	
	<!-- 静态资源处理 
	<mvc:default-servlet-handler/>	-->
	
	<!-- 配置拦截器:对某些请求进行拦截,达到需要登录才能访问某些资源的效果,而不是可以直接通过 URL 进行访问 -->
    <mvc:interceptors>
    	<mvc:interceptor>
    		<!-- 拦截所有请求 -->
    		<mvc:mapping path="/*"/>
    		<!-- 自定义判断用户权限的拦截类 -->  
    	 	<bean class="org.student.interceptor.studentInterceptor"/>
    	</mvc:interceptor>
    </mvc:interceptors>
    
	<!-- 视图解析器  p:prefix 属性表示前缀		p:suffix 属性表示后缀-->
	<bean id="viewResolver" 
		class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
			p:prefix="/WEB-INF/content/" p:suffix=".jsp"/>
</beans>

3 applicationContext

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
	xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
			            http://www.springframework.org/schema/beans/spring-beans.xsd
			            http://www.springframework.org/schema/context
			            http://www.springframework.org/schema/context/spring-context.xsd
			            http://www.springframework.org/schema/mvc
			            http://www.springframework.org/schema/mvc/spring-mvc.xsd
			            http://www.springframework.org/schema/tx
			            http://www.springframework.org/schema/tx/spring-tx.xsd
			            http://mybatis.org/schema/mybatis-spring 
			            http://mybatis.org/schema/mybatis-spring.xsd ">
			      
	<!-- mybatis:scan会将org.student.dao包里的所有接口当作mapper配置,之后可以自动引入mapper类-->  
    <mybatis:scan base-package="org.student.dao"/>   
       
	 <!-- 扫描org.student包下面的java文件,有Spring的相关注解的类,则把这些类注册为Spring的bean -->
    <context:component-scan base-package="org.student"/>
    
	<!-- 使用PropertyOverrideConfigurer后处理器加载数据源参数 -->
	<context:property-override location="classpath:db.properties"/>

	<!-- 配置c3p0数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"/>
	
	<!-- 配置SqlSessionFactory,org.mybatis.spring.SqlSessionFactoryBean是Mybatis社区开发用于整合Spring的bean -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
	    p:dataSource-ref="dataSource"/>
	
	<!-- JDBC事务管理器 -->
	<bean id="transactionManager" 
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
		 p:dataSource-ref="dataSource"/>
	
	<!-- 启用支持annotation注解方式事务管理 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>
	
</beans>

4 数据库配置文件

dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://127.0.0.1:3306/Stu_Course?characterEncoding=utf8&useSSL=false
dataSource.user=root
dataSource.password=123456
dataSource.maxPoolSize=20
dataSource.maxIdleTime = 1000
dataSource.minPoolSize=6
dataSource.initialPoolSize=5

domain实体类

1、user

package org.student.domain;
/**
 * 
 * @author NAIL
 *
 */
public class User {
	private String loginname;
	private String password;

	public User(String loginname,String password) {
		this.loginname=loginname;
		this.password=password;
	}

	public String getLoginname() {
		return loginname;
	}

	public void setLoginname(String loginname) {
		this.loginname = loginname;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}	
	
}

2、

package org.student.domain;

import java.util.List;

public class Student {
	private String sno;
	private String sname;
	private String ssex;
	private Integer sage;
	private String sdept;

	// 外键的实现
	private List<Sc> scs; // 一对多

	public List<Sc> getScs() {
		return scs;
	}

	public void setScs(List<Sc> scs) {
		this.scs = scs;
	}

	public Student() {
		super();
	}

	public Student(String Sno, String Sname, String Ssex, int Sage, String Sdept) {
		this.sno = Sno;
		this.sname = Sname;
		this.ssex = Ssex;
		this.sage = Sage;
		this.sdept = Sdept;
	}

	public String getSno() {
		return sno;
	}

	public void setSno(String sno) {
		this.sno = sno;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public String getSsex() {
		return ssex;
	}

	public void setSsex(String ssex) {
		this.ssex = ssex;
	}

	public Integer getSage() {
		return sage;
	}

	public void setSage(Integer sage) {
		this.sage = sage;
	}

	public String getSdept() {
		return sdept;
	}

	public void setSdept(String sdept) {
		this.sdept = sdept;
	}

	@Override
	public String toString() {
		return "Student [sno=" + sno + ", sname=" + sname + ", ssex=" + ssex + ", sage=" + sage + ", sdept=" + sdept
				+ ", scs=" + scs + "]";
	}
	
	
	
}

3、Course

package org.student.domain;

import java.util.List;

public class Course {
	@Override
	public String toString() {
		return "Course [cno=" + cno + ", cname=" + cname + ", cpno=" + cpno + ", ccredit=" + ccredit + ", scs=" + scs
				+ "]";
	}
	private String cno;
	private String cname;
	private String cpno;
	private Integer ccredit;
	
	//外键的实现
	private List<Sc> scs;						//一对多
	
	public List<Sc> getScs() {
		return scs;
	}
	public void setScs(List<Sc> scs) {
		this.scs = scs;
	}
	public Course() {
		super();
	}
	public Course(String cno, String cname, String cpno, Integer ccredit) {
		super();
		this.cno = cno;
		this.cname = cname;
		this.cpno = cpno;
		this.ccredit = ccredit;
	}
	public String getCno() {
		return cno;
	}
	public void setCno(String cno) {
		this.cno = cno;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	public String getCpno() {
		return cpno;
	}
	public void setCpno(String cpno) {
		this.cpno = cpno;
	}
	public Integer getCcredit() {
		return ccredit;
	}
	public void setCcredit(Integer ccredit) {
		this.ccredit = ccredit;
	}
	public boolean getAllAttr() {
		if(this.cno != null || this.cname != null || this.cpno != null || this.ccredit != null) {
			return true;
		}
		return false;
	}
}

4、Sc

package org.student.domain;

public class Sc {
	@Override
	public String toString() {
		return "Sc [sno=" + sno + ", cno=" + cno + ", grade=" + grade + ", student=" + student + ", course=" + course
				+ "]";
	}
	private String sno;
	private String cno;
	private Integer grade;
	
	//外键的实现
	private Student student;		//一条成绩数据之多对应一个学生 --> 一对多
	private Course course;		//一们课程可以对应多条成绩数据 --> 一对多
	
	public Student getStudent() {
		return student;
	}

	public void setStudent(Student student) {
		this.student = student;
	}

	public Course getCourse() {
		return course;
	}

	public void setCourse(Course course) {
		this.course = course;
	}

	public Sc() {
		super();
	}
	
	public Sc(String sno, String cno, Integer grade) {
		super();
		this.sno = sno;
		this.cno = cno;
		this.grade = grade;
	}

	public String getSno() {
		return sno;
	}
	public void setSno(String sno) {
		this.sno = sno;
	}
	public String getCno() {
		return cno;
	}
	public void setCno(String cno) {
		this.cno = cno;
	}
	public Integer getGrade() {
		return grade;
	}
	public void setGrade(Integer grade) {
		this.grade = grade;
	}
	public boolean getAllAttr() {
		if(this.sno != null || this.cno != null || this.grade != null) {
			return true;
		}
		return false;
	}
}

Controller 层

1、loginController
登陆行为

package org.student.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class LoginController {
	@RequestMapping(value="/loginForm")
	public String login() {
		System.out.println("/loginForm 受到请求");
		// 返回 loginForm.jsp 页面
		return "loginForm";
	}
	
	@RequestMapping(value="/list")
	public String list() {
		System.out.println("/list 受到请求");
		return "list";
	}
}

2、UserController

package org.student.controller;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.student.domain.User;
import org.student.service.StudentService;

/**
 * 处理 User 请求控制器
 * @author NAIL
 *
 */
@Controller
public class UserController {
	// 自动注入 studentService
	@Autowired
	@Qualifier("studentService")
	private StudentService studentService;
	/**
	 * 处理login 请求
	 */
	@RequestMapping("/login")
	public String login(String loginname, String password, Model model, HttpSession session) {
		User user = studentService.login(loginname, password);
		if(user != null) {
			//登陆成功,将 user 对象设置到 HttpSession 作用域
			session.setAttribute("user_session", user);
			//设置session 有效时间为 30 * 60 秒
			session.setMaxInactiveInterval(30 * 60);  
			//转发到 main 请求
			return "/list";
		}else {
			//登陆失败
			model.addAttribute("message", "登录失败");
			return "/loginForm";
		}
		
	}

}

3、StudentController

package org.student.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.student.domain.Student;
import org.student.service.StudentService;

@Controller
public class StudentColtroller {
	@Autowired
	@Qualifier("studentService")
	private StudentService studentService;
	
	/**
	 * 查询学生信息,返回学生信息的 list 集合
	 */
	@RequestMapping("/studentSelect")
	 public String studentSelect(Student student,
			 Model model) {
		try {
			System.out.println("接收到的student信息为:" + student.toString());
			List<Student> stu_list = studentService.findStudentByAllAttr(student);
			model.addAttribute("message","学生详细信息查询:<hr/>");
			model.addAttribute("message1","查询结果:");
			if( stu_list != null && stu_list.size() != 0) {
				System.out.println("查询到了相应结果"+stu_list+" | | "+stu_list.size());
				model.addAttribute("res_stu_list", stu_list);
				//如果是第一次进入这个页面,那么默认提交到 selectStudent 控制器
				model.addAttribute("post_action", "studentSelect");
				//mv.setView(new RedirectView("/StudentsMessageManageSystem/studentSelect"));
			}else {
				System.out.println("查询结果为空"+stu_list+" | | "+stu_list.size());
			}
			return "student/student";
		} catch (Exception e) {
			return "student/student";
		}
	}
	
	
	/**
	 * 插入学生信息
	 */
	@RequestMapping("/studentAdd")
	public String addStudent(Student student,Model model) {

		System.out.println("插入的学生信息:" + student.toString());
		model.addAttribute("student", student);
		model.addAttribute("post_action", "studentAdd");
		model.addAttribute("message", "添加学生数据");
		model.addAttribute("message1", "插入的学生数据为:");

		try {
			if(student.getSno()==null || student.getSno().equals("")) {//插入信息中主键不存在,即学号不存在
				model.addAttribute("add_result", "请至少输入学号信息进行添加");
				return "student/studentAdd";
			}else {//输入了学号
				if(student.getSno().length() != 9) {
					model.addAttribute("add_result", "请输入长度为[9]的学号");
					return "student/studentAdd";
				}
				if(studentService.selectStudentBySno(student.getSno()) != null) {//输入的学号已经存在学生与之对应
					model.addAttribute("add_result", "插入的学号重复");
					return "student/studentAdd";
				}else {//插入的学号不重复
					studentService.addStudent(student);
					model.addAttribute("add_success_flag", 1);
					model.addAttribute("add_result", "已成功插入该学生");
					return "success";
				}
			}
		}catch(NullPointerException nullPointerException) {
			System.out.println("第一次进入该界面,传入的学号信息为空");
			return "student/studentAdd";
		}


	}
	
	
	@RequestMapping("/studentDelete")
	public String studentDelete(String Sno, Model model) {//通过学号删除学生信息
		System.out.println("删除的学生信息为:" + studentService.selectStudentBySno(Sno).toString());
		model.addAttribute("message", "通过学号删除学生信息");			//一号 message , 表达了返回的信息类型
		model.addAttribute("Sno", Sno);
		if(Sno != null && !Sno.equals("")) {//传入的学号不为空
			if(studentService.selectStudentBySno(Sno) != null) {//输入的学号存在对应的学生数据
				studentService.removeStudentBySno(Sno);
				model.addAttribute("add_result_info", "删除学生信息成功");					//2 表示删除学生信息成功
				model.addAttribute("delete_success_flag", 1);
				return "success";
			}else {//输入的学号不为空,但是不存在学号和输入的学号相同的学生
				model.addAttribute("add_result_info", "不存在学号为" + Sno + "的学生");
				return "student/studentDelete";
			}
		}else {//传入的学生信息为空
			model.addAttribute("add_result_info", "请输入学号!");					//1 表示传入的 Sno 为空
			return "student/studentDelete";
		}
	}
	
	@RequestMapping("/studentModify")
	public String studentModify(Student student, Model model) {
		System.out.println("修改的学生信息为:" + studentService.selectStudentBySno(student.getSno()).toString());
		model.addAttribute("message", "通过学号修改学生信息");
		String Sno = student.getSno();
		model.addAttribute("message1", "修改结果:");
		model.addAttribute("Sno", Sno);
		try {
				if(Sno == null || Sno.equals("")) {//学号为空
					model.addAttribute("modify_result", "请输入学号进行修改");
					return "student/studentModify";
				}else {//学号不为空
					if(studentService.selectStudentBySno(Sno) == null) {//不存在需要修改的学号
						model.addAttribute("modify_result", "不存在需要修改的学号所对应的学生信息");
						return "student/studentModify";
					}else {//学号不为空,且存在需要修改的学号的学生
						studentService.modifyStudent(student);
					
						model.addAttribute("modify_success_flag", 1);
						model.addAttribute("modify_result", "修改学生信息成功");
						Student modified_student = studentService.selectStudentBySno(student.getSno());
						model.addAttribute("student", modified_student);
						return "success";
					}
				}
		} catch (NullPointerException e) {
			System.out.println("第一次进入页面,学号信息为空");
			return "student/studentModify";
		}
		
	}
}

4、CourseController

package org.student.controller;


import java.util.List;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.student.domain.Course;
import org.student.domain.Sc;
import org.student.service.StudentService;

@Controller
public class CourseController {
	@Autowired
	@Qualifier("studentService")
	private StudentService studentService;
	
	/**
	 * 
	 * @param course
	 * @param model
	 * @param session
	 * @return
	 */
	@RequestMapping("/courseSelect")
	 public String courseSelect(Course course,Model model) {
		System.out.println("查询过程中的课程参数信息为" + course.toString());
		List<Course> course_list = studentService.findCourseByAllAttr(course);
		model.addAttribute("post_action", "courseSelect");
		model.addAttribute("message","课程详细信息查询:<hr/>");
		if( course_list != null && course_list.size() != 0) {
			System.out.println("查询到了相应结果"+course_list+" | | "+course_list.size());
			model.addAttribute("res_course_list", course_list);
			//如果是第一次进入这个页面,那么默认提交到 selectCourse 控制器
			model.addAttribute("message1","查询结果:");
			//mv.setView(new RedirectView("/StudentsMessageManageSystem/studentSelect"));
			
		}else {
			model.addAttribute("message", "查询结果为空");
			System.out.println("查询结果为空"+course_list+" | | "+course_list.size());
		}
		return "course/course";
	}
	
	/**
	 * 插入课程信息
	 */
	@RequestMapping("/courseAdd")
	public String addStudent(Course course,Model model) {
		System.out.println("插入过程中的课程参数信息为:" + course.toString());
		model.addAttribute("course", course);
		model.addAttribute("post_action", "courseAdd");
		model.addAttribute("message", "添加课程数据");
		model.addAttribute("message1", "插入的课程数据为:");
		System.out.println("插入过程中,course 对象的属性为:");
		try {
			if(course.getCno() == null) {//输入的课程号为空
				model.addAttribute("add_result", "请至少输入课程号以进行插入");
				return "course/courseAdd";
			}else {//输入的课程号存在
				if(studentService.selectCourseByCno(course.getCno()) != null) {//输入的课程号重复
					model.addAttribute("add_result", "输入的课程号存在重复");
					return "course/courseAdd";
				}else {//输入的课程号不重复
					//加入判断先行课是否存在
					if(course.getCpno() != null && studentService.selectCourseByCno(course.getCpno()) == null) {
						//输入了先行课,但先行课不存在
						model.addAttribute("add_result", "所插入的课程的先行课不存在");
						return "course/courseAdd";
					}else {
						studentService.addCourse(course);
						model.addAttribute("add_success_flag", 2);
						model.addAttribute("add_result", "已成功插入该课程信息");
						return "success";
					}
				}
			}
		} catch(NullPointerException nullPointerException) {
			System.out.println("第一次进入该界面,传入的课程号信息为空");
			return "course/courseAdd";
		}

		
		
	}
	
	
	@RequestMapping("/courseDelete")
	public String courseDelete(String Cno, Model model) {
		model.addAttribute("message", "通过学号删除课程信息");
		model.addAttribute("Cno", Cno);
		if(Cno != null && !Cno.equals("")) {//传入的学号不为空
			System.out.println("删除的课程信息为:" +studentService.selectCourseByCno(Cno).toString());
			if(studentService.selectCourseByCno(Cno) != null) {//输入的学号存在对应的学生数据
				studentService.removeCourseByCno(Cno);
				model.addAttribute("add_result_info", "删除课程信息成功");
				model.addAttribute("delete_success_flag", 2);
				return "success";
			}else {//输入的学号不为空,但是不存在学号和输入的学号相同的学生
				model.addAttribute("add_result_info", "不存在课程号为" + Cno + "的课程");
				return "course/courseDelete";
			}
		}else {//传入的学生信息为空
			model.addAttribute("add_result_info", "请输入课程号!");					//1 表示传入的 Sno 为空
			return "course/courseDelete";
		}
	}
	
	@RequestMapping("/selectDetailsByCno")
	public String selectDetailsByCno(String Cno,Model model) {
		try {
				if(Cno != null && !Cno.equals("")) {//传入的 Cno 不为空
					if(studentService.selectCourseByCno(Cno) == null) {//学号不为空,但每查询到 学号为 Cno 的课程信息
						model.addAttribute("select_result_info", "未查询到课程号为[" + Cno + "]的课程信息");
						return "course/courseDetails";
					}else {//学号不为空,且查询到了学号为 Cno 的课程信息 
						Course course = studentService.selectDetailsByCno(Cno);
						model.addAttribute("course", course);
						model.addAttribute("select_result_info", "查询课程信息成功");
						model.addAttribute("select_result_flag", true);
						System.out.println("课程详细信息查询过程中获得的课程信息为:" + studentService.selectCourseByCno(Cno).toString());
						return "course/courseDetails";
						}
					}else {
						model.addAttribute("select_result_info", "请输入课程号!");
						return "course/courseDetails";
					}	
		} catch (NullPointerException nullPointerException) {
			model.addAttribute("select_result_info", "请输入课程号!");
			return "course/courseDetails";
		}
		
		
	}
	
	
	//统计模块,根据学号返回 Sc 的 List 集合,并对结果进行统计
	@RequestMapping("/statistic")
	public String statistic(String Cno,Model model) {
		
		model.addAttribute("message", "成绩信息统计");
		model.addAttribute("Cno", Cno);
		try {
			System.out.println("统计过程中课程的详细信息为:" + studentService.selectCourseByCno(Cno).toString());
			if(Cno == null || Cno.equals("")) {//课程号为空
			model.addAttribute("message1", "请输入课程号来进行查询");
			return "statistic";
		}else {//课程号存在
			if(studentService.selectScByCno(Cno) == null) {//输入了课程号,但没有该课程的信息
				model.addAttribute("message1", "未查找到该课程号对应的成绩信息");
				return "statistic";
			}else {//输入了课程号,且查询到了对应的结果
				//res_sc_list 存放符合条件的课程的信息
				//Course selectDetailsByCno(String Cno); 查询课程的详细信息,详细信息可以用于统计
				Course course = studentService.selectDetailsByCno(Cno);
				Integer total_score = 0;
				double average_score = 0;
				Integer level_0= 0 ,level_1= 0 ,level_2 = 0,level_3 = 0;
				List<Sc> scs = course.getScs();
				for(int i = 0; i < scs.size(); i++) {//对 这门 course 的 scs 进行遍历
					int score = scs.get(i).getGrade();
					total_score += score;		//得到总分
					if(score < 60) {
						level_0++;
					}else if(score < 70){
						level_1++;
					}else if(score < 80) {
						level_2++;
					}else {
						level_3++;
					}
				}
				try {
					average_score = total_score/scs.size();		//得到平均分
				} catch (ArithmeticException e) {
					System.out.println("没查询到信息,捕捉除零错误");
					average_score = 0;
				}
				
				model.addAttribute("total", total_score);
				model.addAttribute("average", average_score);
				model.addAttribute("level_0", level_0);
				model.addAttribute("level_1", level_1);
				model.addAttribute("level_2", level_2);
				model.addAttribute("level_3", level_3);
				model.addAttribute("Cname", course.getCname());
				model.addAttribute("scs_list", scs);
				return "statisticResult";
			}
		}
		} catch (NullPointerException e) {
			model.addAttribute("message1", "未能获得所输入课程号的课程信息");
			System.out.println("未能获得所输入课程号的课程信息");
			return "statistic";
		}

	}
	
	@RequestMapping("/courseModify")
	public String modifyCourse(Course course,Model model) {
		System.out.println("课程修改过程中课程的信息为:" + course.toString());
		model.addAttribute("message", "通过课程号修改课程信息");
		model.addAttribute("message1", "修改结果:");
		String Cno = course.getCno();
		model.addAttribute("Cno", Cno);
		
		try {
			if(course.getCno() == null) {
				model.addAttribute("modify_result", "请输入课程号进行课程信息的修改");
				return "course/courseModify";
			}else {//课程信息不为空
				if(studentService.selectCourseByCno(Cno) == null) {//不存在该课程
					model.addAttribute("modify_result", "不存在所输入课程信息所对应的课程信息");
					return "course/courseModify";
				}else {//存在该课程 --> 可以进行修改
					studentService.modifyCourse(course);
					model.addAttribute("modify_success_flag", 2);
					model.addAttribute("modify_result", "课程信息修改成功");
					Course modified_course = studentService.selectCourseByCno(Cno);
					model.addAttribute("course", modified_course);
					return "success";
				}
			}
		} catch (NullPointerException e) {
			System.out.println("第一次进入该页面,输入的课程信息为空");
			return "course/courseModify";
		}
	}
}

5、ScController

package org.student.controller;

import java.util.List;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.student.domain.Sc;
import org.student.service.StudentService;

@Controller
public class ScController {
	@Autowired
	@Qualifier("studentService")
	private StudentService studentService;
	
	/**
	 * 
	 * @param sc
	 * @param model
	 * @return
	 */
	@RequestMapping("/scSelect")
	 public String scSelect(Sc sc,Model model) {
		System.out.println("课程查询过程中接受到的课程信息为:" + sc.toString());
		List<Sc> sc_list = studentService.findScByAllAttr(sc);
			model.addAttribute("message","学生详细信息查询:<hr/>");
			model.addAttribute("message1","查询结果:");
		if( sc_list != null && sc_list.size() != 0) {
			System.out.println("查询到了相应结果"+sc_list+" | | "+ sc_list.size());
			model.addAttribute("res_sc_list", sc_list);
			//如果是第一次进入这个页面,那么默认提交到 selectSc 控制器
			model.addAttribute("post_action", "scSelect");
			//mv.setView(new RedirectView("/StudentsMessageManageSystem/studentSelect"));
		}else {
			System.out.println("查询结果为空"+sc_list+" | | "+sc_list.size());
		}
		return "sc/sc";
	}
	
	/**
	 * 插入课程信息
	 */
	@RequestMapping("/scAdd")
	public String addStudent(Sc sc,Model model) {
		System.out.println("插入课程过程中接受到的课程的详细信息为:" + sc.toString());
		model.addAttribute("sc", sc);
		model.addAttribute("post_action", "scAdd");
		model.addAttribute("message", "添加成绩数据");
		model.addAttribute("message1", "插入的成绩数据为:");
		try {
			if(!sc.getAllAttr()) {//有为空信息
				model.addAttribute("add_result", "请输入信息进行成绩信息的插入");
				return "sc/scAdd";
			}else {//全不为空
				if(studentService.selectCourseByCno(sc.getCno()) == null || studentService.selectStudentBySno(sc.getSno()) == null) {
					//学号或者课程号不存在与之对应的信息
					model.addAttribute("add_result", "输入的学号或课程号不存在与之对应的学生或课程信息");
					return "sc/scAdd";
				}else {//学号和课程号都存在与之对应的信息
					if(studentService.selectScBySnoAndCno(sc.getSno(), sc.getCno()) != null) {//Sc 表中存在 重复的某学生的某课程
						model.addAttribute("add_result", "成绩表中已经存在学生[" + sc.getSno() + "]的" + sc.getCno() + "课程的对应信息:即插入信息重复");
						return "sc/scAdd";
					}else {//Sc 表中不存在重复的信息
						studentService.addSc(sc);
						model.addAttribute("add_success_flag", 3);
						model.addAttribute("add_result", "插入信息成功");
						return "success";
					}
				}
			}
		}catch(NullPointerException nullPointerException) {
			System.out.println("第一次进入该界面,传入的信息为空");
			return "sc/scAdd ";
		}
		
	}
	
	
	@RequestMapping("/scDelete")
	public String scDelete(String Sno, String Cno,  Model model) {
		System.out.println("删除课程过程中,接受到的课程的详细信息为:" + studentService.selectCourseByCno(Cno).toString());
		model.addAttribute("message", "通过学号和课程号删除选课信息");
		model.addAttribute("Cno", Cno);
		model.addAttribute("Sno", Sno);
		if(Sno != null && !Sno.equals("") && Cno != null && !Cno.equals("")) {//传入的学号和课程号不为空
			if(studentService.selectScBySnoAndCno(Sno, Cno) != null) {//输入的学号存在对应的学生数据
				studentService.removeScBySnoAndCno(Sno, Cno);
				model.addAttribute("add_result_info", "删除选课信息成功");
				model.addAttribute("delete_success_flag", 3);
				return "success";
			}else {//输入的学号和课程号都不为空,但是不存在输入的学号和课程号所对应的选课信息
				model.addAttribute("add_result_info", "不存在学号为" + Sno + "的学生,所选课为" + Cno + "的选课信息");
				return "sc/scDelete";
			}
		}else {//传入的学生信息为空
			model.addAttribute("add_result_info", "请输入学号及其对应的课程号!");					//1 表示传入的 Sno 或 Cno 为空
			return "sc/scDelete";
		}
	}
	
	@RequestMapping("/scModify")
	public String scModify(Sc sc,Model model) {
		System.out.println("修改课程过程中,获得的课程的详细信息为:" + sc.toString());
		model.addAttribute("message", "成绩信息修改");
		model.addAttribute("message1", "修改结果:");
		try {
			if(sc.getSno() == null || sc.getCno() == null) {//学号或课程号任意一个为空
				model.addAttribute("modify_result", "请输入课程号和学号对成绩信息进行修改");
				return "sc/scModify";
			}else {//都不为空
				if(studentService.selectScBySnoAndCno(sc.getSno(), sc.getCno()) == null) {//不存在对应的信息
					model.addAttribute("modify_result", " 不存在所输入的学号及课程号对应的成绩信息");
					return "sc/scModify";
				}else {//学号和课程号都存在
					if(sc.getGrade() < 0 || sc.getGrade() > 100) {
						model.addAttribute("modify_result", "请输入在 0 到 100 之间的有效成绩");
						return "sc/scModify";
					}else {
						studentService.modifySc(sc);
						Sc modified_sc = studentService.selectScBySnoAndCno(sc.getSno(), sc.getCno());
						model.addAttribute("sc", modified_sc);
						model.addAttribute("modify_success_flag", 3);
						model.addAttribute("modify_result", "修改成绩信息成功");
						return "success";
					}
				}
			}
		} catch (NullPointerException e) {
			System.out.println("第一次进入页面,输入的成绩信息为空");
			return "sc/scModify";
		}
	}
	
}

Service层

所有的 service 都在一个类里面
1、studentService

package org.student.service;

import java.util.List;

import org.student.domain.*;

public interface StudentService {
	//******************************信息管理系统用户User相关*******************************
	
	User login(String username,String password);
	
	//******************************学生基本信息Student相关*******************************

	List<Student> findStudentByAllAttr(Student student);

	Student selectStudentBySno(String Sno);

	void addStudent(Student student);

	void modifyStudent(Student student);

	void removeStudentBySno(String Sno);
	
	//******************************课程基本信息Course相关*******************************

	List<Course> findCourseByAllAttr(Course course);

	Course selectCourseByCno(String Cno);

	void addCourse(Course course);

	void modifyCourse(Course course);

	void removeCourseByCno(String Cno);
	
	Course selectDetailsByCno(String Cno);
	//******************************选课表基本信息SC相关*******************************

	List<Sc> findScByAllAttr(Sc sc);

	Sc selectScBySnoAndCno(String Sno, String Cno);

	List<Sc> selectScByCno(String Cno);

	void addSc(Sc sc);

	void modifySc(Sc sc);

	void removeScBySnoAndCno(String Sno, String Cno);	
	
}

2、service的实现类

package org.student.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.student.dao.CourseDao;
import org.student.dao.ScDao;
import org.student.dao.StudentDao;
import org.student.dao.UserDao;
import org.student.domain.Course;
import org.student.domain.Sc;
import org.student.domain.Student;
import org.student.domain.User;
import org.student.service.StudentService;
/**
 * @Description: 学生信息管理系统的StudentService接口的实现类
 * @author NAIL
 *
 */

@Service("studentService")
public class StudentServiceImpl implements StudentService{
	/**
	 * 自动注入持久层Dao对象
	 */
	@Autowired
	private UserDao userDao;
	
	@Autowired
	private StudentDao studentDao;
	
	@Autowired
	private CourseDao courseDao;
	
	@Autowired
	private ScDao scDao;
	
	
	//*****************接口中抽象方法的实现******************
	@Override	//已实现
	public User login(String loginname, String password) {
		return userDao.selectByLoginnameAndPassword(loginname, password);
	}

	@Override	//插入学生,已经实现
	public void addStudent(Student student) {
		studentDao.save(student);
	}

	@Override	//已实现
	public void modifyStudent(Student student) {
		studentDao.modifyStudent(student);;
	}

	@Override	//已实现
	public void removeStudentBySno(String Sno) {
		studentDao.removeStudentBySno(Sno);
	}
//*****************************Course相关*****************************(


	@Override	//已实现
	public void addCourse(Course course) {
		courseDao.save(course);
	}

	@Override	//已实现
	public void modifyCourse(Course course) {
		courseDao.modifyCourse(course);
		
	}

	@Override	//已实现
	public void removeCourseByCno(String Cno) {
		courseDao.removeCourse(Cno);
	}
	
	@Override	//已实现
	public void addSc(Sc sc) {
		scDao.save(sc);
	}

	@Override	//已实现
	public void modifySc(Sc sc) {
		scDao.modifySc(sc);
	}

	@Override	//已实现
	public void removeScBySnoAndCno(String Sno, String Cno) {
		scDao.removeSc(Sno, Cno);		
	}

	@Override	//已实现
	public List<Student> findStudentByAllAttr(Student student ) {
		return studentDao.findStudentByAllAttr(student);
	}

	@Override	//已实现
	public List<Course> findCourseByAllAttr(Course course) {
		return courseDao.findCourseByAllAttr(course);
	}

	@Override	//已实现
	public List<Sc> findScByAllAttr(Sc sc) {
		return scDao.findScByAllAttr(sc);
	}

	@Override	//已实现
	public Student selectStudentBySno(String Sno) {
		return studentDao.selectStudentBySno(Sno);
	}

	@Override	//已实现
	public Course selectCourseByCno(String Cno) {
		return courseDao.selectCourseByCno(Cno);
	}

	@Override	//已实现
	public Sc selectScBySnoAndCno(String Sno, String Cno) {
		return scDao.selectScBySnoAndCno(Sno, Cno);
	}

	@Override	//已实现
	public Course selectDetailsByCno(String Cno) {
		return courseDao.selectDetailsByCno(Cno);
	}

	@Override	//已实现 | 不用于 WEB ,用于辅助其他函数的实现
	public List<Sc> selectScByCno(String Cno) {
		return scDao.selectScDetailsByCno(Cno);
	}

}

Dao层

1、userDao

package org.student.dao;

import org.student.domain.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
 * @Description: UserMapper 接口
 * @author NAIL
 */
public interface UserDao{
	
	@Select("select * from User where loginname = #{loginname} and password = #{password}")
	User selectByLoginnameAndPassword(
			@Param("loginname") String loginname,
			@Param("password") String password);
/**
	@Select("select * from User where loginname = #{loginname}")
	User selectByLoginname(
			@Param("loginname") String loginname);

	@SelectProvider(type=UserDynaSqlProvider.class,method="insertUser")
	void save(User user);
*/
}

2、studentDao

package org.student.dao;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import org.student.dao.provider.StudentDynaSqlProvider;
import org.student.domain.Student;

public interface StudentDao {
	//查
    @SelectProvider(type=StudentDynaSqlProvider.class,method="selectByAllAttr")
	List<Student> findStudentByAllAttr(Student student );
	//查
    @Select("select * from student where Sno = #{Sno}")
    Student selectStudentBySno(String Sno);
    //删
   @Delete("delete from student where Sno = #{Sno}")
	void removeStudentBySno(String Sno);
    //改 update student set sno = xxx, sname = xxx, ssex = xxx, sage = xxx, sdept = xxx where sno = yyy;
   @UpdateProvider(type=StudentDynaSqlProvider.class,method="modifyStudent")
	void modifyStudent(Student student);
	//插
	@SelectProvider(type=StudentDynaSqlProvider.class,method="insertStudent")
	void save(Student student);

}

3、ScDao

package org.student.dao;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import org.student.dao.provider.ScDynaSqlProvider;
import org.student.domain.Sc;

public interface ScDao {
	//查
    @SelectProvider(type=ScDynaSqlProvider.class,method="selectByAllAttr")
	List<Sc> findScByAllAttr(Sc sc);
    //查
    @Select("select * from sc where 1=1 and Sno = #{Sno} and Cno = #{Cno}")
    Sc selectScBySnoAndCno(@Param("Sno") String Sno, @Param("Cno") String Cno);
    //增
    @InsertProvider(type=ScDynaSqlProvider.class,method="insertSc")
    void save(Sc sc);
    //通过学号和课程号删除成绩信息
    @Delete("delete from sc where Sno = #{Sno} and Cno = #{Cno}")
    void removeSc(@Param("Sno") String Sno, @Param("Cno") String Cno);
    @Results({
    		@Result(column = "Cno", property = "cno", id = true),
    		@Result(column = "Sno", property = "sno", id = true),
    		@Result(column = "Grade", property = "grade", id = false),
    		//对 student 表的外键的查询实现
    		@Result(column = "Sno", property = "student",
    				one = @One(select = "org.student.dao.StudentDao.selectStudentBySno"))
    })
    @Select("select * from Sc where Cno = #{Cno}")
    List<Sc> selectScDetailsByCno(String Cno);			//进行了多对一的关系的配置,查询到的结果为 Sc 的基本信息,和学生的姓名
	
    @UpdateProvider(type=ScDynaSqlProvider.class,method="modifySc")
    void modifySc(Sc sc);
    
}

4、CourseDao

package org.student.dao;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import org.student.dao.provider.CourseDynaSqlProvider;
import org.student.domain.Course;

public interface CourseDao {
	//查
	@SelectProvider(type=CourseDynaSqlProvider.class,method="selectByAllAttr")
	List<Course> findCourseByAllAttr(Course course);
	//查
	@Select("select * from course where cno = #{Cno}")
	Course selectCourseByCno(String cno);
	//查:根据课程号查询课程的详细信息
	@Results({//@Results 注解,存放 @Result 注解的列表
		//column为数据库字段名,porperty为实体类属性名
		@Result(column = "Cno", property = "cno", id = true), 	//id = true 表示主键
		@Result(column = "Cname", property = "cname"), 
		@Result(column = "Ccredit", property = "ccredit"),
		/*
		 * @One的用法。当我们需要通过查询到的一个字段值作为参数,去执行另外一个方法来查询关联的内容,
		 * 而且两者是一对一关系时,可以使用@One注解来便捷的实现。
		 * 
		 * @Many 的用法。与@One类似,只不过如果使用@One查询到的结果是多行,
		 * 会抛出TooManyResultException异常,这种时候应该使用的是@Many注解,实现一对多的查询。
		 * 
		 * 由于Course 表中,没有Student 表的外键,我认为 Course 和 Student 表没有直接的关系
		 */
		//一个 Course 对应多个 Student, 一个Course 对应多个 成绩 Sc
		//先对成绩信息进行查
		@Result(column = "Cno", property = "scs", 
		many=@Many(
				select="org.student.dao.ScDao.selectScDetailsByCno"
				))
	})
	@Select("select * from course where cno = #{Cno} ")
	Course selectDetailsByCno(String Cno);
	//删
	@Delete("delete from course where cno = #{Cno}")
	void removeCourse(String Cno);
	@UpdateProvider(type=CourseDynaSqlProvider.class,method="modifyCourse")
	void modifyCourse(Course course);
	//插
	@InsertProvider(type=CourseDynaSqlProvider.class,method="insertCourse")
	void save(Course course);
}

Dao 层实现类

1、User

package org.student.dao.provider;

import org.apache.ibatis.jdbc.SQL;
import org.student.domain.User;

public class UserDynaSqlProvider {
public String insertUser(User user){
		
		return new SQL(){
			{
				INSERT_INTO("user");
				if(user.getLoginname() != null && !user.getLoginname().equals("")){
					VALUES("loginname", "#{loginname}");
				}
				if(user.getPassword() != null && !user.getPassword().equals("")){
					VALUES("password", "#{password}");
				}
			}
		}.toString();
	}
}

2、Student

package org.student.dao.provider;

import org.apache.ibatis.jdbc.SQL;
import org.student.domain.Student;
/*
 * 	private String Sno;
	private String Sname;
	private String Ssex;
	private int Sage;
	private String Sdept;
 */
public class StudentDynaSqlProvider {
	
	/*
	 * 动态实现对查询条件的拼接,动态SQL语句
	 */
	public String selectByAllAttr(Student student) {
		//根据学生的已知条件来查询学生的详细信息,对姓名、学号、班级、系名等支持模糊查询
		//返回的sql语句
		StringBuffer dySql = new StringBuffer("select * from student where 1=1");
		
		//对对象的具体参数进行判断,并对动态SQL语句进行拼接
		// = 部分
		if(student.getSsex() != null && !("".equals(student.getSsex()))) {
			dySql.append(" AND Ssex = '" + student.getSsex() + "' ");
		}
		if(student.getSage() != null) {
			dySql.append(" AND Sage = " + student.getSage() + " ");
		}
		//LIKE 部分
		if(student.getSno() != null && !("".equals(student.getSno()))) {
            dySql.append(" AND Sno LIKE '%" + student.getSno() + "%'");
		}
		if(student.getSdept()!=null && !("".equals(student.getSdept()))) {
            dySql.append(" AND Sdept LIKE '%" + student.getSname() + "%'");
		}
		if(student.getSname()!=null && !("".equals(student.getSname()))) {
            dySql.append(" AND Sname LIKE '%" + student.getSname() + "%'");
		}
		System.out.println("全属性查询中的查询语句为:"+dySql.toString());
		return dySql.toString();
	}
	
	
	public String insertStudent(Student student) {
		String sql = new SQL(){
			{
				INSERT_INTO("student");
				if(student.getSname() != null && !student.getSname().equals("")){
					VALUES("Sname", "'" + student.getSname() + "'");
				}
				if(student.getSno() != null && !student.getSno().equals("")){
					VALUES("Sno", "'" + student.getSno() + "'");
				}
				if(student.getSsex() != null && !student.getSsex().equals("")){
					VALUES("Ssex", "'" + student.getSsex() + "'");
				}
				if(student.getSage() != null) {
					VALUES("Sage", student.getSage().toString());
				}
				
				if(student.getSdept() != null && !student.getSdept().equals("")){
					VALUES("Sdept", "'" + student.getSdept() + "'");
				}
			}
		}.toString();
		System.out.println("插入学生信息输出语句:"+sql);
		return sql;
	}
	
	
	public String modifyStudent(Student student) {
		String sql = new SQL(){
			{
				UPDATE("student");
				if(student.getSname() != null && !student.getSname().equals("")) {
					SET(" Sname =  '" + student.getSname() + "' ");
				}
				if(student.getSsex() != null && !student.getSsex().equals("")) {
					SET(" Ssex = '" + student.getSsex() + "' ");
				}
				if(student.getSdept() != null && !student.getSdept().equals("")) {
					SET(" Sdept = '" + student.getSdept() + "' ");
				}
				if(student.getSage() != null) {
					SET(" Sage = " + student.getSage());
				}
				WHERE("Sno = '" + student.getSno() + "' ");
			}
		}.toString();
		System.out.println("修改学生信息输出语句:"+sql);
		return sql;
	}
	
}

3、Course实现类

package org.student.dao.provider;

import org.apache.ibatis.jdbc.SQL;
import org.student.domain.Course;

public class CourseDynaSqlProvider {
	/**
	 * 查询课程表的基本信息
	 * @param course
	 * @return
	 */
	public String selectByAllAttr(Course course) {
		//返回的sql语句
		StringBuffer dySql = new StringBuffer("select * from course where 1=1");
		
		//对对象的具体参数进行判断,并对动态SQL语句进行拼接
		// = 部分
		if(course.getCno() != null && !("".equals(course.getCno()))) {
			dySql.append(" AND Cno = '" + course.getCno() + "' ");
		}
		if(course.getCpno() != null && !("".equals(course.getCpno()))) {
			dySql.append(" AND Cpno = '" + course.getCpno() + "' ");
		}
		if(course.getCcredit() != null) {
			dySql.append(" AND Ccredit = " + course.getCcredit());
		}

		//LIKE 部分
		if(course.getCname()!=null && !("".equals(course.getCname()))) {
            dySql.append(" AND Cname LIKE '%" + course.getCname() + "%'");
		}
		System.out.println("全属性查询中的查询语句为:"+dySql.toString());
		return dySql.toString();
	}
	
	public String insertCourse(Course course) {
		String sql = new SQL(){
			{
				INSERT_INTO("course");
				if(course.getCname() != null && !course.getCname().equals("")){
					VALUES("Cname", "'" + course.getCname() + "'");
				}
				if(course.getCno() != null && !course.getCno().equals("")){
					VALUES("Cno", "'" + course.getCno() + "'");
				}
				if(course.getCpno() != null && !course.getCpno().equals("")){
					VALUES("Cpno", "'" + course.getCpno() + "'");
				}
				if(course.getCcredit() != null) {
					VALUES("Ccredit", course.getCcredit().toString());
				}
			}
		}.toString();
		System.out.println("插入课程信息输出语句:"+sql);
		return sql;
	}
	
	
	/**
	 * 根据课程号查找课程的详细信息 
	 * @param cno
	 * @return
	 */
	public String selectDetailsByCno(String Cno) {

		StringBuffer dySql = new StringBuffer("select SC.Cno,Cname,SC.Sno,Sname,Ccredit,Grade from student,course,sc "
				+ "where course.Cno=sc.Cno and student.Sno=sc.Sno ");			//ORDER BY Cname
		if(Cno != null && !Cno.equals("")) {
			dySql.append(" and course.Cno = '" + Cno +"' ");
		}
		dySql.append(" order by Cno ");
		System.out.println("查找课程详细信息的语句为:"+ dySql.toString());
		return dySql.toString();
	}
	
	
	public String modifyCourse(Course course) {
		String sql = new SQL(){
			{
				UPDATE("course");
				if(course.getCname() != null && !course.getCname().equals("")) {
					SET(" Sname =  '" + course.getCname() + "' ");
				}
				if(course.getCpno() != null && !course.getCpno().equals("")) {
					SET(" Cpno = '" + course.getCpno() + "' ");
				}
				if(course.getCcredit() != null) {
					SET(" Ccredit = '" + course.getCcredit() + "' ");
				}
				WHERE("Cno = '" + course.getCno() + "' ");
			}
		}.toString();
		System.out.println("修改课程信息输出语句:"+sql);
		return sql;
	}
	
}

4、Sc实现类

package org.student.dao.provider;

import org.apache.ibatis.jdbc.SQL;
import org.student.domain.Sc;

public class ScDynaSqlProvider {
	//动态 SQL 语句
	public String selectByAllAttr(Sc sc) {
		//返回的sql语句
		StringBuffer dySql = new StringBuffer("select * from sc where 1=1");
		
		//对对象的具体参数进行判断,并对动态SQL语句进行拼接
		// = 部分
		if(sc.getSno() != null && !("".equals(sc.getSno()))) {
			dySql.append(" AND Sno = '" + sc.getSno() + "' ");
		}
		if(sc.getCno() != null && !("".equals(sc.getCno()))) {
			dySql.append(" AND Cno = '" + sc.getCno() + "' ");
		}
		if(sc.getGrade() != null) {
			dySql.append("AND Grade = " + sc.getGrade());
		}
		 
		System.out.println("全属性查询中的查询语句为:"+dySql.toString());
		return dySql.toString();
	}
	
	public String insertSc(Sc sc) {
		String sql = new SQL(){
			{
				INSERT_INTO("sc");
				if(sc.getSno() != null && !sc.getSno().equals("")){
					VALUES("Sno", "'" + sc.getSno() + "'");
				}
				if(sc.getCno() != null && !sc.getCno().equals("")){
					VALUES("Cno", "'" + sc.getCno() + "'");
				}
				if(sc.getGrade() != null){
					VALUES("Grade", sc.getGrade().toString());
				}
			}
		}.toString();
		System.out.println("插入课程信息输出语句:"+sql);
		return sql;
	}
	
	
	public String modifySc(Sc sc) {
		String sql = new SQL(){
			{
				UPDATE("sc");
				if(sc.getGrade() != null) {
					SET(" Grade =  '" + sc.getGrade() + "' ");
				}
				WHERE("Cno = '" + sc.getCno() + "' AND Sno = '" + sc.getSno() + "' ");
			}
		}.toString();
		System.out.println("修改课程信息输出语句:"+sql);
		return sql;
	}
	
}

拦截器

package org.student.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.student.domain.User;
//创建 Spring Mvc 的拦截器,避免直接通过 URL 访问资源
public class studentInterceptor implements HandlerInterceptor{
	
	private static final String[] IGNORE_URL = {"/loginForm","/login"};	
	
	//在 perHandle 方法返回值为 true 时才会执行
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception exception)
				throws Exception{
		
	}
	
	
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response,
			Object object, ModelAndView mv) throws Exception{
		
	}
	
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
			Object handler) throws Exception {
		
		boolean flag = false;
		
		String servletPath = request.getServletPath();
		for (String s : IGNORE_URL) {
            if (servletPath.contains(s)) {
                flag = true;
                break;
            }
        }
		
		if (!flag){
        	/** 1.获取session中的用户  */
        	User user = (User) request.getSession().getAttribute("user_session");
        	/** 2.判断用户是否已经登录 */
        	if(user == null){
        		 /** 如果用户没有登录,跳转到登录页面 */
        		request.setAttribute("message", "请先登录再访问网站!");
        		request.getRequestDispatcher("loginForm").forward(request, response);
        		return flag;
        	}else{
        		 flag = true;
        	}
        }
        return flag;
		
	}
}

jsp

1、主页

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<!-- style 标签应该写到 head 标签里面,否则报警告 -->
<style type="text/css">
<!--

a:link {
 color: #00FF00;
 text-decoration: none;
}
a:visited {
 color: #00FF00;
 text-decoration: none;
}
a:hover {
 color: #00FF00;
 text-decoration: underline;
}

-->
</style>
<meta charset="UTF-8">
<title>学生信息管理系统 | 菜单</title>
</head>
<body>

<table  border="1">
		<tr >
			<th colspan="9"><h1>数据信息类型</h1></th>
		</tr>
		<tr>
			<th><h2>单表查询</h2></th>
			<th><h2><a href="/StudentsMessageManageSystem/studentSelect">查询学生信息</a></h2></th>
			<th><h2><a href="/StudentsMessageManageSystem/courseSelect">查询课程信息</a></h2></th>
			<th><h2><a href="/StudentsMessageManageSystem/scSelect">查询选课信息</a></h2></th>
		</tr>	
		<tr>
			<th><h2>添加信息</h2></th>
			<th><h2><a href="/StudentsMessageManageSystem/studentAdd">添加学生信息</a></h2></th>
			<th><h2><a href="/StudentsMessageManageSystem/courseAdd">添加课程信息</a></h2></th>
			<th><h2><a href="/StudentsMessageManageSystem/scAdd">添加选课信息</a></h2></th>
		</tr>	
		<tr>
			<th><h2>删除信息</h2></th>
			<th><h2><a href="/StudentsMessageManageSystem/studentDelete">删除学生信息</a></h2></th>
			<th><h2><a href="/StudentsMessageManageSystem/courseDelete">删除课程信息</a></h2></th>
			<th><h2><a href="/StudentsMessageManageSystem/scDelete">删除选课信息</a></h2></th>
		</tr>
		<tr>
			<th><h2>课程信息</h2></th>
			<th colspan="4"><h2><a href="/StudentsMessageManageSystem/selectDetailsByCno">根据课程的基本信息(学号)查询课程的详细信息</a></h2></th>
		</tr>
		<tr>
			<th><h2>统计图表</h2></th>
			<th colspan="4"><h2><a href="/StudentsMessageManageSystem/statistic">根据课程号统计课程的详细信息</a></h2></th>
		</tr>		
		<tr>
			<th><h2>修改信息</h2></th>
			<th><h2><a href="/StudentsMessageManageSystem/studentModify">修改学生信息</a></h2></th>
			<th><h2><a href="/StudentsMessageManageSystem/courseModify">修改课程信息</a></h2></th>
			<th><h2><a href="/StudentsMessageManageSystem/scModify">修改选课信息</a></h2></th>
		</tr>	
	</table>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值