Mybatis如何将结果映射设置为Dto

时间:2018-09-23 02:08:54

标签: spring mybatis

我对mybatis和指定的Dto的resultMap有一些疑问。

import lombok.Data;

import java.util.Date; 

@Data 
public class BasicBoardArticle {

private int articleIdx;

private int subBoardIdx;

private String title;

private int userIdx;

private String userNickName;

private String content;

private int good;

private int bad;

private Date createDate;

private Date updateDate;
}

我在Dto上方,然后像下面这样选择

<select id="selectAll" resultType="BasicBoardArticle" >
    SELECT
        articleIdx
        , bad
        , createDate
        , title
        , userNickName
    FROM BASICBOARDARTICLE
</select>

但是当控制器返回dto'BasicBoardArticle'时,它将所有属性(例如subBoardIdx,updateDate等)返回为空,而我什至没有选择。  有什么办法可以从重做Dto中摆脱掉这些属性?

2 个答案:

答案 0 :(得分:0)

如果我已正确理解您不希望在查询时在DTO中使用subBoardIdx,updateDate

<select id="selectAll" resultType="BasicBoardArticle" >
SELECT
    articleIdx
    , bad
    , createDate
    , title
    , userNickName
FROM BASICBOARDARTICLE
</select>

但是您的DTO具有这些字段,以便始终返回这些字段,您可以通过将其映射到不具有这些字段的模型对象来更改它

类似这样的字段

public class BasicBoardArticleModel {

private int articleIdx;

private String title;

private String userNickName;

private int bad;

private Date createDate;

}

您可以将所需的字段从DTO映射到此数据模型并使用它

答案 1 :(得分:0)

您不能完全按照Java的要求进行操作。

BasicBoardArticle具有属性,它们不能仅仅从中消失。想想使用此类的代码。它可以尝试说出updateDate。这是正确的做法,因为该类定义了此属性,并且Java是强类型的,因此您不能动态添加/删除属性。

因此您可以

  1. 更改类(或创建另一个类)以仅包含您需要的字段
  2. 或更改类的序列化以仅返回您需要的字段(或作为选择跳过空字段)
  3. 或将返回到其他没有这些字段的其他类的BasicBoardArticle实例

mybatis中的单独映射

仅使用所需字段创建一个单独的类。然后为其创建一个单独的resultMap(如果使用autoMapping=true,则唯一的区别是您在resultMap中指定的目标类型)。

然后,您要么在mapper中创建一个单独的查询,要么使用<if>根据某些参数值有条件地包括这些字段。

更改序列化表格

如果selectAll仅用于表示层,则可以自定义类的序列化方式。要么为其创建自定义序列化程序,然后在控制器中将其用于该特定端点(尽管没有简单的方法可以做到这一点,除非您使用不同的请求内容类型)。或者,如果可以负担得起的话,将杰克逊配置为不返回空字段。

转换为其他类型

如果不仅在视图层中使用selectAll的结果,还可以将返回的BasicBoardArticle转换为仅包含所需字段的其他类型。