简单的食堂消费系统(sqlserver+servlet+jsp+dao)
上班后,来了这样一个任务:需要将公司数据库中食堂的消费信息,在网页上按部门呈现来,不在需要到数据库中通过写SQL语句进行查询。(上学时不好好学习,几乎算是一片白纸,许多是通过不断试BUG、百度做出来的。如果有现在还在学习同学,请务必好好学习,代码虽然枯燥,但是也是最最真实的存在,对就是对,错就是错。)
好了,废话不多说了,直接开始。
在此感谢落尘曦大神的参考资料。这是链接https://blog.csdn.net/qq_23994787/article/details/73612870
本案例使用Servlet+jsp制作,编写工具是IDEA+sqlserver数据库。下面是详细的过程与一部分知识点。
使用到的知识点:
1、JDBC
2、Servlet
3、过滤器
4、EL与JSTL表达式
一、整体思路
我在最开始写这个系统时,可以说是完全没有思路的。一开始就是一直在网上找资料,准备下载别人已经写好的系统,学习一下,然后改改数据库与页面代码,就可以了。当我最后写完后,才发现一个好的思路对于整个系统的编写多么重要。(想要什么样的结果—>得到这个结果需要获取到什么样的数据—>得到这个数据,我们需要提前准备好什么样的数据。大致就是这样,一层一层去逆推,最后获得想要的结果。)
本系统的思路如下:首先要有数据库来存储数据,再要写实体类来实例数据,再要写dao层来对数据进行增删改查。然后就是页面部分,要将通过dao层得到的数据传入页面,就需要用servlet从页面获取数据库查询条件,传递给dao,然后将dao的结果集传输给页面。
1、编写数据库部分代码
这个部分较为简单,不展开
2、编写实体类部分代码
一般做系统,数据库部分是自己设计的,所以将你所用到的数据库表在实体类中get、set出来,备用即可。
我在做系统时,数据库已经存在,所以这里是我遇到的第一个难题。我一共用到了4个表,而且只是取得每个表中的一部分数据作为最后的结果集,此时我将所有用到的表格中的每一个字段get、set出来,然后将最后的结果集单独做了一个实体类。
3、编写dao层部分代码
这里采用了分层结构,有些同学会问,我就是分不清这些层次有什么用,我可不可不用?当然可以,但是,你的代码不用这种分层结构,会让人看着很难受,而且使用dao层是为了规范开发(吐槽一下,之前看过有些人写的系统代码,乱七八糟,一份好的代码对于学习很重要,这里请同学们学习一下阿里出的《阿里巴巴java开发手册》,免费的文档,希望大家有所帮助)。
采用dao层,实现数据操作的接口。然后使用daoImpl,实现dao层的操作。dao层主要就是对数据库进行增删改查。
4、编写网页部分代码
网页部分也不赘述,就是你想做成什么页面。能力高的做的好看一些,用上css、js等,也可以做的很简单,就是最后的一个表格呈现数据即可。具体用到的EL与JSTL表达式在后面讲述。
4、编写Servlet部分代码
通过整体思路部分就知道,servlet其实起到的是一个传递功能。将页面请求传递到dao,将dao的结果集传递回页面。
5、编写过滤器部分代码
经常有同学页面结果明明是对的,但是就是各种乱码,这里通过过滤器一并解决。
二、代码
项目的目录结构
1、数据库创建代码
这部分略,这部分实在是没啥好说的,要是有同学不太会,可以先学习一下数据库方面知识。
数据库连接代码DBconn.java
package Util;
import java.sql.*;
public class DBconn {
static String url = "jdbc:sqlserver://数据库名;databaseName=表名";
static String username = "数据库登录名";
static String password = "数据库密码";
static Connection conn = null;
static ResultSet rs = null;
static PreparedStatement ps = null;
public static void init() {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn = DriverManager.getConnection(url,username,password);
}catch (Exception e) {
System.out.println("init [SQL驱动程序初始化失败!]");
e.printStackTrace();
}
}
public static ResultSet selectSql(String sql) {
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
} catch (SQLException e) {
System.out.println("sql数据库查询异常");
e.printStackTrace();
}
return rs;
}
public static void closeConn(){
try {
conn.close();
} catch (SQLException e) {
System.out.println("sql数据库关闭异常");
e.printStackTrace();
}
}
}
2、实体类代码
新建实体类Consume.java
package Model;
public class Consume {
private String cost_DateTime;
private String cost_GroupName;
private String cost_ItemName;
private int cost_Times;
public String getCost_DateTime() {
return cost_DateTime;
}
public void setCost_DateTime(String cost_DateTime) {
this.cost_DateTime = cost_DateTime;
}
public String getCost_GroupName() {
return cost_GroupName;
}
public void setCost_GroupName(String cost_GroupName) {
this.cost_GroupName = cost_GroupName;
}
public String getCost_ItemName() {
return cost_ItemName;
}
public void setCost_ItemName(String cost_ItemName) {
this.cost_ItemName = cost_ItemName;
}
public int getCost_Times() {
return cost_Times;
}
public void setCost_Times(int cost_Times) {
this.cost_Times = cost_Times;
}
}
这是最后需要的结果的实体类,相比于之前的版本,增加到了四个字段,一个消费时间,一个部门名称,一个餐次(早餐中餐晚餐),一个该部门消费次数。根据自己的情况,将这几个字段替换即可。
3、dao类代码
新建接口类ConsumeDao.java
package Dao;
import Model.Consume;
import java.util.List;
public interface ConsumeDao {
public List<Consume> getConsumeAll(String[] department,String year,String month);
}
因为我这个项目只需要查数据,所以增删改步骤没有,其实学会了查,增删改也就是依样画葫芦了。这里我传入的字段是从页面获取到的部门、月份、就餐时间,换成自己需要从界面获取到的数据即可。
这里仅仅是接口,继续在同一个目录下新建接口实现类ConsumeDaoImpl.java
package Dao;
import Model.Consume;
import Util.DBconn;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class ConsumeDaoImpl implements ConsumeDao{
public List<Consume> getConsumeAll(String[] department,String year,String month) {
//StringBuffer base_GroupID = new StringBuffer();
//for(int i = 0; i < department.length; i++){
// base_GroupID.append(department[i]);
//}
System.out.println("department: " + department);
System.out.println("year: " + year);
System.out.println("month: " + month);
List<Consume> list = new ArrayList<Consume>();
try {
DBconn.init(