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数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

基于@RequestParam注解之Spring MVC参数绑定的利器

《基于@RequestParam注解之SpringMVC参数绑定的利器》:本文主要介绍基于@RequestParam注解之SpringMVC参数绑定的利器,具有很好的参考价值,希望对大家有所帮助... 目录@RequestParam注解:Spring MVC参数绑定的利器什么是@RequestParam?@

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超