Mybatis如何优雅的返回自定义对象

Pandora Heart 2018-06-15 10:21:29
由于项目中几乎所有的查询都是关联查询,查询出来的数据是各个表中的某些字段,无法直接使用Model对象接收,所以想问问Mybatis中有没有什么优雅的解决方案。

据我所知一种是自定义一个对象,然后在xml中配置ResultMap,但是几乎每条sql语句都不相同,返回的结果也都不相同,全部在这里面配置非常麻烦且无法调试。

我目前的做法是返回一个Map对象,然后在Service层取值,包装成对象再返回前端。代码如下:

public List<WorksDetailDto> findCustomList() {
List<Map> maps = tsArtWorksMapper.findCustomList();
List<WorksDetailDto> dtos = new ArrayList<>();
for (Map m:maps) {
WorksDetailDto dto = new WorksDetailDto();
MemberDto member = new MemberDto();
member.setUid((String)m.get("member_uid"));
member.setName((String)m.get("member_name"));
dto.setMember(member);
dto.setUid((String)m.get("works_uid"));
dto.setName((String)m.get("works_name"));
dto.setDesc((String)m.get("wordk_desc"));
dto.setCreateTime((Long)m.get("works_create_time"));
String imageJson = (String) m.get("image_json");
List<ImageDto> images = JSONObject.parseArray(imageJson, ImageDto.class);
dto.setImages(images);
dtos.add(dto);
}
return dtos;
}

目前有几个问题,1.如果map中的值为null,要做非空校验是在service层做还是在xml文件中用sql语句做?sql语句中怎么做?
2.总感觉这种方案不够优雅,有没有什么更加优雅的解决方案?
...全文
4294 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjsl__ 2018-06-15
  • 打赏
  • 举报
回复
association
双鱼座girl 2018-06-15
  • 打赏
  • 举报
回复
额,那你还是用map吧,用别的更容易出问题
Pandora Heart 2018-06-15
  • 打赏
  • 举报
回复
引用 1 楼 yuxiaoshuangshuang 的回复:
难不倒不能直接定义个vo类型返回吗,为什么要在service层在取一遍呢,另外如果你想在sql做非空校验可以啊用IFnull (a,0) 这样做判断可以,如果a是null则返回0
返回值不是一个简单对象类型,而是一个组合对象类型

public class WorksDetailDto {
    private MemberDto member;
    private List<ImageDto> images;
    private String uid;
    private String name;
    private String desc;
    private Long createTime;
。。。。get set省略
这其中member是一个对象。有它自己的属性,images是一个数组,并且其中每个元素都是一个ImageDto对象,这种复杂的对象除非在 ResultMap中详细配置说明,否则无法直接返回的 sql语句如下:

SELECT
	m.uid member_uid,
	m.`name` member_name,
	aw.uid works_uid,
	aw.title works_name,
	aw.content works_desc,
	aw.create_time works_create_time,
	aw.image_json
FROM
	works aw
INNER JOIN pic ap ON aw.id = ap.node_id
INNER JOIN member m ON aw.member_id = m.id
WHERE
	m.id = 21
双鱼座girl 2018-06-15
  • 打赏
  • 举报
回复
难不倒不能直接定义个vo类型返回吗,为什么要在service层在取一遍呢,另外如果你想在sql做非空校验可以啊用IFnull (a,0) 这样做判断可以,如果a是null则返回0
stacksoverflow 2018-06-15
  • 打赏
  • 举报
回复 2
ORM工具完成的无非是一对多,多对一等映射,具体是固定的几个表还是查询结果集并不重要。 只要标示唯一行的key都配置正确即可完成映射,比如ID,对应多表的ID等。 所以只要主外键都查出来,是否手写区别不是很大,都是对返回的二维结果集压缩成多维结果集的过程。 我觉得,如果走mybaties路线就老老实实地把resultMap都配出来。 个人觉得简单的非空校验放在SQL比较好,毕竟那么多关联查询都写了,也不差多以两个函数,维护起来还方便。 dao也好,service也好单纯的处理输入和结果集映射就好,可能的话直接映射成VO对象。

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧