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 ...
随机推荐
- 爬虫框架 Scrapy
一 介绍 crapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可用 ...
- 数据库备份和还原(固定IP版)
使用方法: 1.首次使用双击export.bat进行备份数据库:2.以后每次使用双击setup.bat进行还原数据库: 备注:如果数据库内容有变,需要重新执行export.bat进行备份数据库. ex ...
- CodeForces - 833B The Bakery
题解: 线段树经典应用 首先暴力$f[i][j]$表示考虑前i位分成j段的最大值 转移$f[k][j-1]+cost(k+1,i)$枚举k转移 不同数的经典套路就是从它到它前驱这一段 于是维护每个数前 ...
- skywalking6.0.0安装配置(windows),以mysql作为储存。
下载skywalking6.0.0http://skywalking.apache.org/downloads/ 下载jdk8https://www.oracle.com/technetwork/ja ...
- [转自大神]js拖拽小总结
https://blog.csdn.net/u013040887/article/details/83059094 权侵删 这里写的是一个原生js实现拖拽的效果,首先: 1.实现拖拽的三大事件,是要首 ...
- h5怎么做分享到QQ 、朋友圈、微信 、微博等功能
微信已经成为我们日常聊天联系基本的必备工具,所以小菜我首先介绍一下如何调用微信的分享功能.其实除了可以在微信上分享到朋友圈和发送给好友,微信的分享接口还提供了分享到QQ和分享到腾讯微博等,就是在页面的 ...
- 识别拖动与点击操作之zepto的bug
问题描述:给页面<a>标签绑定了tap事件,在移动设备上点击按钮貌似一切正常,可以响应.但是,把页面上下滑动几次之后,或者在滑动时手指滑动出移动屏幕之外,之后再点击按钮,就会发现第一次点击 ...
- linux中python3安装和使用
python安装 下载python安装包和依赖环境 #自由选择python3源码包的版本https://www.python.org/ftp/python/https://www.python.org ...
- (Android UI)Android应用程序中资源:图片、字符串、颜色、布局等
Android系统设计采用代码和布局分离的设计模式,因此在设计Android应用程序时需要遵循该设计模式. “把非代码资源(如图片和字符串常量)和代码分离开来始终是一种很好的做法.”---<An ...
- 关于Android文件Apk下载的那点事
1.Android文件Apk下载变ZIP压缩包解决方案 如果你的下载服务器为Nginx服务器,那么,在Nginx安装目录下的conf/mime.types文件的对应位置,加上以下一行语句,指定APK文 ...