hibernate的优点不用写sql语句,它内封装了一系列方法,我们调用它的方法就可以对表进行常规的增删改查,只要我们对这些方法再进行一层封装,那我们对数据库的操作完全就转向了对java语言的操作,开发速度就很速度,也正因为它的封装成一般性,hibernate对极致优化有些困难,做不到mybatis那种对sql优化。
有点跑题了
hibernate取出数据,springmvc的@ResponseBody进行封装成json数据并返回,一般是没什么问题的,但要是有外键呢?比如员工请假表,你关联了员工表,@ResponseBody对员工请假表进行json化,但对员工这个类字段json化时它可能会由于你对这个类进行了懒加载而报错。
@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumns({ @JoinColumn(name = "employeeId", referencedColumnName = "employeeId", updatable = false, insertable = false) })
private Employee employee;
就算它不报错,难道你要把员工表的所有信息都json化一起发送到前端呢?你可能只想要它的姓名而已。
问题就出来了在这,它不像mybatis一样写sql语句你想取出什么字段就取什么字段,你是不是又开始想念mybatis的好处了,未来有一天两者结合是不是就好了。
你得开始了解一下PO的概念了,po:持久化对象,也可以说就是我们的model类,表字段与model里的属性一一对应。
VO的概念:视图对象,也可以说是业务层对象,我们后台返回的属性和前端的数据属性一一对应。
上面的问题就可以这样解决了,先得到PO对象,然后根据你前端需要什么字段写一个PO转VO的方法。具体例子如下:
效果图:员工姓名和所属部门皆为外表所取
PO层:
PO转VO:这是我手写的,当然你可以借用工具类,BeanProperties貌似是这个,你可以了解一下,这里我考虑的是你自动转的话是依靠它的反射来实现的,而我个人是比较厌恶自己的框架有反射代码实现功能的而且还得频频调用,所以牺牲点开发速度来提高点性能。(这几行死代码写起来也挺快的吧)
Controller方法:
@RequestMapping(value = "/leaveWorkReqList", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> leaveWorkReqList(HttpServletRequest request, int rows, int page, String searchData, String sort, String order) {
log.info("LeaveWorkReqAction : leaveWorkReqList.do");
initWhereAndValue(searchData);
result.put("total", leaveWorkReqService.count(where, value));
List<LeaveWorkReq> list=leaveWorkReqService.find(where, value, page, rows, initSortOrder(sort, order));
result.put("rows", new LeaveWorkReqVO().transformLeaveWorkReqVOList(list));
return result;
}