你用过不写代码就能完成一个简单模块的组件么?

开篇四连问

  1. 你是否懒得写普通的增删改查方法?
  2. 你是否不喜欢代码生成插件的重复代码?
  3. 你是否渴望一个没有冗余代码的项目?
  4. 你是否渴望一行代码都不用写就能完成一个简单的模块?

组件由来

作为后端程序员,相信大家都写过以下几种代码:

  1. 根据主键查询
  2. 多条件分页查询
  3. 插入
  4. 根据主键修改
  5. 根据主键删除(单个或批量)

抛开业务来说,这几种代码是我们项目中最最基本的代码了,每一个项目中都会出现大量的这种代码。那么你的项目中这种代码你是怎么写的呢?

  1. 按照dao-service-controller的流程写?
  2. copy一个现有的模块然后修修改改?
  3. 使用代码生成插件?
  4. 自己封装一个组件?

    对于我个人来说,就是从上方四个步骤走过来的。刚刚开始学习Java的时候跟着老师的步骤从dao到service接口到实现类再到controller。等到参加工作的时候就觉得没什么大不了的了,直接copy后进行修改。工作一段时间以后觉得自己写太累了然后就开始使用代码生成插件。

    但是使用插件一段时间以后我觉得每个项目中存在的太多太多的冗余代码了,单单进行全局搜索时一个方法名出现了几十次,如果有一个插件的代码需要修改那么就要修改几十次,稍不注意就给自己挖了个坑等等。然后呢我就在想,既然这些都是冗余方法那么我何不自己封装一个组件把这些东西都抽象出来做一个组件。以后开发时我只维护这一个组件,把剩余的精力放到业务代码上呢?

    我封装的什么组件?

    组件名称:syj-minicode

当一些单表的增删改查时你只需要告诉前端来调用这几个接口就行了

下方出现的entityName为当前操作的对象名称或者数据库表名称(注意命名规范要符合驼峰命名法,例如:UserOrder或者user_order都可以) 删除接口为物理删除,逻辑删除请使用update接口

  1. 根据主键查询对象
@RequestMapping(value = "/syj-api/{entityName}/{id}", method = RequestMethod.GET)
  1. 分页查询
@RequestMapping(value = "/syj-api/{entityName}/page", method = RequestMethod.POST)
@RequestBody: GridPageRequest

这里的GridPageRequest为分页查询的条件,看一下它的组成元素

    /**
     * 查询关键字Map
     */
    private Map<String, String> searchMap;
    /**
     * 模糊查询关键字Map
     */
    private Map<String, String> likeSearchMap;
    /**
     * 排序关键字Map
     */
    private Map<String, String> orderMap;
    /**
     * 分组关键字数组
     */
    private String[] groupArray;

    private int pageNum;
    private int pageSize;

前端查询时只需要按照查询条件组装GridPageRequest对象就可以了

  1. 插入
@RequestMapping(value = "/syj-api/{entityName}/insert", method = RequestMethod.POST)
@RequestBody: Object(待插入对象)
  1. 根据主键进行更新
@RequestMapping(value = "/syj-api/{entityName}/update", method = RequestMethod.PUT)
@RequestBody: Object(待更新对象)
  1. 根据主键进行删除
@RequestMapping(value = "/syj-api/{entityName}/{id}", method = RequestMethod.DELETE)
  1. 批量删除
@RequestMapping(value = "/syj-api/{entityName}/deleteByIds", method = RequestMethod.DELETE)
@RequestBody: List<String> ids(待删除主键列表)

扩展接口

  1. 因为默认情况下单个对象查询、修改、删除所依据的主键的字段名使用的都是"id",但是很可能有的项目使用的是userId、orderId、roleId等主键,如果你的项目符合这个条件注入下方这个bean。

               @Bean
               public IdField idField() {
                   Map<String,String> map=new ConcurrentHashMap<>();
                   map.put("user","userId");//key的名称为实体名称或数据库表名称,value为主键属性名
                   map.put("order","orderId");
                   map.put("role","roleId");
                   IdField idField=new IdField();
                   idField.setMap(map);
                   return idField;
               } 
  2. 有的项目在进行插入和更新时会加入创建人和修改人等信息。如果有此需求请按照如下方式调用
    1. 插入扩展

    创建一个名为InsertExtend的bean并实现DefaultExtend接口

    java @Component public class InsertExtend implements ExtendInterface{ @Override public Map<String, String> exectue() { Map<String, String> map=new HashMap<>(); map.put("createTime", System.currentTimeMillis()); map.put("createBy", "创建人id"); map.put("createUserName", "创建人名称"); return map; } }

    1. 更新扩展

    创建一个名为UpdateExtend的bean并实现DefaultExtend接口

    java @Component public class UpdateExtend implements ExtendInterface{ @Override public Map<String, String> exectue() { Map<String, String> map=new HashMap<>(); map.put("updateTime", System.currentTimeMillis()); map.put("updateBy", "修改人id"); map.put("updateUserName", "修改人名称"); return map; } }

还有没有更灵活的使用方式?

上方使用方式其实是直接抽象到了controller层,解决一般的需要是没问题的,但是我们是有业务逻辑的,那么存在业务逻辑的情况下如何使用呢?

你可以在处理完业务逻辑后在service中调用

  1. 初始化

    java private BaseService getUserBaseService(){ return ServiceBeanFactory.getBean("User"); }

  2. 根据id查询

    java Map<String,Object> userMap=getUserBaseService().selectOneById("115"); User user=(User) BeanMapUtil.mapToBean(map,User.class);

  3. 根据条件查询列表(相信你已经知道了gridPageRequest对象如何组装)

    java List<Map<String, Object>> userMaps=getUserBaseService().selectBySelective(gridPageRequest); for (Map<String, Object> map:userMaps){ User user=(User) BeanMapUtil.mapToBean(map,User.class); }

  4. 插入

    java getUserBaseService().insertSelective(user);

  5. 更新

    java getUserBaseService().updateByIdSelective(user);

  6. 删除

    java getUserBaseService().deleteById("115");

  7. 批量删除

    java List<String> list=new ArrayList<>(); list.add("115"); list.add("116"); list.add("117"); getUserBaseService().deleteByIds(list);

    # 组件好用么?

    看完我的介绍你觉得这个组件能满足你的基本需要么,如果可以话请移步下方的GitHub链接看一下这个组件的源码写的如何以及如何使用吧。

GitHub

原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9795054.html

时间: 2024-07-31 14:32:56

你用过不写代码就能完成一个简单模块的组件么?的相关文章

今天和组内一起写代码时碰到了一个关于命名冲突的问题,最后用js命名空间的方法解决的。

//第一步,首先创建一个全局变量,可以放在自己的js方法库中方便以后用,这个就是用来注册命名空间的方法. ns = function(namespace){ var arr = namespace.split('.');  //将传入的字符串如"com.test.lzn"以'.'隔开做成一个数组 var strNamespace = ""; //这个是为了保存每一步循环进去的包名 for(var i=0;i<arr.length;i++) { if(i!=0)

ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局 一.实现效果 二.使用纯代码自定义一个tableview的步骤 1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控件要添加到contentView中

iOS开发UI基础—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

ios开发UI基础-使用纯代码自定义UItableviewcell实现一个简单的微博界面布局 一.实现效果 二.使用纯代码自定义一个tableview的步骤 1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控件要添加到contentView中) 进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体\固定的图片) 3.提供2个模型 数据模型:

iOS开发点滴 - 如何通过Segue写代码传递数据从一个ViewController到另一个ViewController(Swift代码)

1. 拖线 按住Control键,用鼠标从源控制器的某个控件开始,拖动到目的控制器 2. 选择弹出类型并设置Segue Identifier 在弹出的对话框中,选择“Selection Segue->Show” 见下图 设置Segue Identifier 3. 在目的视图控制器中设置接收桩 class DetailViewController: UIViewController { ... var destStub: SomeClass! ... } 4. 在源视图控制器中编写数据代码 ove

帮旭哥写作业_入门级:一个简单的数据库管理系统

2015-5-11 帮兄弟写的一个专业课的作业.第一次写这样的系统. 目标: 0)有用户界面的一个客户端 1)注册.登录功能 2)登录后,能增.删.改.查相应数据库的数据 登录后的界面大概长这个样子(学长版): 先记录下我理解的传统的C/S模型(暂时粗浅的理解,不一定完全准确): 为什么要有服务器端,而不是只有客户端和数据库,即为什么不把对数据的操作也放在客户端呢? 1)全放在客户端的话,可以反汇编,数据时怎么得到的就都知道了,不太安全. 2)服务器端有一个,客户端可以有多个,这样就能通过服务器

不仅仅是写代码,而是完成作品

近来有人问起,现在似乎真得变成了码农,日出而作,日落而息.整天不停的写代码,开发业务需求,周而复始,日子长了,感到厌倦.有时回想,应该在过去的某个时期我也曾陷入过这样的循环中,后来又是如何脱离的呢? 代码与缘由 这要回归到从写代码这件事上开始.写代码是因为有需求,需求来自业务的发展需要,需求经过产品经理再传递到程序员. 刚开始,作为一个新手程序员,不停的为各种需求写代码.开发完一个,接着又是下一个,生生不息,循环不止.一开始也许会感觉有些累,但并没有产生太多的厌倦.这是一个从不熟悉到熟悉再到熟练

技术领导要不要写代码?

技术领导要不要写代码?这是一个问题. 我刚工作的时候就听说,程序员(那时候还没有“码农”的说法)是吃青春饭的,到 30 岁就熬不了夜写不动代码了,所以要尽早转管理岗.相应的,如果你走上管理路线成了技术领导,自然就不必干写代码这种低级重复的体力劳动了.所以当时自己代码写得很多,技术能力增长很快,但总感觉有点别扭.那感觉就像,你能把车开得又快又熟练,最终只是为了能按时到达机场赶上飞机.然后,你就再也不用开车了. 不过无论如何,赶上飞机看来是更高级的选择,为了它,放弃苦心修炼的车技也可以接受罢. 但是

会写代码和写好代码的区别

功能: 对一个列表中的字符串小写 代码一: l = ['Hello','World',20,'IBM','Apple'] J = [] for s in l: if isinstance(s,str): s.lower() J.append(s.lower()) else: s J.append(s) print J 代码二: M = ['Hello','World',20,'IBM','Apple'] N = [h.lower() if isinstance(h,str) else h for

Opencv实时眼球追踪,解脱的你双手,让你的眼睛写代码!

Opencv实时眼球追踪,让你的眼睛写代码!这个还是有点对于我现在的追踪效果,还有点距离,但是我想完成这个还是没有问题的,用眼睛去控制电脑打字.我认为只要用手可以做,用眼睛都可以做到,包括游戏.画画.写字等等! 废话不多说,目前追踪率82.5%-98%(戴眼镜和不戴眼镜),目前这个是第一个版本,只是基本上实现了眼球追踪,后面会加上GPU处理提高效率,将目前的face分类器,增加face特征算法以提高face查准率!使实时眼球追踪更加稳定,效率更高,追踪率更高稳定些,适应更多场景!给两个视频连接和