DTO(Data Tansfer Object)即数据传输对象。不明白有些框架中为何要专门定义DTO来绑定表现层中的数据,为何不能直接用实体模型实现层与层之间的数据传输,有了DTO同时还要维护DTO与Model之间的映射关系与转换?前端
表现层与应用层之间是经过数据传输对象(DTO)进行交互的,数据传输对象是没有行为的POJO对象,它 的目的只是为了对领域对象进行数据封装,实现层与层之间的数据传递。为什么不能直接将领域对象用于 数据传递?由于领域对象更注重领域,而DTO更注重数据。不只如此,因为“富领域模型”的特色,这样作会直接将领域对象的行为暴露给表现层。java
须要了解的是,数据传输对象DTO自己并非业务对象。数据传输对象是根据UI的需求进行设计的,而不 是根据领域对象进行设计的。好比,Customer领域对象可能会包含一些诸如FirstName, LastName, Email, Address等信息。但若是UI上不打算显示Address的信息,那么CustomerDTO中也无需包含这个Address的数据。web
简单来讲Model面向业务,咱们是经过业务来定义Model的。而DTO是面向界面UI,是经过UI的需求来定义的。经过DTO咱们实现了表现层与Model之间的解耦,表现层不引用Model,若是开发过程当中咱们的模型改变了,而界面没变,咱们就只须要改Model而不须要去改表现层中的东西。sql
这里是列表文本session
假设有一个DTO,其属性包括两张表的属性,须要将sql语句查询获得的内容转为一个DTO对象,其解决方法以下:框架
SQLQuery query = session.createSQLQuery("select a.id as areaId,a.name as areaName,c.id as screenId,c.name as screenName from HPS_ParkingLotArea a left join HPS_ParkingLotScreen c on a.screenId = c.id "); List list = query .addScalar("areaId",Hibernate.INTEGER) .addScalar("areaName",Hibernate.STRING) .addScalar("screenId",Hibernate.INTEGER) .addScalar("screenName",Hibernate.STRING) .setResultTransformer(Transformers.aliasToBean(AreaWithScreen.class)).list(); return list;
在执行完sql语句以后,取到相应的属性,并赋予其类型,最后借助aliasToBean来转化为相应的类的实例。(此类无需有其余构造方法)jsp
Query q = session.createQuery("select new com.hibernate.MsgInfo(m.id, m.cont, m.topic.title, m.topic.category.name) from Msg m"); List<MsgInfo> list=q.list();
其中,MsgInfo是DTO。值得留意的是,第二种方法中DTO必须提供带参数的构造方法,而且HQL语句中属性的位置要与构造方法中的位置逐一对应。性能
对于DTO对象要注意,是int仍是Integer。若是是int,但set方法中的方法也是int,则若是为空,会报错。网站
DTO与实体对象的区别:http://blog.csdn.net/wzhjdls/article/details/26938909.net
生成DTO的两种方式:http://blog.csdn.net/angus_17/article/details/8500103