前言:
1 该程序使用动态web项目
2 该程序使用SQL server需导入
对应包( 具体可看前篇----JDBC的使用)
3 三层架构思想:
①表示层
前台:jsp/html等 作为前台与用户交互
后台:用于控制跳转,调用业务逻辑层
②业务逻辑层
将数据访问层进行组装
给表示层调用
③数据访问层
所有小功能和函数建立
与数据库相连 以dao命名
4 该程序体现面向接口开发:先接口-再实现类(此为规范!!)
当实体类需要实例时
运用:接口=new 实例
service、dao加入接口
命名规范:
接口:IXXX 例:IStudentDao
实现类:XXXImpl 例:StudentDaoImpl
5 DBUtil作为通用数据库工具类,实现通用调用数据库方法
6 该程序使用tomcat8.5
以下是示例目录
以下是代码实例
IStudentDao(作为dao的接口 将方法写出但不做声明)
packagedao;importjava.util.List;importentity.Student;public interfaceIStudentDao {public boolean isExist(intsno);public booleanAddStudent(Student student);public ListqueryAll();public boolean updateStudentBySno(intsno,Student student);public Student queryStudentBysno(intsno);public boolean deleteStudentBySno(intsno);
}
StudentDaoImpl(实现接口方法-增、删、改、查单人/查所有)
##用DBUtil封装方法 达到减少代码量目的
packagedaoImpl;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;importdao.IStudentDao;importentity.Student;importutil.DBUtil;/** 数据访问层
* 与数据库交互*/
public class StudentDaoImpl implementsIStudentDao {/** 判断学号是否存在
* 返回学号是否存在*/
public boolean isExist(intsno) {return queryStudentBysno(sno)==null?false:true;
}/** 增加学生信息
* 返回是否成功*/
public booleanAddStudent(Student student) {
String sql="insert into student values(?,?,?,?)";
Object[] params={student.getSno(),student.getSname(),student.getAge(),student.getAge(),student.getAddress()};returnDBUtil.executeUpdate(sql, params);
}/** 根据学号删人
* 返回是否成功*/
public boolean deleteStudentBySno(intsno) {
String sql="delete student where sno=?";
Object[] params={sno};returnDBUtil.executeUpdate(sql, params);
}/** 根据学号sno修改数据student
* 返回是否成功*/
public boolean updateStudentBySno(intsno,Student student) {
String sql="update student set sname=?,sage=?,saddress=? where sno=?";
Object[] params={student.getSname(),student.getAge(),student.getAddress(),sno};returnDBUtil.executeUpdate(sql, params);
}/** 查询全部学生
* 返回学生集合*/
public ListqueryAll() {
Student student=null;
PreparedStatement pst=null;
ResultSet rs=null;
List students=new ArrayList();try{
String sql="select * from student";
rs= DBUtil.executeQuery(sql, null);while(rs.next()) {int no=rs.getInt("sno");
String name=rs.getString("sname");int age=rs.getInt("sage");
String address=rs.getString("saddress");
student=newStudent(no,name,age,address);
students.add(student);
}returnstudents;
}catch(SQLException e) {
e.printStackTrace();return null;
}catch(Exception e) {
e.printStackTrace();return null;
}finally{try{if(rs!=null) rs.close();if(pst!=null) pst.close();if(DBUtil.connection!=null) DBUtil.connection.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}/** 根据学号查询学生
* 返回查询学生类*/
public Student queryStudentBysno(intsno) {
Student student=null;
PreparedStatement pst=null;
ResultSet rs=null;try{
String sql="select * from student where sno=?";
Object params[]={sno};
rs=DBUtil.executeQuery(sql, params);if(rs.next()) {int no=rs.getInt("sno");
String name=rs.getString("sname");int age=rs.getInt("sage");
String address=rs.getString("saddress");
student=newStudent(no,name,age,address);
}returnstudent;
}catch(SQLException e) {
e.printStackTrace();return null;
}catch(Exception e) {
e.printStackTrace();return null;
}finally{
DBUtil.closeAll(rs, pst, DBUtil.connection);
}
}
}
DBUtil减少代码冗余-并实现 数据库通用工具类思想
packageutil;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;//通用的数据库操作方法
public classDBUtil {//sql数据库连接字符串
private static final String URL="jdbc:sqlserver://localhost:1433;databasename=javatest";//sql用户名 和密码 用作连接用
private static final String USERNAME="sa";private static final String PWD="cc123nice";public static Connection connection=null;public static PreparedStatement pst =null;public static ResultSet rs =null;/** 得到PreparedStatement减少代码冗余*/
public staticPreparedStatement getPreparedStatement(String sql,Object[] params) {//导入驱动,加载具体驱动类
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//与数据库建立链接
connection =DriverManager.getConnection(URL, USERNAME, PWD);
pst=connection.prepareStatement(sql);if(params!=null) {for(int i=0;i
pst.setObject(i+1,params[i]);
}
}
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}returnpst;
}/** 最后关闭所有*/
public static voidcloseAll(ResultSet rs,Statement stmt,Connection connection) {try{if(rs!=null) rs.close();if(stmt!=null) stmt.close();if(connection!=null) connection.close();
}catch(SQLException e) {
e.printStackTrace();
}
}/** 通用的增删改 通过传入的sql和obj数组确认语句*/
public static booleanexecuteUpdate(String sql,Object[] params) {try{int count =getPreparedStatement(sql,params).executeUpdate();if(count>0)return true;else
return false;
}catch(SQLException e) {
e.printStackTrace();return false;
}catch(Exception e) {
e.printStackTrace();return false;
}finally{
closeAll(null, pst, connection);
}
}/** 通用的查询(只能返回到ResultSet)之后必须与具体类型耦合*/
public staticResultSet executeQuery(String sql,Object[] params) {try{
rs=getPreparedStatement(sql,params).executeQuery();returnrs;
}catch(SQLException e) {
e.printStackTrace();return null;
}catch(Exception e) {
e.printStackTrace();return null;
}
}
}
IStudentService(作为service的接口 将方法写出但不做声明)
packageservice;importjava.util.List;importentity.Student;public interfaceIStudentService {public booleanaddStudent(Student student);//删
public boolean deleteStudentBySno(intsno);//改
public boolean updateStudentBySno(intsno,Student student);//根据学号查
public Student queryStudentBysno(intsno) ;//查询所有
public ListqueryAll();
}
StudentServiceImpl实现接口IStudentService方法实现
主要对dao实例内的方法进行封装
packageserviceImpl;importjava.util.List;importdao.IStudentDao;importdaoImpl.StudentDaoImpl;importentity.Student;importservice.IStudentService;/** 业务逻辑层 对dao层进行组装 逻辑性增删改查(增删改==查+操作)*/
public class StudentServiceImpl implementsIStudentService{
IStudentDao std=newStudentDaoImpl();//增
public booleanaddStudent(Student student) {if(!std.isExist(student.getSno())){returnstd.AddStudent(student);
}else
return false;
}//删
public boolean deleteStudentBySno(intsno) {if(std.isExist(sno)){returnstd.deleteStudentBySno(sno);
}else
return false;
}//改
public boolean updateStudentBySno(intsno,Student student) {if(std.isExist(sno)){returnstd.updateStudentBySno(sno, student);
}else
return false;
}//根据学号查
public Student queryStudentBysno(intsno) {returnstd.queryStudentBysno(sno);
}//查询所有
public ListqueryAll(){returnstd.queryAll();
}
}
MyServerlet包中存放对各个方法的servlet(实现1对1的情况)将表示层的信息处理、向下-处理层传递/向上-表示层传递
AddServlet实现‘增加’的表示层后台
packageMyServerlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importentity.Student;importservice.IStudentService;importserviceImpl.StudentServiceImpl;/** serverlet--增加*/@WebServlet("/AddServerlet")public class AddServlet extendsHttpServlet {private static final long serialVersionUID = 1204432039484958110L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {try{int sno =Integer.parseInt( request.getParameter("sno"));
String name= request.getParameter("sname");int age = Integer.parseInt(request.getParameter("sage"));
String address= request.getParameter("saddress");
Student student=newStudent(sno,name,age,address);
IStudentService studentService= newStudentServiceImpl();boolean res =studentService.addStudent(student);
request.setCharacterEncoding("utf-8");//给request增加标识符
if(!res)
request.setAttribute("res", "增加失败");elserequest.setAttribute("res", "增加成功");
}catch(Exception e){
request.setAttribute("res", "数据有误增加失败");
}
request.getRequestDispatcher("QueryAllServlet").forward(request, response);
}protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
doGet(request, response);
}
}
DeleteServlet实现‘删除’的表示层后台
packageMyServerlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importservice.IStudentService;importserviceImpl.StudentServiceImpl;
@WebServlet("/DeleteServerlet")public class DeleteServlet extendsHttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {//接受学号
int sno = Integer.parseInt(request.getParameter("sno"));
IStudentService service= newStudentServiceImpl();boolean res =service.deleteStudentBySno(sno);
response.setContentType("text/html; charset=utf-8");if(!res)
request.setAttribute("res", "删除失败");elserequest.setAttribute("res", "删除成功");
request.getRequestDispatcher("QueryAllServlet").forward(request, response);
}protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
doGet(request, response);
}
}
QueryAllServlet实现‘查找所有’的表示层后台
packageMyServerlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importservice.IStudentService;importserviceImpl.StudentServiceImpl;
@WebServlet("/DeleteServerlet")public class DeleteServlet extendsHttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {//接受学号
int sno = Integer.parseInt(request.getParameter("sno"));
IStudentService service= newStudentServiceImpl();boolean res =service.deleteStudentBySno(sno);
response.setContentType("text/html; charset=utf-8");if(!res)
request.setAttribute("res", "删除失败");elserequest.setAttribute("res", "删除成功");
request.getRequestDispatcher("QueryAllServlet").forward(request, response);
}protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
doGet(request, response);
}
}
QuerySnoServlet实现‘通过学号查找’的表示层后台
此处重定向到studentinfo.jsp 以下进行解析
packageMyServerlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importentity.Student;importservice.IStudentService;importserviceImpl.StudentServiceImpl;
@WebServlet("/QuerySnoServerlet")public class QuerySnoServlet extendsHttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {int no = Integer.parseInt(request.getParameter("sno"));
IStudentService service= newStudentServiceImpl();
Student student=service.queryStudentBysno(no);
request.setAttribute("student", student);
request.getRequestDispatcher("studentinfo.jsp").forward(request, response);
}protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
doGet(request, response);
}
}
UpdateServlet实现‘修改’的表示层后台
packageMyServerlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importentity.Student;importservice.IStudentService;importserviceImpl.StudentServiceImpl;
@WebServlet("/UpdateServlet")public class UpdateServlet extendsHttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {//处理获取数据编码
request.setCharacterEncoding("utf-8");//获取待修改学生的学号
int no = Integer.parseInt(request.getParameter("sno"));//修改后内容
String name = request.getParameter("sname");int age = Integer.parseInt(request.getParameter("sage"));
String address= request.getParameter("saddress");
Student student=newStudent(name,age,address);
IStudentService service= newStudentServiceImpl();boolean res =service.updateStudentBySno(no, student);//处理相应编码
response.setContentType("text/html; charset=utf-8");if(!res)
request.setAttribute("res", "修改失败");elserequest.setAttribute("res", "修改成功");
request.getRequestDispatcher("QueryAllServlet").forward(request, response);
}protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
doGet(request, response);
}
}
以下为表示层前台
add.jsp增加学生信息表单
新增用户信息学号:
姓名:
年龄:
地址:
index.jsp 以表单显示所有学生基本信息
实现学号超链接更多信息
实现新增信息
实现删除信息
学生信息列表Stringres=(String)request.getAttribute("res");if(res!=null){
out.print(res);
}%>
学号姓名年龄操作//获取request域中的数据
Liststudents=( List) request.getAttribute("students");for(Student student:students){%>
">">删除增加
studentinfo.jsp 以表单形式显示具体信息
可以直接填写表单进行修改
Insert title here学号:>
姓名:>
年龄:>
地址:>
返回
成品示例(需要链接中不显示具体信息,再提交表单处增加 method='post')
进入界面显示所有学生信息
点击学号1查看具体信息
直接修改数据
点击增加可直接增加数据
新增后跳转回显示全部基本信息
点击删除后直接删除行列