首先了解首先需要有哪些数据组成。
需要与数据库中的数据进行同步,需要在数据库中查询到历史年化收益率、平台用户数、累计成交额的信息,并将其显示到页面中。
然后是较为复杂一点的查询,并不单单是一个数据,而是一类产品所具有的信息,这其中包含了新手宝、优选类、散标类这三类产品。
历史年化收益率、产品类型是从p2p数据库中的b_loan_info(金融产品信息表)中得到的。
平台总人数是从u_user(用户表)中,可根据注册用户id数得到。
平台累计成交额是从b_bid_info(投资信息表)中,根据投标金额所得到。
handler的定义
在web项目中新建一个类IndexHandler的类,用于定义处理器。
我们采用自上而下的开发方式,从顶层所需的具体功能开始定义,中间缺少的什么类、方法先不要管,可以先定义后创建,缺少什么创建什么,一点一点完善目标功能。
处理器定义完毕之后先把大致需要完成的功能构思出来。
package com.yanchuanyi.p2p.web.handler;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class IndexHandler {@RequestMapping("/index.do") //从l文件中注册的中央调度器规定的*.do为后缀public String indexHandler(Model model){//查询新手宝产品(产品类型:0,页面大小:1),并将其存放到Model中//查询优选类产品(产品类型:1,页面大小:4),并将其存放到Model中//查询散标类产品(产品类型:2,页面大小:8),并将其存放到Model中//查询平台历史年化收益率//查询平台总人数//查询平台总成交额return "/index.jsp";}
}
这是一个大致的功能需求思路,需要查询到的数据,这些数据来源于金融产品信息表、投资信息表、用户表,这三个表。根据三层架构的思路,view层的数据来源自service层,所以,我们需要定义这三个表对应的service层。
可以先在indexHandler这个处理器类中定义出service层接口的名字及引用。
@Controller
public class IndexHandler {@Autowiredprivate ILoanInfoService loanInfoService;@Autowiredprivate IBidInfoService bidInfoService;@Autowiredprivate IUserService userService;@RequestMapping("/index.do") //从l文件中注册的中央调度器规定的*.do为后缀public String indexHandler(Model model){//查询新手宝产品(产品类型:0,页面大小:1),并将其存放到Model中//查询优选类产品(产品类型:1,页面大小:4),并将其存放到Model中//查询散标类产品(产品类型:2,页面大小:8),并将其存放到Model中//查询平台历史年化收益率//查询平台总人数//查询平台总成交额return "/index.jsp";}
}
然后对接口进行创建,将鼠标悬停在报红的地方,使用快捷键 Alt+Enter 自我修补快速创建出接口。
选择创建在exterface工程下的service的包下。这三个接口都是这样的创建方式。
创建过后
然后将功能代码编写一下,将鼠标悬停在报红的未定义的方法上,使用快捷键Alt+Enter快速创建方法。
@Controller
public class IndexHandler {@Autowiredprivate ILoanInfoService loanInfoService;@Autowiredprivate IBidInfoService bidInfoService;@Autowiredprivate IUserService userService;@RequestMapping("/index.do") //从l文件中注册的中央调度器规定的*.do为后缀public String indexHandler(Model model){//查询新手宝产品(产品类型:0,页面大小:1),并将其存放到Model中Map<String,Object> map = new HashMap<>();map.put("productType",0);map.put("pageSize",1);List<LoanInfo> xinLoanInfos = loanInfoService.findLoanInfoByProductTypeAndPage(map);model.addAttribute("xinLoanInfos",xinLoanInfos);//查询优选类产品(产品类型:1,页面大小:4),并将其存放到Model中map.put("productType",1);map.put("pageSize",4);List<LoanInfo> youLoanInfos = loanInfoService.findLoanInfoByProductTypeAndPage(map);model.addAttribute("xinLoanInfos",xinLoanInfos);//查询散标类产品(产品类型:2,页面大小:8),并将其存放到Model中map.put("productType",2);map.put("pageSize",8);List<LoanInfo> sanLoanInfos = loanInfoService.findLoanInfoByProductTypeAndPage(map);model.addAttribute("xinLoanInfos",xinLoanInfos);//查询平台历史年化收益率Double historyAvgRate = loanInfoService.findHistoryAvgRate();model.addAttribute("historyAvgRate",historyAvgRate);//查询平台总人数Long totalUserCount = userService.findTotalUserCount();model.addAttribute("totalUserCount",totalUserCount);//查询平台总成交额Double totalBidAmount = bidInfoService.findTotalBidAmount();model.addAttribute("totalBidAmount",totalBidAmount);return "/index.jsp";}
}
在web工程中的l文件中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""xmlns:xsi="" xmlns:dubbo=""xsi:schemaLocation=" .xsd .xsd"><dubbo:application name="web"/><!--注册zk注册中心--><dubbo:registry address="zookeeper://osZK:2181"/><dubbo:reference id="bidInfoService" check="false"interface="com.face.service.IBidInfoService"/><dubbo:reference id="loanInfoService" check="false"interface="com.face.service.ILoanInfoService"/><dubbo:reference id="userInfoService" check="false"interface="com.face.service.IUserService"/></beans>
在dataService项目中定义Service的实现类,并实现相对应的接口中的方法。
LoanInfoServiceImpl内容:
@Service
public class LoanInfoServiceImpl implements ILoanInfoService {@Autowiredprivate ILoanInfoDao loanInfoDao;@Overridepublic Double findHistoryAvgRate() {return loanInfoDao.selectHistoryAvgRate();}@Overridepublic List<LoanInfo> findLoanInfoByProductTypeAndPage(Map<String,Object> map) {return loanInfoDao.selectLoanInfoByProductTypeAndPage(map);}
}
BidInfoServiceImpl内容:
@Service
public class BidInfoServiceImpl implements IBidInfoService {@Autowiredprivate IBidInfoDao bidInfoDao;@Overridepublic Double findTotalBidAmount() {return bidInfoDao.selectTotalBidAmount();}
}
UserServiceImpl内容:
@Service
public class UserServiceImpl implements IUserService {@Autowiredprivate IUserDao userDao;@Overridepublic Long findTotalUserCount() {return userDao.selectTotalUserCount();}
}
在dataService工程中的l文件中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""xmlns:xsi="" xmlns:dubbo=""xsi:schemaLocation=" .xsd .xsd"><dubbo:application name="dataService"/><!--注册zk注册中心--><dubbo:registry address="zookeeper://osZk:2181"/><dubbo:service interface="com.face.service.ILoanInfoService"ref="loanInfoServiceImpl"/><dubbo:service interface="com.face.service.IBidInfoService"ref="bidInfoServiceImpl"/><dubbo:service interface="com.face.service.IUserService"ref="userServiceImpl"/>
</beans>
在ILoanInfoService、IBidInfoService、IUserService这三个接口的实现类中使用Redis做缓存。
先从Redis缓存中查询数据,若缓存中没有再从数据库中查询,面对复杂的数据时可大大提高查询效率。
需要使用Redis做缓存的是查询历史年化收益率、查询平台总用户人数、查询平台累计成交额。在实现过程中使用双重检测锁机制。
LoanInfoServiceImpl
@Service
public class LoanInfoServiceImpl implements ILoanInfoService {@Autowiredprivate RedisTemplate<Object,Object> redisTemplate;@Autowiredprivate ILoanInfoDao loanInfoDao;@Overridepublic Double findHistoryAvgRate() {//查询平均历史年化收益率//使用双重检测锁机制String key = "historyAvgRate";//指定key的值//实时性的数据由redisTemplate对象获取到BoundValueOprations对象,直接绑定key的值BoundValueOperations<Object, Object> ops = redisTemplate.boundValueOps(key);//获取指定key的值Object historyAvgRate = ();//判断是否为空if(historyAvgRate == null) {synchronized (this) {//再次检查是否为空historyAvgRate = ();if(historyAvgRate == null) {//如果为空则从数据库中查询historyAvgRate = loanInfoDao.selectHistoryAvgRate();//再将查询到的值存入redis缓存ops.set(historyAvgRate);}}}return (Double)historyAvgRate;}@Override//根据产品类型和页面大小查询产品信息public List<LoanInfo> findLoanInfoByProductTypeAndPage(Map<String,Object> map) {return loanInfoDao.selectLoanInfoByProductTypeAndPage(map);}
}
在定义缓存的key值的时候,由于使用的字符串,所以在拼写的时候会容易出错,因此,应该将所有缓存的key值都放在一个类中用作常量,之后在使用的时候直接调用就行,不用一次一次拼写了,防止出错。
定义在exterface工程中,命名为Constants。
package com.stants;public class Constants {/*** 声明redis缓存中存放的数据的key:历史年化平均收益率*/public static final String REDIS_KEY_HISTORY_AVG_RATE = "historyAvgRate";/*** 声明redis缓存中存放的数据的key:平台注册总人数*/public static final String REDIS_KEY_TOTAL_USER_COUNT = "totalUserCount";/*** 声明redis缓存中存放的数据的key:平台总交易额*/public static final String REDIS_KEY_TOTAL_BID_AMOUNT = "totalBidAmount";
}
BidInfoServiceImpl
@Service
public class BidInfoServiceImpl implements IBidInfoService {@Autowiredprivate IBidInfoDao bidInfoDao;@Autowiredprivate RedisTemplate<Object,Object> redisTemplate;@Overridepublic Double findTotalBidAmount() {//指定key的值//String key = "totalBidAmount";String key = Constants.REDIS_KEY_TOTAL_BID_AMOUNT;//实时性的数据由redisTemplate对象获取到BoundValueOprations对象,直接绑定key的值BoundValueOperations<Object, Object> ops = redisTemplate.boundValueOps(key);//获取指定key的值Object totalBidAmount = ();//判断是否为空if(totalBidAmount == null) {synchronized (this){totalBidAmount = ();//再次检查是否为空if(totalBidAmount == null) {//如果为空则从数据库中查询totalBidAmount = bidInfoDao.selectTotalBidAmount();//再将查询到的值存入redis缓存ops.set(totalBidAmount,1, TimeUnit.HOURS);}}}return (Double) totalBidAmount;}
}
UserServiceImpl
@Service
public class UserServiceImpl implements IUserService {@Autowiredprivate RedisTemplate<Object,Object> redisTemplate;@Autowiredprivate IUserDao userDao;@Overridepublic Long findTotalUserCount() {//String key = "totalUserCount";String key = Constants.REDIS_KEY_TOTAL_USER_COUNT;BoundValueOperations<Object, Object> ops = redisTemplate.boundValueOps(key);Object totalUserCount = ();if(totalUserCount == null) {synchronized (this) {totalUserCount = ();if(totalUserCount == null){totalUserCount = userDao.selectTotalUserCount();ops.set(totalUserCount);pire(1, TimeUnit.HOURS);}}}return (Long)totalUserCount;}
}
这里需要注意的是Mapper的动态代理:
1、namespace的值为映射文件对应Dao层的的全限定类名。
2、select标签中id属性的值为映射文件对应Dao层的方法名。
这个查询语句的结果是:平台累计成交额
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis//DTD Mapper 3.0//EN"".dtd">
<mapper namespace="com.yanchuanyi.p2p.dataService.dao.IBidInfoDao"><select id="selectTotalBidAmount" resultType="Double">select sum(bidMoney) from b_bid_info;</select></mapper>
这两个插叙语句的结果分别是:平均历史年化收益率、(新手宝/优选类/散标类)产品信息
其中在查询平均历史年化收益率时,cast()函数的作用是把一个字段转成另一个字段,Cast(字段名 as 转换的类型 );使用decimal类型的作用是将结果保留小数点后两位,decimal(总数据长度,小数点后的长度);
注意:
在使用select查询时,尽量不要使用select * ,会增加查询时间,所以,需要将查询的字段手动添加上去,字段多一点也不要怕麻烦。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis//DTD Mapper 3.0//EN"".dtd">
<mapper namespace="com.yanchuanyi.p2p.dataService.dao.ILoanInfoDao"><select id="selectHistoryAvgRate" resultType="double"> select cast(avg(rate) as decimal(5,2))from b_loan_info;</select><resultMap type="LoanInfo" id="loanInfoMap"><id column="id" property="id"/><result column="product_name" property="productName"/><result column="rate" property="rate"/><result column="cycle" property="cycle"/><result column="release_time" property="releaseTime"/><result column="product_type" property="productType"/><result column="product_no" property="productNo"/><result column="product_money" property="productMoney"/><result column="left_product_money" property="leftProductMoney"/><result column="bid_min_limit" property="bidMinLimit"/><result column="bid_max_limit" property="bidMaxLimit"/><result column="product_status" property="productStatus"/><result column="product_full_time" property="productFullTime"/><result column="product_desc" property="productDesc"/><result column="version" property="version"/></resultMap><select id="selectLoanInfoByProductTypeAndPage" resultMap="loanInfoMap">select id,product_name,rate,cycle,release_time,product_type,product_no,product_money,left_product_money,bid_min_limit,bid_max_limit,product_status,product_full_time,product_desc,versionfrom b_loan_infowhere product_type = #{productType}order by release_time desclimit #{pageStartIndex},#{pageSize}</select>
</mapper>
查询结果是:平台注册总人数
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis//DTD Mapper 3.0//EN"".dtd">
<mapper namespace="com.yanchuanyi.p2p.dataService.dao.IUserDao"><select id="selectTotalUserCount" resultType="Long">select count(id) from u_user;</select></mapper>
本文发布于:2024-02-04 12:33:27,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170707333955610.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |