Service层的接口中有一些比较常用方法,一次又一次的在新的Service层中被书写,所以懒惰的程序员又烦了,他们决定写个通用接口来解决这个问题。

有些项目中,实体类即承担接收表单数据的任务,又承担持久化任务,很省心。但有些项目中这两项任务的执行类不是同一个,一个Entity.java来执行数据

持久化的任务,一个EntityVo.java类来执行接收表单数据的任务。那么问题来了:Service层需要的是entityVo对象,而DAO层需要的是entity对象,这两个对象

会有一些相同的属性和方法,也会有一些不同的属性和方法,那么在service层中必然要做entityVo对象到entity对象的转换工作,而这项工作又不属于业务。如果

处理方法与业务混在一起写,代码的清晰度就会受到影响。所以本文中做了这方面的处理,可能并不是最好的方案,但起码比没有处理要好的多。

BaseService.java

package org.lxl.mr.common.base.service;

import java.util.List;

public interface BaseService<EntityVo,PK> {

    /**

     * 增加

     * @param entityVo

     */

    public void save(EntityVo entityVo);

    /**

     * 修改

     * @param entityVo

     */

    public void update(EntityVo entityVo);

    /**

     * 通过主键删除

     * @param pk

     */

    public void deleteByPK(PK pk);

    /**

     * 删除

     * @param entityVo

     */

    public void delete(EntityVo entityVo);

    /**

     * 通过主键查询

     * @param pk

     * @return

     */

    public EntityVo get(PK pk);

    /**

     * 查询全部

     * @return

     */

    public List<EntityVo> findAll();

    

}
使用

UserService.java

package org.lxl.mr.service;

import org.lxl.mr.common.base.service.BaseService;

import org.lxl.mr.vo.UserVo;

public interface UserService extends BaseService<UserVo, String>{

    

}

这个处理非常简单,就是写个父接口,把常用的方法写在父接口中,子接口没有其他的需要就什么都不用写;有

其他的需要就再写相应的方法即可。

BaseServiceImpl.java

package org.lxl.mr.common.base.service;

import org.lxl.mr.common.base.vo.VoTemplate;

import org.springframework.beans.factory.annotation.Autowired;

public class BaseServiceImpl {

    

    private VoTemplate voTemplate;

    

    @Autowired

    public final void setVoTemplate(VoTemplate voTemplate) {

        this.voTemplate = voTemplate;

    }

    

    public final VoTemplate getVoTemplate(){

        return this.voTemplate;

    }

}

这个通用方法并不是用来自动实现BaseService接口中的方法的,而是处理entityVo和entity直接转化的问题的。

这是仿造HibernateDaoSupport的写法,注入voTemplate对象。其中voTemplate的get/set方法都是final修饰的,

是不允许子类重写的,保证了注入的正确执行。

VoTemplate.java

package org.lxl.mr.common.base.vo;

import org.springframework.beans.BeanUtils;

import org.springframework.stereotype.Component;

/**

 * 本类的作用是解决service层传递的EntityVo对象与dao层

 * 使用的Entity对象转换的问题,更轻松,更规范的处理该问题

 * @author liuXueLiang

 */

@Component

public class VoTemplate {

    /**

     * 由程序员自己提供一个回调方法

     * @param vo

     * @return

     */

    public <T> T execute(VoCallback<T> vo){

        return vo.doInVo();

    }

    

    /**

     * 默认的回调方法,将v的属性值复制给t,并将t返回

     * @param t    回调对象

     * @param v    目标对象

     * @return

     */

    public <T,V> T defaultExcute(final T t,final V v){

        

        return this.execute(new VoCallback<T>(){

            

            @Override

            public T doInVo() {

                if(v==null) return null;

                BeanUtils.copyProperties(v,t);

                return t;

            }

            

        });

    }

    

    

}

VoCallback.java

package org.lxl.mr.common.base.vo;

public interface VoCallback<T> {

    T doInVo();

}

使用

package org.lxl.mr.service.impl;

import java.util.ArrayList;

import java.util.List;

import java.util.UUID;

import org.lxl.mr.common.base.service.BaseServiceImpl;

import org.lxl.mr.common.base.vo.VoCallback;

import org.lxl.mr.dao.UserDao;

import org.lxl.mr.pojo.User;

import org.lxl.mr.service.UserService;

import org.lxl.mr.vo.UserVo;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

@Service

public class UserServiceImpl extends BaseServiceImpl implements UserService {

    

    private UserDao userDao;

    

    @Autowired

    public void setUserDao(UserDao userDao) {

        this.userDao = userDao;

    }

    /**

     * 增加,方法一

     */

    @Override

    public void save(UserVo entityVo) {

        User user = new User();

        user = super.getVoTemplate().defaultExcute(user, entityVo);

        this.userDao.save(user);

    }

    

    /**

     * 增加,方法二

     */

//    @Override

//    public void save(final UserVo entityVo) {

//        

//        //这里是处理entityVo与entity转换的地方

//        User user = super.getVoTemplate().execute(new VoCallback<User>(){

//

//            @Override

//            public User doInVo() {

//                User u = new User();

//                //这句根据主键生成策略决定要、不要、改

//                u.setUuid(UUID.randomUUID().toString().replace("-", ""));

//                u.setUsername(entityVo.getUsername());

//                u.setPassword(entityVo.getPassword());

//                return u;

//            }

//            

//        });

//        

//        //处理业务

//        this.userDao.save(user);

//    }

    

    /**

     * 增加,方法三

     */

//    @Override

//    public void save(UserVo entityVo) {

//        //这里是处理entityVo与entity转换的地方

//        User user = super.getVoTemplate().execute(new UserVoCallback(entityVo));

//        //这里是处理业务的地方

//        this.userDao.save(user);

//    }

    

    /**

     * 增加,方法四

     */

//    @Override

//    public void save(UserVo entityVo) {

//        //这里是处理entityVo与entity转换的地方

//        User user = super.getVoTemplate().execute(new UserVoCallback2(entityVo));

//        //这里是处理业务的地方

//        this.userDao.save(user);

//    }

    

    @Override

    public void update(UserVo entityVo) {

        User user = new User();

        user = super.getVoTemplate().defaultExcute(user, entityVo);

        this.userDao.update(user);

    }

    public UserDao getUserDao() {

        return userDao;

    }

    @Override

    public void deleteByPK(String pk) {

        this.userDao.deleteByPK(pk, UserVo.PK_NAME);

    }

    @Override

    public void delete(UserVo entityVo) {

        User user = new User();

        user = super.getVoTemplate().defaultExcute(user, entityVo);

        this.userDao.delete(user);

        

    }

    @Override

    public UserVo get(String pk) {

        User user = this.userDao.get(pk);

        UserVo userVo = new UserVo();

        userVo = super.getVoTemplate().defaultExcute(userVo,user);

        return userVo;

    }

    @Override

    public List<UserVo> findAll() {

        List<User> list = this.userDao.findAll();

        List<UserVo> listVo = new ArrayList<UserVo>();

        if(list==null) return null;

        for(User user : list){

            UserVo userVo = new UserVo();

            userVo = super.getVoTemplate().defaultExcute(userVo, user);

            listVo.add(userVo);

        }

        return listVo;

    }

}

上面的例子以save方法为例,给出了voTemplate处理entityVo与entity转化的4种用法。

方法1

使用voTemplate的defaultExcute方法,简单的从 v -> t 复制属性

方法2

使用voTemplate的excute方法,自定义处理方法。

方法2、3、4都是自定义处理方法,只不过在提供VoCallback<T>的实现类方式上有所差别。

这里是用内部类实现的

方法3

提供一个UserVoCallback.java,实现VoCallback接口

以这个类的对象作为voTemplate.execute的参数来实现的。

UerVoCallback.java

package org.lxl.mr.vo.callback;

import org.lxl.mr.common.base.vo.VoCallback;

import org.lxl.mr.pojo.User;

import org.lxl.mr.vo.UserVo;

public class UserVoCallback implements VoCallback<User> {

    private UserVo userVo;

    

    public UserVoCallback(UserVo userVo){

        this.userVo = userVo;

    }

    

    @Override

    public User doInVo() {

        if(userVo==null) return null;

        User user = new User();

        user.setUsername(userVo.getUsername());

        user.setPassword(userVo.getPassword());

        return user;

    }

}

方法4

1) 提供一个VoCallback接口的抽象实现类VoCallbackSupport.java:

VoCallbackSupport.java

package org.lxl.mr.common.base.vo;

public abstract class VoCallbackSupport<T,V> implements VoCallback<T> {

    protected V v;

    public VoCallbackSupport(V v){

        this.v = v;

    }

    @Override

    public abstract T doInVo();

}

2)提供一个UserVoCallback2.java,继承VoCallbackSupport抽象类。

以这个类的对象作为voTemplate.execute的参数来实现的。

UserVoCallback2.java

package org.lxl.mr.vo.callback;

import org.lxl.mr.common.base.vo.VoCallbackSupport;

import org.lxl.mr.pojo.User;

import org.lxl.mr.vo.UserVo;

public class UserVoCallback2 extends VoCallbackSupport<User, UserVo>{

    public UserVoCallback2(UserVo v) {

        super(v);

    }

    @Override

    public User doInVo() {

        User user = new User();

        user.setUsername(v.getUsername());

        user.setPassword(v.getPassword());

        return user;

    }

    

}

这种方式处理entityVo与entity之间转换与传统的方式一样,还是要程序员自己去处理。

它真正的好处是:

1、规范化处理entityVo与entity之间的转换

2、处理entityVo与entity之间转换的代码与业务代码分离,使代码更清晰

3、在entityVo与entity相似度极高,可以直接复制相同属性的情况下,使用VoTemplate

提供的defalutExcute方法一句话即可实现entityVo与entity的转换,如:

User user = super.getVoTemplate().defaultExcute(new User,entityVo);

非常的方便!

觉得我的这个方案可行的小伙伴不妨在项目中用用,有更好的想法记得告诉我,我们一起提高!

原文地址:https://blog.csdn.net/jianmo777/article/details/50342575

java Web项目Service层通用接口和entityVo对象与entity对象转化问题的解决方案的更多相关文章

  1. java web项目war包部署,使用tomcat对指定接口设置身份认证

    先简单说一下需求: 将一个基于springboot2.0开发的java web项目打成war包,通过tomcat部署到一台linux服务器上,项目相关的一些图片等资源也按照一定规则放置在服务器构建好的 ...

  2. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

  3. Intellij IDEA Java web 项目搭建

    Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring+Hibernate的架构搭建一个 ...

  4. Intellij IDEA采用Maven+Spring MVC+Hibernate的架构搭建一个java web项目

    原文:Java web 项目搭建 Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring ...

  5. Java web 项目搭建

    Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring+Hibernate的架构搭建一个 ...

  6. Java web项目综合练习(Estore)

    Java web项目综合练习(Estore) 复习day18: ajax代码的书写步骤 2)json格式文本,转js对象的方法是那个 项目开发流程介绍 这里学习的JavaWEB项目实战,主要是把前面学 ...

  7. 一个完整Java Web项目背后的密码

    前言 最近自己做了几个Java Web项目,有公司的商业项目,也有个人做着玩的小项目,写篇文章记录总结一下收获,列举出在做项目的整个过程中,所需要用到的技能和知识点,带给还没有真正接触过完整Java ...

  8. java web项目为什么我们要放弃jsp?

    前戏: 以前的项目大多数都是java程序猿又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等),又搞后端(java/mysql/Oracle等等). 随着时代的发展,渐渐的许多 ...

  9. java web项目答辩答辩题总结(书本网上语言答辩+自己的语言答辩)

    答辩每个人的总分为1.5分.每个人主要问3个问题. 开发流程===>系统架构====>项目模块+功能===>项目得失重定向与转发:?九个隐式对象?get与post的区辨:?jsp有静 ...

随机推荐

  1. P2676 超级书架

    题目描述 Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了.现在,只有书架的顶上还留有一点空间. 所有N(1 <= N & ...

  2. Asp.Net MVC中捕捉错误路由并设置默认Not Found页面。

    在Global中写一个Application_Error捕捉错误路由并重定向到Not Found页面.这里是全局性抓取错误路由,此处还可以写由错误路由导致访问失败的日志记录. protected vo ...

  3. 外文翻译 《How we decide》多巴胺的预言 第一节

    这是第二章的起始... 书的导言 1991年2月24日凌晨.第一与第二海军陆战队大批向北进入了沙特阿拉伯的沙漠地带,他们从这来进入科威特.这批军队是伊拉克入侵8个月以来,同盟国第一批进入科威特的部队. ...

  4. Clean Code 第十章 : 类

    最近的CleanCode读到了第十章.这一张主要讲了如何去构造一个类,感觉的CleanCode至此已经不仅仅是单纯的讲如何'写'出漂亮的代码,而是从设计方向上去构造出好的代码了. 本章节主要讲了: * ...

  5. innerHTML与IE浏览器内存泄露问题

    使用 sIEve 扫描和筛选 如果大量使用 JavaScript 和 Ajax 技术开发 Web 2.0 应用程序,您很有可能会遇到浏览器的内存泄漏问题.如果您有一个单页应用程序或者一个页面要处理很多 ...

  6. SQL Server之增删改操作

    -------添加约束.增删改 use StudentDB2 go --------创建学生表--------- create table StudentInfo( --studentId int p ...

  7. Mac environment setting

    java 7 jdk http://www.ifunmac.com/2013/04/mac-jdk-7/ http://blog.sina.com.cn/s/blog_6dce99b101016744 ...

  8. 2019年今日头条机试_JAVA后台岗_第二题

    使用map的递推,java对象做key需要重写equeal,hashCode方法,使拥有相同属性值的对象被识别为同一对象. import java.util.*; class Cat{ public ...

  9. 联玛客(W 笔试)

    纸质算法题 1. 输入数据:1.3.2.4.8... 输出数据:3.1.4.2.8... 找出规律,写出一个程序求解,并附上时间复杂度和空间复杂度 我的答案: 规律一:奇偶位互换 假设输入数据长度为5 ...

  10. node程序的部署神器pm2的基本使用

    pm2是从nodejs衍生出来的服务器进程管理工具,可以做到开机就启动nodejs.当然了,也可以用nohup来做这件事情的. 前言 众所周知,Node.js运行在Chrome的JavaScript运 ...