项目总结

来源:互联网 发布:windows xp嵌入式系统 编辑:程序博客网 时间:2024/05/13 05:51

前言:其实终究还是把一个简单的词,看的太高贵了,以至于有时候不敢看现实。所谓项目,可以感受为学生时代的大作业,抑或更高端一点儿的理解。

总之,越来越多美妙的词语,都只寻在书本的文字里.......(其实软件开发,有一些想法,完整的规划,比较适合扩展的框架,之后就是出原型,调试,完善,维护,重新发布........最终放弃这一软件,找新的灵感)


【开发系统】点餐软件

【开发环境】 Java+Oracle,UI为Java Swing,你懂的,不过还是佩服做界面的队友,我觉得可以了做成的样子,等结束时再完整贴图。

【设计思路】之前在学校做Java web的类淘宝购物网站的时候,做的时间太长,而且还是边学边做,没有个整体的规划和设计,代码框架也有点儿胡乱堆积的感觉。于是在动工之前思索了很多,上网百度了好多关于MVC(目前主流的方式:模型(model)-视图(view)-控制器(controller)),但是对于其主体思路,如何布局代码,完成接口式的编程还是完全处于感悟之中.......

【底层】数据库处理方面运用Dao模式,设计接口,Java Beans(也就是封装对应的表列,再提供一些getter,setter方法)

【中间层】可以成为服务层,Service层,我的想法是处理中间的业务逻辑,之前一直不明白service层到底要做什么,感觉在界面处理部分直接把数据查出来就可以用了,基于我目前的理解,Service层处理中间的业务逻辑,比如点餐时候我们让VIP用户注册后登陆,guest用户默认登陆,这个登陆校验部分就可以放到这里来做,从Dao拿来用户表的信息,从UI层拿来用户输入的密码和用户名,将校验后的结果返回去。[Ps:这一层只需要留好接口就应该可以了]

【UI界面层】让用户体验友好一点,图片的拟物化展示,流程的操作指导,UI的美观等等,总之就是你让使用者爽到爆,就不得不靠UI这个层次的设计,脸很重要,功能再好,硬件再牛,不帅气,那得几人怜.......这一层用户会与界面交互,点菜,注册,登陆,查看菜单,付款......这些业务上的数据还是要传入下面,最终写入数据库记录,同时又要展示数据库的数据信息。但是却直接看不到底层Dao的操作实现,一层层的往下传,一层层的往上传。

【分层、留接口】总之就是体验一下想分层设计的思路,和做软件的感受,同时又不得不考虑让很多人去编程,leader也不是那么容易(虽然在这里感觉有点儿不是真实的),假如让所有人都负责数据库,从上至下一套做完,感觉最后整合的时候好麻烦的,业务之间的关联总感觉不爽的。。

功能分析图示如下:


下面记录一下遇到的问题总结:

【1】

Sql语句最好这样写

String sql = "select * from consumer where name=?";

作为占位符,之后通过

PreparedStatement ps = conn.prepareStatement(sql);

ps.setString(1, name);【这里的1就是第几个?

将参数设置进去,避免出现双引号,引号交叉的混乱,

可能导致报出ORA-00904:XXX:标识符无效。的错误,

【2】

数据库oracle版本,jdk版本,用于jdbc连接的jar包版本,三者最好统一,否则会出现ORA-01461:can bind a LONG value only for insert into a LONG column

其实jar包完全可以再oracle安装包里找到,

路径为:D:\app\Kay\product\11.1.0\db_1\jdbc\lib

【3】

用序列处理id自增问题时,对于要保存最新插入的id(比如当前新注册用户的id),可以运用下列语句

String last = "select consumeridseq.currval from dual";【consumeridseq是一个序列名】

可以在执行完insert语句之后,连接关闭之前

ps = conn.prepareStatement(last);/* 【注意:ps要重新加载新的sql语句】 */

ResultSet rs = ps.executeQuery();

while (rs.next()) {

SessionData.CurrentConsumerId = rs.getInt(1);SessionData.CurrentConsumerId为一个公有的static变量】

}

【这是因为】

/* 在同一个连接回话过程里,oracle的数据资源为线程独占,所以此时的currval就是你刚刚执行插入操作的序列值 */

/*----------------------------------------------------------------------------------------------*/

Ps:也可以查询id号最大的数据行,也是一样可以的

 如:select  max(consumerid) from consumer;

4

当数据库经过测试后,是比较凌乱的,要删除一些重复无用的测试时插入的数据

【删除重复的记录,id列自增,且其他列完全相同,只保留id最小的那条记录】

SQL> delete from consumer where  consumerid not in(select min(consumerid) from con

sumer group by name);

【备注:如何复制dos下的文本内容

dos命令行窗口内,点击右键->标记->鼠标以拖拽方式选中要复制的内容(选定后的内容会以反色显示)->(下面注意了,不要点鼠标,不要乱动键盘)回车。好了,已经复制完成。
另外有办法让操作更简单:
鼠标右键单击dos窗口的标题栏(在窗口最上面),单击属性,选中快速编辑模式,确定后,你就可以随便选内容了,然后直接回车就实现复制!


5】
Java sql语句的批处理,比如要向订单中插入一系列数据时候,再想以往那样一个一个的insert一次执行一条,感觉起
来有点儿智商着急的样子。。

conn.setAutoCommit(false); // 不自动提交,貌似不设置也可以/* sql语句 */String sql = "insert into orders_dish values (orders_dishidseq.nextval,?,?,?)";ps = conn.prepareStatement(sql);/* 这一句一定要放到外面,擦..... */for (Orders_Dish orders_Dish : orders_Dishs) {ps.setInt(1, orders_Dish.getOrderId());/* 设置菜单号 */ps.setInt(2, orders_Dish.getDishId());/* 设置菜号 */ps.setInt(3, orders_Dish.getDishNum());ps.addBatch();}/* 执行sql语句 */cou = ps.executeBatch();conn.commit();


返回的参数是对每一条insert语句的影响行数,可以知道哪次执行有误。。。


【6】
关于数据库图片的存储,虽然说网上搜了一堆说oracle可以用blob去存储的,最终可以变成二进制数据,但是最后还是
考虑了只存储图片的名字,到时候将图片放到tomact做的服务器上,这样数据库存储的数据量减少了很多,只需要
varchar2(100),应该就能保存图片名字了。界面上展示的时候用类似如下的方式
public static  final String picturePath = "http://192.168.40.233/o/images/";【不可改变,除非换了服务器ip之类】
之后再使用时里就可以picturePath+imageName去显示

7


错误最后竟然是

磁盘空间不足.......同时我也开了日志归档,当有大量的插入、删除时会频繁更新

还是要查找alert_orcl.log警告日志,里面有记录的。。。

另外一点就是我把oraclememory_target调整的太小了仅剩300M,而且调整的时候还是用下面语句:

alter system set memory_target=300M scope=both;

结构导致重启之后memory_max_target也是300M,SGA一下子小的够呛。。。

如想调大,可做如下修改:

start nomount状态下

SQL> alter system set memory_max_target=600M scope=spfile;

然后shutdownstartup

就可以调整memory_target的大小

alter system set memory_target=600M scope=both;


【8】
数据库要及时备份啊,昨天下午数据库一崩溃,整个人都心碎了。还好我之前把数据都备份了,恢复了08.24备份数据。。
以下操作均是在cmd下或者shell
【第一步】
从数据库orcl,
用zkj/zkj账户将zkj用户下的所有数据导出
命令如下:
exp zkj/zkj@orcl owner=zkj file=d:\\data.dmp log=data.log;
【说明】
exp 用户名/密码@数据库名 owner=用户名 file=文件名;
【第二步】
创建用户fanpeng/fanpeng,并赋予权限
imp fanpeng/fanpeng@orcl file=d:\\data.dmp fromuser=zkj touser=fanpeng ignore=y;
【Ps:还好没有耽搁项目提交。。。。。。3KS】

最后上图展示一下界面

【登陆或成功注册之后】

【点击订外卖之后】



【选菜提示】



【订单查看】

【右侧购物车】


【支付】


【源码和PPT连接下载,release1.1是完成作品】

点击打开链接


【最后总结---也是最要学习的一点:如何分配项目任务】

分配任务的方式
分配任务一般是两种方式,按照任务类型分配、按照业务分配
按照类别:
好处是某人固定负责这一类的工作,由于是一类固定的工作所以熟练度肯定越来越高,于是干活的速度也会越来越快。缺点是这个人只负责自己这一块儿的东西不能保证一个业务流程整体逻辑上的正确性
按照业务:
好处是某个业务中的逻辑性能够得到有效保证。缺点是但是由于一个人往往要负责多个技术难点所以开发效率自然就会相应的慢一些。
两种方式各有利弊具体采用哪种方式(或两种方式相结合)需要根据具体的项目来看,如果项目或者某个模块儿对业务逻辑要求比较高那么最好将任务分配给个人;如果项目中对业务逻辑没有过多的要求而是各个技术独立分明则最好将一类的技术配给一个或几个人。

【PS:谨记谨记~~】

原创粉丝点击