2019.3.20日,记。请求参数之链式编程,数据库统计设计

2024-06-17 14:18

本文主要是介绍2019.3.20日,记。请求参数之链式编程,数据库统计设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先上原代码

@RequestMapping(value = "creditChannelList")@RequiresPermissions(value={"creditManager:credit_channel_list"})public ModelAndView creditChannelList(HttpServletRequest request, String code, String channelType, String title, String url, String productCode, String startTime, String endTime, String channelStartTime, String channelEndTime, String status) {CreditChannelPage page = new CreditChannelPage();if (Utils.isNotBlank(status)) {page.setStatus(Integer.parseInt(status));}if (Utils.isNotBlank(code)) {page.setCode(code);}if (Utils.isNotBlank(channelType)) {page.setChannelType(Integer.parseInt(channelType));}if (Utils.isNotBlank(title)) {page.setTitle(title);}if (Utils.isNotBlank(url)) {page.setUrl(url);}if (Utils.isNotBlank(productCode)) {page.setProductCode(productCode);}if (Utils.isNotBlank(startTime)) {page.setStartTimeStr(startTime);//condition.append(" and DATE_FORMAT(r.created_time,'%Y/%m/%d') >= '" + startTime + "' ");}if (Utils.isNotBlank(endTime)) {page.setEndTimeStr(endTime);//condition.append("and DATE_FORMAT(r.created_time,'%Y/%m/%d') <= '" + endTime + "' ");}if (Utils.isNotBlank(channelStartTime)) {page.setChannelStartTimeStr(channelStartTime);//condition.append(" and DATE_FORMAT(r.start_time,'%Y/%m/%d') <= '" + channelStartTime + "' ");}if (Utils.isNotBlank(channelEndTime)) {page.setChannelEndTimeStr(channelEndTime);//condition.append("and DATE_FORMAT(r.end_time,'%Y/%m/%d') >= '" + channelEndTime + "' ");}// 设置默认排序方式SystemContext.setOrderExpression("created_time desc");Page<CreditChannel> creditChannels = creditChannelService.selectPageByCondition(CreditChannel.TABLE_NAME + ".selectPageByAdminCondition", page);Map<String, Object> map = creditChannelService.selectOne(CreditChannel.TABLE_NAME + ".selectSumAndCountByAdminCondition", page);ModelAndView modelAndView = new ModelAndView("/credit/creditChannelList");if (null != map) {modelAndView.addObject("totalAmt",map.get("totalAmt") == null ? "0.00" : map.get("totalAmt"));modelAndView.addObject("totalCount",map.get("totalCount") == null ? "0" : map.get("totalCount"));}		modelAndView.addObject("creditChannels", creditChannels);modelAndView.addObject("status", status);modelAndView.addObject("code", code);modelAndView.addObject("channelType", channelType);modelAndView.addObject("title", title);modelAndView.addObject("url", url);modelAndView.addObject("productCode", productCode);modelAndView.addObject("startTime", startTime);modelAndView.addObject("endTime", endTime);modelAndView.addObject("channelStartTime", channelStartTime);modelAndView.addObject("channelEndTime", channelEndTime);return modelAndView;}

当看到大量的if语句跟addobject时,表示内心是崩溃的

因此想到的优化方式是链式编程,采用内部类对其进行封装

/*** 查询条件的封装类*/class  CreditChannelPageBuild{//返回的分页数据CreditChannelPage page = new CreditChannelPage();//返回的ModelAndViewModelAndView modelAndView  = new ModelAndView();public CreditChannelPageBuild setTitle(String title){if (Utils.isNotBlank(title)) {page.setTitle(title);modelAndView.addObject("title", title);}return this;}public CreditChannelPageBuild setStartTime(String startTime){if (Utils.isNotBlank(startTime)) {page.setStartTimeStr(startTime);modelAndView.addObject("startTime", startTime);}return this;}public CreditChannelPageBuild setEndTime(String endTime){if (Utils.isNotBlank(endTime)) {page.setEndTimeStr(endTime);modelAndView.addObject("endTime", endTime);}return this;}public CreditChannelPageBuild setStatus(String status){if (Utils.isNotBlank(status)) {page.setStatus(Integer.parseInt(status));modelAndView.addObject("status", status);}return this;}public CreditChannelPageBuild setCode(String code){if (Utils.isNotBlank(code)) {page.setCode(code);modelAndView.addObject("code", code);}return this;}public CreditChannelPageBuild setChannelType(String channelType){if (Utils.isNotBlank(channelType)) {page.setChannelType(Integer.parseInt(channelType));modelAndView.addObject("channelType", channelType);}return this;}public CreditChannelPageBuild setUrl(String url){if (Utils.isNotBlank(url)) {page.setUrl(url);modelAndView.addObject("url", url);}return this;}public CreditChannelPageBuild setModelAndViewData(String key,Object value){modelAndView.addObject(key, value);return this;}public CreditChannelPageBuild setModelAndViewToViewName(String viewName){modelAndView.setViewName(viewName);return this;}public ModelAndView getModelAndView(){return modelAndView;}public CreditChannelPage getCreditChannelPage(){return page;}}

优化后

@RequestMapping(value = "creditChannelList")@RequiresPermissions(value={"creditManager:credit_channel_list"})public ModelAndView creditChannelList(String code, String channelType, String title, String url,String startTime, String endTime, String status) {//跟据查询条件获取分页对象CreditChannelPageBuild creditChannelPageBuild = new CreditChannelPageBuild();//初始化对象,设置参数CreditChannelPage page = creditChannelPageBuild.setTitle(title).setStartTime(startTime).setEndTime(endTime).setStatus(status).setCode(code).setChannelType(channelType).setUrl(url).getCreditChannelPage();// 设置默认排序方式SystemContext.setOrderExpression("created_time desc");Page<CreditChannel> creditChannels = creditChannelService.selectPageByCondition(CreditChannel.TABLE_NAME + ".selectPageByAdminCondition", page);Map<String, Object> map = creditChannelService.selectOne(CreditChannel.TABLE_NAME + ".selectSumAndCountByAdminCondition", page);if (null != map) {creditChannelPageBuild.setModelAndViewData("totalAmt",map.get("totalAmt") == null ? "0.00" : map.get("totalAmt")).setModelAndViewData("totalCount", map.get("totalCount") == null ? "0" : map.get("totalCount"));}return creditChannelPageBuild.setModelAndViewData("creditChannels",creditChannels).setModelAndViewToViewName("/credit/creditChannelList").getModelAndView();}

我确定看起来觉得舒服多了,然而还有个问题,那就是如果有多个action用到这个的话,每次写不是很累,而且大部是有重复的地方?

因此可以采用父类泛型加反射的方式将公共的东西再一次把公共的东西抽出来

先抽出父类,

public  class BasePageBuild<T> {protected T page;//返回的ModelAndViewprotected ModelAndView modelAndView  = new ModelAndView();public BasePageBuild(){//通过反射将对象实例化,Spring4,新添加的ResolvableType工具类等价于下面的方法Class clazz = ResolvableType.forType(this.getClass()).getSuperType().getGeneric(0).resolve();try {page = (T)clazz.newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}
//        java自带的反射写法
//        ParameterizedType ptype = (ParameterizedType) this.getClass().getGenericSuperclass();
//        Class clazz1 = (Class<T>) ptype.getActualTypeArguments()[0];
//        try {
//            page = (T) clazz.newInstance();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }}public BasePageBuild setModelAndViewData(String key, Object value){modelAndView.addObject(key, value);return this;}public BasePageBuild setModelAndViewToViewName(String viewName){modelAndView.setViewName(viewName);return this;}public ModelAndView getModelAndView(){return modelAndView;}public  T getBasePage(){return page;}
}

然后子类去继承这个父类

 class  CreditChannelPageBuild extends BasePageBuild<CreditChannelPage> {//返回的ModelAndViewModelAndView modelAndView  = new ModelAndView();public CreditChannelPageBuild setTitle(String title){if (Utils.isNotBlank(title)) {page.setTitle(title);modelAndView.addObject("title", title);}return this;}public CreditChannelPageBuild setStartTime(String startTime){if (Utils.isNotBlank(startTime)) {page.setStartTimeStr(startTime);modelAndView.addObject("startTime", startTime);}return this;}public CreditChannelPageBuild setEndTime(String endTime){if (Utils.isNotBlank(endTime)) {page.setEndTimeStr(endTime);modelAndView.addObject("endTime", endTime);}return this;}public CreditChannelPageBuild setStatus(String status){if (Utils.isNotBlank(status)) {page.setStatus(Integer.parseInt(status));modelAndView.addObject("status", status);}return this;}public CreditChannelPageBuild setCode(String code){if (Utils.isNotBlank(code)) {page.setCode(code);modelAndView.addObject("code", code);}return this;}public CreditChannelPageBuild setChannelType(String channelType){if (Utils.isNotBlank(channelType)) {page.setChannelType(Integer.parseInt(channelType));modelAndView.addObject("channelType", channelType);}return this;}public CreditChannelPageBuild setUrl(String url){if (Utils.isNotBlank(url)) {page.setUrl(url);modelAndView.addObject("url", url);}return this;}}
class  CreditApplyToLoanPageBuild extends BasePageBuild<CreditApplyToLoanPage> {//返回的分页数据public CreditApplyToLoanPageBuild setMobile(String mobile){if (Utils.isNotBlank(mobile)) {page.setMobile(mobile);modelAndView.addObject("mobile", mobile);}return this;}public CreditApplyToLoanPageBuild setStartTime(String startTime){if (Utils.isNotBlank(startTime)) {page.setStartTimeStr(startTime);modelAndView.addObject("startTime", startTime);}return this;}public CreditApplyToLoanPageBuild setEndTime(String endTime){if (Utils.isNotBlank(endTime)) {page.setEndTimeStr(endTime);modelAndView.addObject("endTime", endTime);}return this;}}

这样就可以保证只需要编写业务部分就可以,真是不要太爽!!!

 

=============================================================

记一次采用sum 函数对数据进行统计

select sum(IFNULL(r.invite_count,0)) as totalAmt,count(1) totalCount ,IFNULL(rtb.aNum,0) aNum,IFNULL(rtb.bNum,0) bNum, IFNULL(rtb.cNum,0) cNum,IFNULL(rtb.dNum,0) dNumfrom table r left join( select channel_id,sum(if(oper_type='a',1,0)) aNum,sum(if(oper_type='b',1,0)) bNum,sum(if(oper_type='c',1,0)) cNum,sum(if(oper_type='d',1,0)) dNumfrom table2 ) rtb on rtb.channel_id=r.id

记一次当使用group by 时想让它合并的数据是记录里面最新的一条时

select * from (select * from table order by create_time desc
) as t
group by t.user_id;

 

这篇关于2019.3.20日,记。请求参数之链式编程,数据库统计设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069672

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送