复利计算器(3)——数据库
由于这星期我生病请假回家,所以没办法和我的同伴进行结对开发,而我只在自己做的项目上完善前端数据校验还有数据库存储,由于在用hibernate进行开发时候被卡住了,问题一直解决不了,所以任务并不能如期完成,所以该篇博客待完善!
一、要求
即要追求利益,又要面对不可预知的金融投资风险, “不能把鸡蛋放在同一个篮子里”,所以有必要进行组合投资。
通过上述计算与对比,可以帮助客户进行投资决策。
客户:那么能否帮我记录下一笔一笔不同类型的投资,并动态显示资金现值呢?
二、完善数据校验
1.实现过程及问题
一开始前端数据校验准备用ascii码值进行校验,用了onblue()、onclick()等js方法,但是总是会出现各种各样的问题,这种校验方式非常麻烦,比如限制只能输入数字且只能输入小数点后两位 ,代码如下(改代码只能限制输入数字,但是不能限制保留几位小数)
function only_Point_zhengNumber() { if (!((event.keyCode >= 48 && event.keyCode <= 57) || event.keyCode == 46||event.keyCode ==8)) { alert("请输入正整数"); $("#year").val(""); event.returnValue = false; } }
最后决定用正则表达式,需要的时候直接到网上去找,而且能同时实现多种限制,点击“计算”,如果不符合要就就会弹出提示框,代码如下(其他的功能实现相似,不一一列举)
//计算本金 function onBenjin() { var r=/^(0\.(0[1-9]{1}|[1-9]\d?)|1(\.0{1,2})?)$/ //年利率:只能输入0-1的小数,保留小数后两位 var t=/^-?\d+\.?\d{0,2}$/; //复利金额:只能输入两位小数 var s=/^[0-9]*[1-9][0-9]*$/;//年限:只能输入正整数 if($("#annualRate").val().trim()=="") { alert("请输入年利率,年利率不能为空!"); return false; } if(r.test(annualRate.value)!=true && $("#annualRate").val().trim()!="") { alert("请在年利率输入框输入0-1(保留两位小数)!"); return false; } if($("#year").val().trim()=="") { alert("请输入年限,年限不能为空!"); return false; } if(s.test(year.value)!=true && $("#year").val().trim()!="") { alert("请在年限输入框输入正整数!"); return false; } if($("#compoundAmount").val().trim()=="") { alert("请输入复利金额,复利金额不能为空!"); return false; } if(t.test(compoundAmount.value)!=true&&$("#compoundAmount").val().trim()!="") { alert("请在复利金额输入框输入正数(保留两位小数)!"); return false; } $.ajax({ url:"<%=path%>/Calculator/Calculator2", data: {"a":1,"compoundAmount":$("#compoundAmount").val(),"year": $("#year").val(),"annualRate":$("#annualRate").val()}, success : function(data) { var data= eval_r('(' + data +')'); document.all.principal.disabled = true; $("#principal").val(data); } }); }
2.效果展示
年利率限制只能输入0.01-1.00的数值,所以当超过该数值,就会弹出提示框
三、存储数据库
1.设计数据库,如下图
2.实现过程以及问题:弄了一整天,数据总是存不进数据库,页面经常出现下面的问题,后来通过打断点,知道在映射文件出现了问题(细节问题)和hibernate的jar包出现问题
Data.hbm.xml映射表的小细节修改后以及导入新的hibernate的jar包,数据库就存入对应的数据
3.代码
action:
public void calculate() throws IOException { showDataModel s=new showDataModel(); showDataService Service=new showDataServiceImpl(); if(a!=null&&a.equals("1")) { principal= (Double.parseDouble(compoundAmount)/ (Math.pow((1 + Double.parseDouble(annualRate)), Double.parseDouble(year))))+""; PrintWriter writer = respond.getWriter(); writer.write(principal+""); System.out.println(principal); s.setInvestmentType("本金计算"); s.setRevenueType("存入本金"); s.setData(principal); Service.add(s); }
serviceImpl:
public void add(showDataModel s) { showDataDao dao=new showDataDao(); dao.save(s); }
model:
package com.test.model; public class showDataModel { private long id;//自增id号 private String investmentType;//投资类型 private String revenueType;//收益类型 private String data;//计算结果 public long getId() { return id; } public void setId(long id) { this.id = id; } public String getInvestmentType() { return investmentType; } public void setInvestmentType(String investmentType) { this.investmentType = investmentType; } public String getRevenueType() { return revenueType; } public void setRevenueType(String revenueType) { this.revenueType = revenueType; } public String getData() { return data; } public void setData(String data) { this.data = data; } }
dao:
public class showDataDao { public void save(showDataModel s) { Configuration configuration=new Configuration().configure();//单例,管理配置文件 SessionFactory factory=configuration.buildSessionFactory(); Session session=factory.openSession();//session是客户端请求的服务 单例(暂时理解为connection) //开启事务 Transaction transaction=session.beginTransaction(); session.save(s); //提交事务 transaction.commit(); session.close(); } }
Data.hbm.xml映射表
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.test.model.showDataModel" table="t_showdata"> <id name="id" column="f_id" type="long"> <generator class="increment"/> </id> <property name="investmentType" column="f_investment_type" /> <property name="revenueType" column="f_revenue_type"/> <property name="data" column="f_data"/> </class> </hibernate-mapping>
四、显示数据表
1.实现过程及问题
问题一:该功能主要是显示之前做过的操作的对应数据存储,通过异步请求初始化界面,将数据库的数据显示出来,但是在实现该功能的时候页面显示json数据乱码,百度之后只需要在后台将编码改为UTF-8就可以
respond.setContentType("text/html;charset=UTF-8");
问题二:点击“计算”后,数据库里已经更新数据,但是页面上动态显示的还是更新前的数据,只有刷新一次后才显示出新数据。(待解决)
问题三:点击删除,弹出提示框,用异步请求删除并且刷新页面(待解决)
2.效果显示
3.代码
respond.setContentType("text/html;charset=UTF-8");
五、总结
1.分工
这次由于我生病请假回家一个多星期,沟通不方便,连累了小伙伴,所以这次结对子只能暂时各自做各自的,只能下次再合作,所以也就没有合作时的照片
小伙伴的博客地址:http://www.cnblogs.com/liangzhilin/p/5359581.html
2.用时
预计用时:12小时
实践用时:10小时
3.心得
由于自己只是刚刚学hibernate,想用这个项目来练下手,自己的不熟练以及粗心导致花了比较多的时间,但是功能还未完善,有时候觉得别人一两句话能解决的问题,到我这里来就是要花很多的时间而且未必能解决,自己花的时间总是别人的两倍,但是心急吃不了热豆腐,只有自己不断的训练才能往上爬。
还有一点,就是觉得自己的在写js代码重复的太多,但是又找不出其他的能优化js代码的方法,待这个小项目做完之后,请教下老师或者其他大神自己写的代码需要在哪里优化...