上一篇将JDBC完成之后,如果要做一个完整的项目,需要在这个基础上进行分包。

分包的意义在于将各个人的功能分开,程序运行更便利。

  • l view层作用: 视图层,即项目中的界面
  • l controller层作用: 控制层, 获取界面上的数据,为界面设置数据; 将要实现的功能交给业务层处理
  • l service层作用: 业务层, 功能的实现, 与controller控制层和数据访问层DAO交互, 将对数据库的操作交给DAO数据访问层来处理
  • l dao层作用: 数据访问层, 用来操作数据库表的数据
  • l db数据库: 这里指MySQL
  • l domain 实体包: 存放JavaBean
  • l tools工具包:存放项目中使用到的工具类
  • l test 测试包: 存放项目功能测试的代码

  

java 分模块项目好吗 java项目分包_数据库

每层的项目分部

view菜单层

java 分模块项目好吗 java项目分包_结果集_02

domian 实体类

java 分模块项目好吗 java项目分包_数据库_03

controller 中转层

java 分模块项目好吗 java项目分包_sql_04

service 获取dao层数据

java 分模块项目好吗 java项目分包_数据库_05

dao层,数据库层

java 分模块项目好吗 java项目分包_java 分模块项目好吗_06

tools工具类层

java 分模块项目好吗 java项目分包_java 分模块项目好吗_07

test测试类

java 分模块项目好吗 java项目分包_java 分模块项目好吗_08

主要实现功能

java 分模块项目好吗 java项目分包_数据库_09

java 分模块项目好吗 java项目分包_sql_10

java 分模块项目好吗 java项目分包_结果集_11

java 分模块项目好吗 java项目分包_sql_12

java 分模块项目好吗 java项目分包_java 分模块项目好吗_13

这是主要功能,代码因为过于多久不复制粘贴,主要是总结一下知识难点和一问题,还有一些容易混淆的地方

知识难点:

1、如果连续更新数据,如果只是单纯的方法联合并不需要,但结合现实我们发现,如果在修改某个数据时,往往是联合修改的。这就颠覆了最初的逻辑,后来解决这个的办法是采用了全局变量定义,局部变量在方法中定义,从而作为形参传入后续的方法中。如费用更新时的身份证,输入的费用:

java 分模块项目好吗 java项目分包_java 分模块项目好吗_14

java 分模块项目好吗 java项目分包_sql_15

变量赋值:之后获得了某个人的身份证和费用数,从而使后面的个人信息表中的个人总金额累加+费用标记结清

java 分模块项目好吗 java项目分包_sql_16

java 分模块项目好吗 java项目分包_数据库_17

第二是中间表的作用,它就是两表之间的关系,如一个员工对应两个房间,你无法在房间表或员工表进行一个多条重新信息录入,这违反了我设计表时一个人对应一条信息的原则。

那它们之间如何练习起来,就用到中间表,将两表的主键放入,将关系存储在中间表,从而如果需要查询两表通过它联合即可。

中间表:

java 分模块项目好吗 java项目分包_java 分模块项目好吗_18

房间表:

 

java 分模块项目好吗 java项目分包_java 分模块项目好吗_19

员工表:

java 分模块项目好吗 java项目分包_sql_20

语句如何查询:

java 分模块项目好吗 java项目分包_数据库_21

二、容易混淆的地方

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;
            }