JavaWeb学习之三层架构实例(三)
引言
通过上一篇博客JavaWeb学习之三层架构实例(二)我们基本上已经实现了对学生信息列表的增删改查操作(UI除外),但是不难看出,代码冗余度太高了,尤其是StudentDao这个类,其中的增删改查四个方法,同样都要连接数据库、获取statement等等。为此,我又对这个项目进行了有点点优化。
优化日志
1、增加了两个接口 IStudentDao.java 、 IStudentService.java ;
2、 StudentDao.java 和 StudentService.java 分别实现以上两个接口,并加入Impl后缀;
3、 增加一个数据库帮助类 DBUtil.java,目的是简化Dao层代码量;
代码
代码结构

数据库帮助类DBUtil.java
这是一个通用的类,任何的数据库操作(增删改查),都可以通过这各类来实现(不仅仅是对student表的增删改查);
package com.ajy.util;
import java.sql.*;
//通用的数据库操作方法
public class DBUtil {
private static String URL="jdbc:mysql://localhost:3306/anjiyubase?&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=false";
private static String DRIVER="com.mysql.cj.jdbc.Driver";
private static String NAME="root";
private static String PWD="121181";
public static Connection con = null;
public static PreparedStatement pstmt = null;
public static ResultSet rs = null;
/***
*增删改查四个功能,分两大块
* 第一块:增删改
* 第二块:查询
*/
//实现增删改功能
public static boolean executeUpdate(String sql,Object[] objects){
try {
createPreparedStatement(sql,objects).executeUpdate();
shutDownDB(null,pstmt,con);
return true;
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
return false;
}
}
//实现查询功能
public static ResultSet executeQuery(String sql,Object[] objects){
try {
rs = createPreparedStatement(sql,objects).executeQuery();
return rs;
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
public static void shutDownDB(ResultSet rs,Statement stmt,Connection con) throws SQLException {
if (rs!=null)rs.close();
if (stmt!=null)stmt.close();
if (con!=null)con.close();
}
public static Connection getConnection() throws SQLException, ClassNotFoundException {
Class.forName(DRIVER);
return DriverManager.getConnection(URL,NAME,PWD);
}
public static PreparedStatement createPreparedStatement(String sql,Object[] objects) throws SQLException, ClassNotFoundException {
pstmt = getConnection().prepareStatement(sql);
if (objects != null) {
for (int i = 0; i < objects.length; i++) {
pstmt.setObject(i + 1, objects[i]);
}
}
return pstmt;
}
}
学生类Student.java
package com.ajy.entity;
public class Student {
private int stuNo;
private String stuName;
private int stuAge;
private String stuAddress;
public Student(int stuNo,String stuName,int stuAge,String stuAddress){
this.stuNo = stuNo;
this.stuName = stuName;
this.stuAge = stuAge;
this.stuAddress = stuAddress;
}
public Student(String stuName,int stuAge,String stuAddress){
this.stuNo = stuNo;
this.stuName = stuName;
this.stuAge = stuAge;
this.stuAddress = stuAddress;
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
public String getStuAddress() {
return stuAddress;
}
public void setStuAddress(String stuAddress) {
this.stuAddress = stuAddress;
}
@Override
public String toString() {
return getStuNo()+"--"+getStuName()+"--"+getStuAge()+"--"+getStuAddress();
}
}
数据访问层
接口IStudentDao.java
package com.ajy.dao;
import com.ajy.entity.Student;
import java.util.List;
public interface IStudentDao {
public boolean addStudent(Student stu);
//查询学生是否存在
public boolean isExits(int stuNo);
//查询学生
public Student queryStudent(int stuNo);
//查询全部学生
public List<Student> queryAll();
//根据学号删除学生
public boolean deleteStudentBySno(int Sno);
//根据学号修改学号对应的学生信息
public boolean updateStudentBySno(int sno,Student stu);
}
实现类StudentDaoImpl.java
package com.ajy.dao.impl;
import com.ajy.dao.IStudentDao;
import com.ajy.entity.Student;
import com.ajy.util.DBUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class StudentDaoImpl implements IStudentDao {
//增加学生信息
public boolean addStudent(Student stu){
String sql = "insert into student values(?,?,?,?)";
Object[] objects = {stu.getStuNo(),stu.getStuName(),stu.getStuAge(),stu.getStuAddress()};
return DBUtil.executeUpdate(sql,objects);
}
//查询学生是否存在
public boolean isExits(int stuNo){
return queryStudent(stuNo)==null?false:true;
}
//查询学生
public Student queryStudent(int stuNo){
String sql = "select *from student where sno=?";
Object[] objects = {stuNo};
ResultSet rs = DBUtil.executeQuery(sql,objects);
try {
if (rs.next()){
int sno = rs.getInt("sno");
String sname = rs.getString("sname");
int sage = rs.getInt("sage");
String saddress= rs.getString("saddress");
return new Student(sno,sname,sage,saddress);
}else{
return null;
}
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
//查询全部学生
public List<Student> queryAll(){
String sql = "select*from student";
ResultSet rs = DBUtil.executeQuery(sql,null);
try{
List<Student> list = new ArrayList<>();
while (rs.next()){
int sno = rs.getInt("sno");
String sname = rs.getString("sname");
int sage = rs.getInt("sage");
String saddress= rs.getString("saddress");
list.add(new Student(sno,sname,sage,saddress));
}
return list;
} catch (SQLException e) {
e.printStackTrace();
return null;
}finally {
try {
DBUtil.shutDownDB(DBUtil.rs,DBUtil.pstmt,DBUtil.con);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
}
//根据学号删除学生
public boolean deleteStudentBySno(int Sno){
String sql = "delete from student where sno=?";
Object[] objects = {Sno};
return DBUtil.executeUpdate(sql,objects);
}
//根据学号修改学号对应的学生信息
public boolean updateStudentBySno(int sno,Student stu){
String sql = "update student set sname=?,sage=?,saddress=? where sno=?";
Object[] objects = {stu.getStuName(),stu.getStuAge(),stu.getStuAddress(),sno};
return DBUtil.executeUpdate(sql,objects);
}
}
业务逻辑层
接口IStudentService.java
package com.ajy.service;
import com.ajy.entity.Student;
import java.util.List;
public interface IStudentService {
//增加学生
public boolean addStudent(Student stu);
//根据学号删除学生
public boolean deleteStudentBySno(int sno);
//根据学号查询学生
public Student queryStudentBySno(int sno);
//根据学号,更新对应的学生
public boolean updateStudentBySno(int sno,Student stu);
//查询全部学生
public List<Student> queryStudentAll();
}
实现类StudentServiceImpl.java
package com.ajy.service.impl;
import com.ajy.dao.IStudentDao;
import com.ajy.dao.impl.StudentDaoImpl;
import com.ajy.entity.Student;
import com.ajy.service.IStudentService;
import java.util.List;
public class StudentServiceImpl implements IStudentService {
IStudentDao studentDao = new StudentDaoImpl();
//增加学生
public boolean addStudent(Student stu){
if (!studentDao.isExits(stu.getStuNo())){
return studentDao.addStudent(stu);
}else{
return false;
}
}
//根据学号删除学生
public boolean deleteStudentBySno(int sno){
//先判断学生是否存在
if(!studentDao.isExits(sno)){
return false;
}else{
return studentDao.deleteStudentBySno(sno);
}
}
//根据学号查询学生
public Student queryStudentBySno(int sno){
return studentDao.queryStudent(sno);
}
//根据学号,更新对应的学生
public boolean updateStudentBySno(int sno,Student stu){
//先判断此学号对应的学生是否存在
if(!studentDao.isExits(sno)){
return false;
}else{
return studentDao.updateStudentBySno(sno,stu);
}
}
//查询全部学生
public List<Student> queryStudentAll(){
return studentDao.queryAll();
}
}
视图层
后端代码
AddStudentServlet.java
package com.ajy.servlet;
import com.ajy.entity.Student;
import com.ajy.service.IStudentService;
import com.ajy.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "AddStudentServlet",value = "/AddStudentServlet")
public class AddStudentServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
int stuNo = Integer.parseInt(request.getParameter("stuNo"));
String stuName = request.getParameter("stuName");
int stuAge = Integer.parseInt(request.getParameter("stuAge"));
String stuAddress = request.getParameter("stuAddress");
Student stu = new Student(stuNo,stuName,stuAge,stuAddress);
IStudentService addStudentService = new StudentServiceImpl();
boolean res = addStudentService.addStudent(stu);
if (res){
request.setAttribute("res","添加成功");
}else{
request.setAttribute("res","添加失败");
}
request.getRequestDispatcher("QueryAllStudents").forward(request,response);
}
}
DeleteStudentServlet.java
package com.ajy.servlet;
import com.ajy.service.IStudentService;
import com.ajy.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "DeleteStudentServlet",value = "/DeleteStudentServlet")
public class DeleteStudentServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//根据学号删除学生
int sno = Integer.parseInt(request.getParameter("sno"));
IStudentService studentService = new StudentServiceImpl();
boolean res = studentService.deleteStudentBySno(sno);
if (res){
request.setAttribute("res","删除成功");
}else{
request.setAttribute("res","删除失败");
}
request.getRequestDispatcher("QueryAllStudents").forward(request,response);
}
}
QueryAllStudents.java
package com.ajy.servlet;
import com.ajy.entity.Student;
import com.ajy.service.IStudentService;
import com.ajy.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet(name = "QueryAllStudents",value = "/QueryAllStudents")
public class QueryAllStudents extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
IStudentService studentService = new StudentServiceImpl();
List<Student> studentList = studentService.queryStudentAll();
request.setAttribute("students",studentList);
request.getRequestDispatcher("studentlist.jsp").forward(request,response);
}
}
QueryStudentBySno.java
package com.ajy.servlet;
import com.ajy.entity.Student;
import com.ajy.service.IStudentService;
import com.ajy.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "QueryStudentBySno",value = "/QueryStudentBySno")
public class QueryStudentBySno extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
IStudentService studentService = new StudentServiceImpl();
int sno = Integer.parseInt(request.getParameter("sno"));
Student stu = studentService.queryStudentBySno(sno);
request.setAttribute("student",stu);
request.getRequestDispatcher("updateinfo.jsp").forward(request,response);
}
}
UpdateStudentBySnoServlet.java
package com.ajy.servlet;
import com.ajy.entity.Student;
import com.ajy.service.IStudentService;
import com.ajy.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "UpdateStudentBySnoServlet",value = "/UpdateStudentBySnoServlet")
public class UpdateStudentBySnoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
IStudentService studentService = new StudentServiceImpl();
int sno = Integer.parseInt(request.getParameter("sno"));
String sname = request.getParameter("sname");
int sage = Integer.parseInt(request.getParameter("sage"));
String saddress = request.getParameter("saddress");
Student student = new Student(sname,sage,saddress);
boolean res = studentService.updateStudentBySno(sno,student);
if (res){
request.setAttribute("res","修改成功");
}else{
request.setAttribute("res","修改失败");
}
request.getRequestDispatcher("QueryAllStudents").forward(request,response);
}
}
前端代码
前端代码没有改动,这里就不贴了.
JavaWeb学习之三层架构实例(三)的更多相关文章
- JavaWeb学习之三层架构实例(二)
引言 这个实例是上一个实例JavaWeb学习 三层架构实例(一)的加强版,实现的是在前端对数据库中student表的 增.删.改.查 操作.关于三层组成云云,这里就不再叙述. 实例 效果图 先来看一下 ...
- java:Session(概述,三层架构实例(实现接口封装JDBC),Session实现简单购物车实例)
1.Session概述: Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存 ...
- C# 学习笔记 三层架构系列(控件一)
下面是我两周的学习总结:这是我写给自己的,如果哪位朋友有幸看到这篇文章就是缘分.如果所说的内容不对,就请纠正.勿喷!!! 想要将两周的学习知识通过文字.通过代码.通过图片储备起来,以防自己那天思维短路 ...
- C# 使用三层架构实例演示-winForm 窗体登录功能
---------------------------------------------------------------------------------------------------华 ...
- Java学习笔记——三层架构
Layer: UI层: user interface 用户接口层 Biz层: service business login layer 业务逻辑层 DAO层: Date Access Obje ...
- 三层架构实例 VB.NET版
三层实例 首先发现感慨,对于三成这块,用到都是一些面向对象的特征,尤其是对象的实例化.如果你不是很注意的话,那么,你就会一头雾水,就像我一样,慢慢的雾里看花,最后也是走出来的,不过用的事件是相当的. ...
- C#三层架构实例
对于三层的概念查也查了,看也看了,下面是我找的一个关于三层的简单实例,真正看一下它是如何具体实现的. 我们先来一起看看 实体类-Model 实质:实体类就是在完成数据库与实体类对应的功能,一个类是一张 ...
- SSH框架整合实现Java三层架构实例(一)
HTML前台发送请求代码: <tr> <td>选择收派时间</td> <td> <input type="text" name ...
- javaweb学习总结(六)——Servlet开发(三) 常见问题疑问
[1]response.getWriter().write()与out.print()的区别http://blog.csdn.net/javaloveiphone/article/details/81 ...
随机推荐
- MySQL学习笔记:timediff、timestampdiff、datediff
一.时间差函数:timestampdiff 语法:timestampdiff(interval, datetime1,datetime2) 结果:返回(时间2-时间1)的时间差,结果单位由interv ...
- 如何解决 kubernetes 重启后,启来不来的问题
参考了 https://blog.csdn.net/nklinsirui/article/details/80855415 最近在调研 kubeneter ,准备把线上的服务器架构再调整下,然后模拟各 ...
- powershell 激活WIN10
1.以win10专业版为例,鼠标右键点击开始图标,选择[windows powershell(管理员)],或者命令提示符管理员:2.打开命令窗口,复制这个命令slmgr /ipk W269N-WFGW ...
- UWP WebView 禁用缩放
只要加入一行 css 样式就行了 html, body { -ms-content-zooming:none; } MSDN:https://msdn.microsoft.com/library/ ...
- spark DataFrame
DataFrame的推出,让Spark具备了处理大规模结构化数据的能力,不仅比原有的RDD转化方式更加简单易用,而且获得了更高的计算性能.Spark能够轻松实现从MySQL到DataFrame的转化, ...
- CodeForces 286E Ladies' Shop 多项式 FFT
原文链接http://www.cnblogs.com/zhouzhendong/p/8781889.html 题目传送门 - CodeForces 286E 题意 首先,给你$n$个数(并告诉你$m$ ...
- Stock Chase 拓扑
题意 给出n个公司 m条信息 当某条信息构成环了 则这条信息是错误的 统计有多少个信息是错误的 这题是一条一条读入 虽然分在拓扑排序类里面 但是不会用拓扑排序来做 可以用floyd思想来做 如果 ...
- 业务线--node中间层做一个透传的项目
1,node中间层总结 1,ejs引入vue的js,路由层(直接透传,自定义行的),比较浅层的一层 中间件的引入 ? ) { // 与rd约定,接口成功返回code===0,其余为失败 console ...
- BZOJ-9-3295: [Cqoi2011]动态逆序对
题意:N个数的排列,M次操作,每次求当前的逆序对数量并删掉一个数 思路 :动态说的很到位.hiahia ... 最初一直没想明白为什么 大佬的cdq 中统计了两次. 先定义 给出的删除的点的 t 值依 ...
- Django与supervisor 管理进程
1.前言 在Django项目中,我们需要用到一些独立于Django框架外的脚本.这样一些脚本可能需要独立的持续运行,且具有很强的可维护性,这个时候supervisor就可以排上用场了. 基于pytho ...