上一篇将JDBC完成之后,如果要做一个完整的项目,需要在这个基础上进行分包。
分包的意义在于将各个人的功能分开,程序运行更便利。
- l view层作用: 视图层,即项目中的界面
- l controller层作用: 控制层, 获取界面上的数据,为界面设置数据; 将要实现的功能交给业务层处理
- l service层作用: 业务层, 功能的实现, 与controller控制层和数据访问层DAO交互, 将对数据库的操作交给DAO数据访问层来处理
- l dao层作用: 数据访问层, 用来操作数据库表的数据
- l db数据库: 这里指MySQL
- l domain 实体包: 存放JavaBean
- l tools工具包:存放项目中使用到的工具类
- l test 测试包: 存放项目功能测试的代码
每层的项目分部
view菜单层
domian 实体类
controller 中转层
service 获取dao层数据
dao层,数据库层
tools工具类层
test测试类
主要实现功能
这是主要功能,代码因为过于多久不复制粘贴,主要是总结一下知识难点和一问题,还有一些容易混淆的地方
知识难点:
1、如果连续更新数据,如果只是单纯的方法联合并不需要,但结合现实我们发现,如果在修改某个数据时,往往是联合修改的。这就颠覆了最初的逻辑,后来解决这个的办法是采用了全局变量定义,局部变量在方法中定义,从而作为形参传入后续的方法中。如费用更新时的身份证,输入的费用:
变量赋值:之后获得了某个人的身份证和费用数,从而使后面的个人信息表中的个人总金额累加+费用标记结清
第二是中间表的作用,它就是两表之间的关系,如一个员工对应两个房间,你无法在房间表或员工表进行一个多条重新信息录入,这违反了我设计表时一个人对应一条信息的原则。
那它们之间如何练习起来,就用到中间表,将两表的主键放入,将关系存储在中间表,从而如果需要查询两表通过它联合即可。
中间表:
房间表:
员工表:
语句如何查询:
二、容易混淆的地方
dao层的几种处理结果集。
我用到的处理结果集,若是查询,需要便利遍历数据库中的所有内容来输出。其中分为,方法的修饰符区别,如果有返回值类型,需要对它进行赋值遍历。
//年报表 方法重载
public List< cost> getBaobiao(int year ) throws SQLException{
//获得连接对象
Connection conn=JDBCUtils.getConn();
//数据库语句
String sql="SELECT username,cost.`room_num`,cost.usercard,SUM(cost) "
+ "FROM cost JOIN userinfo ON cost.`usercard`=userinfo.`usercard` "
+ "WHERE TIME LIKE ? GROUP BY usercard";
PreparedStatement pst=conn.prepareStatement(sql);
//运行结果集
pst.setString(1, "%"+year+"%");
ResultSet rs=pst.executeQuery();
//处理结果集
List<cost> list=new ArrayList<cost>();
while(rs.next()){
cost cost=new cost();
cost.setUsername(rs.getString("username"));//把数据库的username的值给cost里面的值
cost.setUsercard(rs.getString("usercard"));
cost.setRoom_num(rs.getInt("room_num"));
cost.setCost(rs.getDouble("sum(cost)"));
list.add(cost);//最后是将封装了四个字段的cost实体类添加到list集合中,泛型。
}
//System.out.println(list);
//释放资源
JDBCUtils.close(rs, pst, conn);
//返回一个list集合给前台
return list ;
增加修改,删除通过int值来判定是否成功,1成功,0失败。
//新增cost表中数据
public int addCost(UserInfo userinfo) throws SQLException{
Connection conn=JDBCUtils.getConn();
String sql="insert into cost(time,room_num,usercard,cost) values (?,?,?,?)";
PreparedStatement pst=conn.prepareStatement(sql);
//占位符赋值
pst.setString(1, userinfo.getStarttime());
pst.setInt(2, userinfo.getRoom_num());
pst.setString(3, userinfo.getUsercard());
pst.setDouble(4, userinfo.getCost());
//执行sql
int row=pst.executeUpdate();
//释放资源
JDBCUtils.close(pst, conn);
return row;
}
但有时有例外就是判断查询的内容有没有。
如我想查询所有未审批的有几条信息,但是如果单纯返回的我获得的是整个遍历出来的东西,那就需要定义一个int来接收一下,while()中总共走了几次满足数据库代码的次数,统计出来就是几条未读信息。
//统计未审批的数量
public int getBoss( ) throws SQLException{
Connection conn=JDBCUtils.getConn();
String sql="SELECT count(*) FROM jilu WHERE shenpi='0' and dengji='A'";
PreparedStatement pst=conn.prepareStatement(sql);
//pst.setInt(1, shenpi);
ResultSet rs=pst.executeQuery();
int count = 0;
while (rs.next()) {
count = rs.getInt(1);
}
JDBCUtils.close(rs, pst, conn);
return count;
}