ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-在Spring MVC应用程序中将DAO对象转换为DTO对象

2019-10-31 11:19:31  阅读:230  来源: 互联网

标签:dto dao spring java spring-mvc


背景:我在一个教育环境中工作,去年夏天,我们的一位开发人员使用Spring MVC和Hibernate设计和构建了Java Web应用程序.它在9月份以新学期推出,因为它取代了一个尘土飞扬的旧版Blackboard插件,使用户倍感欣慰.应用程序的主要功能用于为学生设置目标,向他们留下消息并为学生创建报告.

很快过去了几个月,原始的开发人员继续前进,应用程序也遇到了一些麻烦.

用例场景:教师登录后,他们的主屏幕出现,该屏幕包含他们所教课程的列表,以及当前所选课程的目标,消息和报告的概述以及该课程的学生注册列表课程.如果课程包含少量目标等,则可以快速返回信息.但是随着信息量的增长,加载信息所需的时间似乎呈指数增长.

经过调查,我认为我已经找到原因.我选了一个示例课程,并查看了Reports,以查看发生了什么.我发现数据库以毫秒为单位返回了相关数据,浏览器以毫秒为单位呈现了该数据,但是浏览器等待从中返回数据的时间间隔为12秒.在数据库查询完成和接收响应的前端之间对对象完成的唯一事情就是转换为DTO.

代码:这就是DAO层中报表对象的外观

@Entity
@Table(name = "REPORTS")
public class Report implements Serializable
{

    /**
     * 
     */
    private static final long   serialVersionUID    = -7659637777880535914L;

    @Id
    @GeneratedValue
    @Column(name = "REPORT_ID", insertable = true, updatable = false, nullable = false, unique=true)
    private Integer             reportID;

    @Column(name = "DATE_CREATED", insertable = true, updatable = false, nullable = false)
    private GregorianCalendar   dateCreated;

    @Column(name = "DATE_MODIFIED", insertable = true, updatable = true, nullable = true)
    private GregorianCalendar   dateModified;

    @Column(name = "TITLE", insertable = true, updatable = true, nullable = false, length=1000)
    private String              title;

    @Column(name = "CURRENT_PERFORMANCE_GRADE", insertable = true, updatable = true, nullable = false)
    private String              currentPerformanceGrade;

    @Column(name = "TARGET_GRADE", insertable = true, updatable = true, nullable = false)
    private String              targetGrade;

    //VARCHAR(MAX) as this is the main body of the tutor report comments. Here the tutor can write as much content as they like.
    @Column(name = "TUTOR_COMMENTS", insertable = true, updatable = true, nullable = false, columnDefinition="VARCHAR(MAX)")
    private String              tutorComments;
//getters and setters below
}

那里还有其他字段,例如报告所链接的用户,课程,编写报告的导师等.但是为了简单起见,在这里我将其省略.

public class ReportDTO implements Serializable
{

/**
 * 
 */
private static final long   serialVersionUID    = 2795129355073929139L;

private Integer             reportID;

private String              dateCreated;

private String              dateModified;

private String              title;

private String              currentPerformanceGrade;

private String              targetGrade;

private String              tutorComments;
//getters and setters below
}

因此,主要的区别在于日期对象已成为日期格式的字符串,而与GregorianCalendar对象相对,因此日期的前端显示采用了易于阅读的格式.这是转换为DTO涉及的示例.服务层中的Single方法获取DAO对象,从中获取相关字段,将其设置在新构造的DTO对象中,根据需要进行转换(例如,公历将日期格式化为String)并返回DTO:

public ReportDTO convertToDto(Report daoReport) throws Exception
{

    ReportDTO dtoReport = new ReportDTO();
    try
    {
                    if(daoReport.getReportID() != null)
        {
            dtoReport.setReportID(daoReport.getReportID());
        }
                    if(daoReport.getDateCreated() != null)
        {
            dtoReport.setDateCreated(ReportServiceImpl.ISO_DATE_TIME_FORMAT.format(daoReport.getDateCreated().getTime()));

        }

        if(daoReport.getDateModified() != null)
        {
             dtoReport.setDateModified(ReportServiceImpl.ISO_DATE_TIME_FORMAT.format(daoReport.getDateModified().getTime()));

        }

        if(daoReport.getTitle() != null)
        {
            dtoReport.setTitle(daoReport.getTitle());

        }
                     if(daoReport.getCurrentPerformanceGrade() != null)
        {
              dtoReport.setCurrentPerformanceGrade(daoReport.getCurrentPerformanceGrade());

        }

        if(daoReport.getTargetGrade() != null)
        {
            dtoReport.setTargetGrade(daoReport.getTargetGrade());

        }

        if(daoReport.getTutorComments() != null)
        {
            dtoReport.setTutorComments(daoReport.getTutorComments());

        }
                    return dtoReport;
    }
    catch(Exception e)
    {
        Exception myException = new Exception("Exception was thrown while converting a persistent Report object to it's data transport equivalent", e);
        throw myException;
    }

问题:毕竟,我的问题是,这是从DAO转换为DTO的正确方法吗?自从他离开以来,我一直在遵循他的代码,并且以相同的方式完成了所有新增操作.将对象返回到前端而不进行转换,我看到的结果是> 300毫秒而不是12秒.

我知道他从here开始为该项目学习了Spring MVC,所以他不是一个经验丰富的Spring开发人员,我也不是.根据我们看到如此多的请求时间,我们肯定做错了一个事实.

解决方法:

好的,正如beny23提到的,Hibernate是延迟加载的(首先加载PK列表,然后在对数据执行某些操作时加载其余的PK).

我使用的解决方案是创建一个非休眠连接,以使用普通的JDBC连接读取数据,查询还转换了数据,以使其以我需要的格式(日期作为字符串等)返回,因此我没有不必转换为dto.这样,我就将一些工作卸载到数据库中,并为我的应用程序省去了麻烦.

标签:dto,dao,spring,java,spring-mvc
来源: https://codeday.me/bug/20191031/1975192.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有