基于Springboot的BaseService,BaseController

前言:

在做项目时需要对大量的表做增删查改,而其中的逻辑大同小异,所以抽象了一个 BaseService,BaseController来实现所有表的增删查改和一些公用的基础方法。

UML类图:

大体的思路就是在BaseService和BaseController中都使用泛型,到真正创建类的时候才知道具体的对象,对对象进行操作。

代码如下:

BaseEnity(需要使用BaseService方法的实体必须实现这些抽象方法)

package com.honeywell.tms.entity.base;

public abstract class BaseEntity {
public abstract boolean ValidateEmpty();
public abstract boolean ValidateUnique();
public abstract boolean AutoFill();
public abstract Object getKey();
public abstract String getText();
}

BaseMapper

逆向后得到的mapper方法都是相同的,所以我把它抽象出来了。

package com.honeywell.tms.dao.base;

import com.honeywell.tms.entity.CompanyEntity;
import com.honeywell.tms.entity.base.BaseEntity;
import org.apache.ibatis.annotations.Param; import java.util.List;
//所有被BaseService方法调用的dao都需要实现这个接口
public interface BaseMapper<E extends BaseEntity> {
int deleteByPrimaryKey(@Param(value="ID")Object ID);//在Mapper文件中的占位符的关键字就是value的值 int insert(E record); int insertSelective(E record); E selectByPrimaryKey(@Param(value="ID") Object ID); List<E> selectAll(); int updateByPrimaryKeySelective(E record); int updateByPrimaryKey(E record);
}

BaseService方法如下

package com.honeywell.tms.service.base;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.honeywell.tms.dao.base.BaseMapper;
import com.honeywell.tms.entity.base.BaseEntity;
import com.honeywell.tms.entity.base.ResponseEntity;
import com.honeywell.tms.entity.base.ValueTextEntity;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID; public class BaseService<E extends BaseEntity> {//一些提取了一些公用的Service方法,使用前必须通过init()方法注入相应的Mapper
BaseMapper dao; //在子类构造函数中调用,指明具体的dao层
public void init(BaseMapper mapper){
dao=mapper;
}
//分页获取
public ResponseEntity getByPage(int pageNum,int pageSize) {
PageHelper.startPage(pageNum,pageSize,true);
ResponseEntity responseEntity=new ResponseEntity();
List<E> pageList=dao.selectAll();//这个不是获取到的entity的集合了
PageInfo<E> entityList=new PageInfo<>(pageList);
pageList=entityList.getList();
long count=entityList.getTotal();;
responseEntity.setData(pageList);
responseEntity.setTotal(String.valueOf(count));
return responseEntity;
} //批量增加
public ResponseEntity batchSave(List<E> list) {
ResponseEntity responseEntity=new ResponseEntity();
StringBuffer message=new StringBuffer();
int row=0;
for(E j:list){
row++;
if(!j.ValidateEmpty()){
message.append("第"+row+"行插入失败,请检查是否有违规的空值+\n");
continue;
}
if(!j.ValidateUnique()){
message.append("第"+row+"行已经存在,插入失败\n");
}
j.AutoFill();
dao.insert(j);
}
responseEntity.setMessage(message.toString());
return responseEntity;
} //批量更新
public ResponseEntity batchUpdate(List<E> list) {
ResponseEntity responseEntity=new ResponseEntity();
StringBuffer message=new StringBuffer();
int row=0;
for(E j:list){
row++;
if(!j.ValidateEmpty()){
message.append("第"+row+"行更新失败,请检查是否有违规的空值+\n");
continue;
}
if(!j.ValidateUnique()) {
message.append("第" + row + "行已经存在,更新失败\n");
}
j.AutoFill();
StringToUUID(j);
int back=dao.updateByPrimaryKeySelective(j);//不为空的才更新,为空的不更新。
System.out.println(back);
}
responseEntity.setMessage(message.toString());
return responseEntity;
} //批量删除
public ResponseEntity batchDestroy(List<E> list) {
ResponseEntity responseEntity=new ResponseEntity();
StringBuffer message=new StringBuffer();
int row=0;
for(E j:list) {
row++;
try{
StringToUUID(j);
int count=dao.deleteByPrimaryKey(j.getKey());
}catch (Exception e){
System.out.println(e.getMessage());
message.append("第"+row+"删除失败,请先删除相关引用\n");
}
}
responseEntity.setMessage(message.toString());
return responseEntity;
}
//获取ValueText模型
public ResponseEntity getVTModel(){
ResponseEntity responseEntity=new ResponseEntity();
List<E> list=dao.selectAll();
List<ValueTextEntity> vtList=new ArrayList<>();
for(E j:list){
ValueTextEntity vtEntity=new ValueTextEntity();
vtEntity.setText(j.getText());
vtEntity.setValue(j.getKey().toString());
vtList.add(vtEntity);
}
responseEntity.setListData(vtList);
return responseEntity; }
//将前端页面传来的字符串转为UUID,前提条件是相应属性的名称必须包含"ID"
public Object StringToUUID(Object obj ){
Field[] fields=obj.getClass().getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
if (field.getName().contains("ID")) {
Object value = field.get(obj);
Object uid= UUID.fromString(value.toString());
field.set(obj,uid);
}
}
}catch (Exception e){
System.out.println(e.getMessage());
}
return null;
} }

BaseController

package com.honeywell.tms.controller.base;

import com.alibaba.fastjson.JSONArray;
import com.honeywell.tms.entity.CompanyEntity;
import com.honeywell.tms.entity.base.BaseEntity;
import com.honeywell.tms.entity.base.ResponseEntity;
import com.honeywell.tms.service.base.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.ParameterizedType;
import java.util.*; public class BaseController<E extends BaseEntity> {
private BaseService<E> service;
private static final String models="models"; //初始化
public void init(BaseService service){
this.service=service;
}
//查询
public Map Read(HttpServletRequest request){
String pageSkip=request.getParameter("pageSkip");
String pageSize=request.getParameter("pageSize");
int skip=Integer.valueOf(pageSkip);
int size=Integer.valueOf(pageSize);
int pageNum=skip/size+1;
ResponseEntity responseEntity=service.getByPage(pageNum,size);
return responseEntity.getMap();
} //增加
public Map Create(HttpServletRequest request){
ResponseEntity responseEntity;//返回的实体
List<E> dataList=getModel(request);
responseEntity=service.batchSave(dataList);
responseEntity.setData(dataList);
return responseEntity.getMap();
} //更新
public Map Update(HttpServletRequest request){
ResponseEntity responseEntity;//返回的实体
List<E> dataList=getModel(request);
responseEntity=service.batchUpdate(dataList);
responseEntity.setData(dataList);
return responseEntity.getMap();
} //删除
public Map Destroy(HttpServletRequest request){
ResponseEntity responseEntity;//返回的实体
List<E> dataList=getModel(request);
responseEntity=service.batchDestroy(dataList);
return responseEntity.getMap();
} //获取ValueText模型
public List getVTModel(){
ResponseEntity responseEntity=service.getVTModel();
return responseEntity.getListData();
} //从request中获取实体
public List<E> getModel(HttpServletRequest request){
String json=request.getParameter(models);
return JSONArray.parseArray(json,createModel());
} //获取实列的类信息
public Class createModel() {
try {
ParameterizedType ptype = (ParameterizedType) this.getClass().getGenericSuperclass();
Class clazz = (Class<E>) ptype.getActualTypeArguments()[0];
E o = (E) clazz.newInstance();
return o.getClass();
}catch (Exception e){
System.out.println(e.getMessage());
}
return null; }
}

使用(用了公司这个实体举例)

公司的实体:

package com.honeywell.tms.entity;

import com.honeywell.tms.dao.CompanyMapper;
import com.honeywell.tms.entity.base.BaseEntity;
import org.springframework.beans.factory.annotation.Autowired; import java.util.Date;
import java.util.UUID; public class CompanyEntity extends BaseEntity {
@Autowired
CompanyMapper dao; private Object COMPANY_ID; private String COMPANY_CODE; private String COMPANY_NAME; private String COMPANY_ADDR; private String CREATED_BY; private String UPDATE_BY; private Date CREATED_DATE; private Date UPDATE_DATE; public Object getCOMPANY_ID() {
return COMPANY_ID;
} public void setCOMPANY_ID(Object COMPANY_ID) {
this.COMPANY_ID=COMPANY_ID;
} public String getCOMPANY_CODE() {
return COMPANY_CODE;
} public void setCOMPANY_CODE(String COMPANY_CODE) {
this.COMPANY_CODE = COMPANY_CODE == null ? null : COMPANY_CODE.trim();
} public String getCOMPANY_NAME() {
return COMPANY_NAME;
} public void setCOMPANY_NAME(String COMPANY_NAME) {
this.COMPANY_NAME = COMPANY_NAME == null ? null : COMPANY_NAME.trim();
} public String getCOMPANY_ADDR() {
return COMPANY_ADDR;
} public void setCOMPANY_ADDR(String COMPANY_ADDR) {
this.COMPANY_ADDR = COMPANY_ADDR == null ? null : COMPANY_ADDR.trim();
} public String getCREATED_BY() {
return CREATED_BY;
} public void setCREATED_BY(String CREATED_BY) {
this.CREATED_BY = CREATED_BY == null ? null : CREATED_BY.trim();
} public String getUPDATE_BY() {
return UPDATE_BY;
} public void setUPDATE_BY(String UPDATE_BY) {
this.UPDATE_BY = UPDATE_BY == null ? null : UPDATE_BY.trim();
} public Date getCREATED_DATE() {
return CREATED_DATE;
} public void setCREATED_DATE(Date CREATED_DATE) {
this.CREATED_DATE = CREATED_DATE;
} public Date getUPDATE_DATE() {
return UPDATE_DATE;
} public void setUPDATE_DATE(Date UPDATE_DATE) {
this.UPDATE_DATE = UPDATE_DATE;
} @Override
public boolean ValidateEmpty() {
if(this.COMPANY_CODE==null||this.COMPANY_CODE.equals("")){
return false;
}
if(this.COMPANY_NAME==null||this.COMPANY_NAME.equals("")){
return false;
}
return true;
}
@Override
public boolean ValidateUnique() {
return true;
} @Override
public boolean AutoFill(){
//ID为空说明是新增操作,
if(getCOMPANY_ID()==null){
this.setCOMPANY_ID(UUID.randomUUID());
this.setCREATED_BY("admin");
this.setCREATED_DATE(new Date());
}
this.setUPDATE_BY("admin");
this.setUPDATE_DATE(new Date());
return true;
} @Override
public Object getKey() {
return this.COMPANY_ID;
}
@Override
public String getText() {
return this.COMPANY_NAME;
}
}

公司的mapper,只需要继承BaseMapper

package com.honeywell.tms.dao;

import com.honeywell.tms.dao.base.BaseMapper;
import com.honeywell.tms.entity.CompanyEntity;
import com.honeywell.tms.entity.base.BaseEntity; public interface CompanyMapper extends BaseMapper<CompanyEntity> { }

公司的Service

(继承BaseService,指明相应的实体,构造注入相应的Service)

package com.honeywell.tms.service;
import com.honeywell.tms.dao.CompanyMapper;
import com.honeywell.tms.entity.CompanyEntity;
import com.honeywell.tms.service.base.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service
public class CompanyService extends BaseService<CompanyEntity> {
private CompanyMapper dao;//如果此处出现红色波浪线 Settings - Editor - Inspections - Spring - Spring Core - Code - Autowiring for Bean Class 勾去掉
@Autowired
public CompanyService(CompanyMapper mapper){//这里必须要使用构造注入。
this.dao=mapper;
init(dao);
} }

公司的Controller

(继承BaseController并构造注入相应的Service就行了,一定要构造注入哟。这里其实映射也可以写在BaseController里面,但是项目用了Swagger,它不支持。)

package com.honeywell.tms.controller;

import com.honeywell.tms.controller.base.BaseController;
import com.honeywell.tms.entity.CompanyEntity;
import com.honeywell.tms.service.CompanyService;
import com.honeywell.tms.service.base.BaseService;
import com.honeywell.tms.utils.consts.Response;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map; @Api(value="/Company",tags = "公司模块")
@RestController
@RequestMapping("/Company")
public class CompanyController extends BaseController<CompanyEntity> {//继承BaseController后可以调用一些基本的方法,不过需要注入相应的Service
private CompanyService service;
@Autowired
public CompanyController(CompanyService service){
init(service);
} @RequestMapping("/DownloadTemplate")
@ApiOperation(value = "公司模板下载",notes = "直接下载excel模板")
@ResponseBody
public void DownloadTemplate(HttpServletResponse httpServletResponse){
return;
} @RequestMapping("/Read")
public Map Read(HttpServletRequest request){
return super.Read(request);
}
@RequestMapping("Create")
public Map Create(HttpServletRequest request){
return super.Create(request);
} @RequestMapping("/Update")
public Map Update(HttpServletRequest request){
return super.Update(request);
} @RequestMapping("/Destroy")
public Map Destroy(HttpServletRequest request) {
return super.Destroy(request);
} @RequestMapping("/getVTModel")
public List getVTModel(HttpServletRequest request){
return super.getVTModel();
} }

总结:总体来说较为满意的,能够实现基本的增删改查和一些基本的方法。缺点是大多都是用继承,没有面向接口编程。UML类图画的不够好,有什么意见或修改的地方请多多指教。

基于Springboot的BaseService和BaseController的更多相关文章

  1. 基于SpringBoot搭建应用开发框架(二) —— 登录认证

    零.前言 本文基于<基于SpringBoot搭建应用开发框架(一)——基础架构>,通过该文,熟悉了SpringBoot的用法,完成了应用框架底层的搭建. 在开始本文之前,底层这块已经有了很 ...

  2. SpringData 基于SpringBoot快速入门

    SpringData 基于SpringBoot快速入门 本章通过学习SpringData 和SpringBoot 相关知识将面向服务架构(SOA)的单点登录系统(SSO)需要的代码实现.这样可以从实战 ...

  3. 基于SpringBoot开发一个Restful服务,实现增删改查功能

    前言 在去年的时候,在各种渠道中略微的了解了SpringBoot,在开发web项目的时候是如何的方便.快捷.但是当时并没有认真的去学习下,毕竟感觉自己在Struts和SpringMVC都用得不太熟练. ...

  4. Shiro 核心功能案例讲解 基于SpringBoot 有源码

    Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...

  5. 基于SpringBoot从零构建博客网站 - 技术选型和整合开发环境

    技术选型和整合开发环境 1.技术选型 博客网站是基于SpringBoot整合其它模块而开发的,那么每个模块选择的技术如下: SpringBoot版本选择目前较新的2.1.1.RELEASE版本 持久化 ...

  6. 基于Springboot集成security、oauth2实现认证鉴权、资源管理

    1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...

  7. 基于springboot构建dubbo的入门demo

    之前记录了构建dubbo入门demo所需的环境以及基于普通maven项目构建dubbo的入门案例,今天记录在这些的基础上基于springboot来构建dubbo的入门demo:众所周知,springb ...

  8. 基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【六】【引入bootstrap前端框架】

    https://blog.csdn.net/linzhefeng89/article/details/78752658 基于springboot+bootstrap+mysql+redis搭建一套完整 ...

  9. 基于springboot的SSM框架实现返回easyui-tree所需要数据

    1.easyui-tree easui-tree目所需要的数据结构类型如下: [ { "children": [ { "children": [], " ...

随机推荐

  1. seleniumGrid分布式远程执行测试脚本

    执行UI自动化测试脚本时,不仅可以在本地执行,也可以远程指定某计算机执行测试脚本,seleniumGrid为我们提供了这类服务,但还需要自己搭建环境. 一.本地计算机需要准备java环境和seleni ...

  2. (转)android自定义控件

    原帖地址:http://my.oschina.net/wangjunhe/blog/99764 创建新的控件: 作为一个有创意的开发者,你经常会遇到安卓原生控件无法满足你的需求. 为了优化你的界面和工 ...

  3. ForkJoinPool分支/合并框架工程使用的工作窃取

    ForkJoinPool分支/合并框架 在必要的情况下,讲一个大任务,进行拆分(fork)成若干个小任务(拆到不可拆为止),再将一个个小的任务运算的结果进行join汇总. 工作窃取的背景 分支/合并框 ...

  4. Android studio 混淆打包安装后报错NullPointerException int java.util.List.size()

    菜鸟的我,尝试混淆打包app...打包之前没有什么问题,混淆打包之后遇到各种问题.首先,感谢原博主的分享.解决了我的问题.谢谢. 原文地址:http://blog.csdn.net/tou_star/ ...

  5. [剑指offer] 16. 合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解法一: 非递归解 class Solution { public: ListNode *Mer ...

  6. iOS-监听原生H5性能数据window.performance

    WebKit-WKWebView iOS8开始苹果推荐使用WKWebview作为H5开发的核心组件,以替代原有的UIWebView,以下是webkit基本介绍介绍: 介绍博客 Webkit H5 - ...

  7. IDEA及IDEA汉化包

    IDEA 官网:http://www.jetbrains.com/idea/download/#section=windows IDEA社区版(百度云):http://pan.baidu.com/s/ ...

  8. JDK(Windows)

    百度云:链接:http://pan.baidu.com/s/1dEEsIUd     密码:15cn 官网下载网址:http://www.oracle.com/technetwork/java/jav ...

  9. Apache Tomcat 绿色版安装Service(服务)

    1.配置CATALINA_HOME的环境变量:  变量名:CATALINA_HOME  值:tomcat安装或解压的根目录如:c:\Apache tomcat6.0 2.开始->运行->c ...

  10. 小白开学Asp.Net Core 《十》

    小白开学Asp.Net Core <十> — — Session.Cookie.Cache(老生常谈) 一.背景 在常谈Session和Cookie之前我们先来简单的了解下Http(可以说 ...