复利计算器(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代码的方法,待这个小项目做完之后,请教下老师或者其他大神自己写的代码需要在哪里优化...

原文地址:https://www.cnblogs.com/jackeicao/p/5359945.html