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

相关文章

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空