高機能エンティティクラス変換ツール MapStruct チュートリアル

1.MapStructとは

開発プロセス中に多くの bean コピー プロセスに遭遇します. 最も単純で失礼な方法は set/get メソッドです. もちろん, これは最もばかげた方法でもあります. コードが長すぎて面倒です. 第二に,フレームワーク BeanUtils がリフレクションを使用すると、パフォーマンスに影響します。リフレクション情報をキャッシュしてパフォーマンスを向上させることはできますが。しかし、このようにタイプと名前が同じでなければマッピングできず、多くの場合、チームごとに使用する名詞が異なるため、多くの手動の set/get 関数が必要になります。

MapStruct は、これらの問題を解決するもので、タイプセーフで高性能、かつ依存関係のない JavaBean マッピング コードを生成するアノテーション プロセッサです。

  • 注釈プロセッサ
  • JavaBean 間のマッピング コードを生成できます。
  • 型の安全性、高性能、依存関係なし

2. アドバンテージ分析

ハイパフォーマンス

これはリフレクションに関連しており、リフレクションはバイトコードのコンテンツを読み取る必要があり、これには多くのコストがかかります。MapStruct によって生成されるコードは、人間の手書きに似ています。速度は保証できます。

使い方は簡単

完全にマッピングされている場合、リフレクションほど簡単に使用できないことは確かです。BeanUtils などのツールを使用して、1 つのステートメントで実行します。ただし、特殊なマッチング (特殊な型変換、多対 1 変換など) が必要な場合は、比較的簡単です。

基本的には、インターフェースを宣言し、対応するメソッドをインターフェースの下に書くだけで使用できます。もちろん、特別な事情がある場合は、追加の処理が必要です。

コードに依存しない

生成されたコードは自己完結型であり、実行時の依存関係はありません。

デバッグしやすい

生成されたコードでは、簡単にデバッグできます。

3. 使い方

ポンインポート

    <!--  mapStruct开始  -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.4.2.Final</version>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-jdk8</artifactId>
        <version>1.4.2.Final</version>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.4.2.Final</version>
    </dependency>
    <!--  mapStruct结束  -->

エンティティ クラス

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student implements Serializable {
    /**
     * id
     */
    private Integer id;
    /**
     * 学生姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private String sex;
}

VOクラスの準備

@Data
@NoArgsConstructor
@AllArgsConstructor
public class StudentRequestVo {

    /**
     * id
     */
    private Integer studentId;
    /**
     * 学生姓名
     */
    private String studentName;
    /**
     * 年龄
     */
    private Integer studentAge;

}

コンバーターの定義

	//这个注解是MapStruct得注解,不是mybatis注解
	@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface StudentMapStrut {

    @Mappings({
            @Mapping(target = "id",source = "studentId"),
            @Mapping(target = "name",source = "studentName"),
            @Mapping(target = "age",source = "studentAge")
    })
    Student studentConvert(StudentRequestVo studentRequestVo);

}

使用

 Student student = studentMapStrut.studentConvert(new StudentRequestVo(1, "张三", 15));
リスト交換
@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface StudentMapStrut {

    @Mappings({
            @Mapping(target = "id",source = "studentId"),
            @Mapping(target = "name",source = "studentName"),
            @Mapping(target = "age",source = "studentAge")
    })
    Student studentConvert(StudentRequestVo studentRequestVo);

    List<Student> studentListConvert(List<StudentRequestVo> studentRequestVos);

}
複数のオブジェクトが 1 つのオブジェクトにマップされる
//老师学生vo
@Data
@NoArgsConstructor
@AllArgsConstructor
public class StudentAndTeacher implements Serializable {
    /**
     * id
     */
    private Integer id;
    /**
     * 学生姓名
     */
    private String studentName;
    /**
     * 老师姓名
     */
    private String teacherName;
}

//学生vo
@Data
@NoArgsConstructor
@AllArgsConstructor
public class StudentRequestVo {

    /**
     * id
     */
    private Integer studentId;
    /**
     * 学生姓名
     */
    private String studentName;
    /**
     * 年龄
     */
    private Integer studentAge;
}
//老师vo
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TeacherRequestVo {

    /**
     * id
     */
    private Integer teacherId;
    /**
     * 学生姓名
     */
    private String teacherName;
    /**
     * 年龄
     */
    private Integer teacherAge;

}

オブジェクトにマップ

    @Mappings({
        @Mapping(target = "studentName",source = "studentRequestVo.studentName"),
        @Mapping(target = "teacherName",source = "teacherRequestVo.teacherName")
})
StudentAndTeacher studentAndTeacherConvert(StudentRequestVo studentRequestVo,TeacherRequestVo teacherRequestVo);

カスタム変換

オブジェクト変換を例にとると、20歳未満は一律0、20歳以上は一律1として保存したい。

    @Mappings({
        @Mapping(target = "id",source = "studentId"),
        @Mapping(target = "name",source = "studentName"),
        @Mapping(target = "age",expression = "java(com.example.demo.mapstrut.MapStructUtil.ageConvert(studentRequestVo.getStudentAge()))")
})
Student studentConvert(StudentRequestVo studentRequestVo);

	public class MapStructUtil {

    public static Integer ageConvert(Integer studentAge){
        if (studentAge<=20){
            return 0;
        }else {
            return 1;
        }
    }
}

4. まとめ:
mapstruct にも dateFormat や numberFormat など、カスタム変換を実現する関数がたくさんあり、日常的にはこちらの記事を参考にしてください。詳細については、公式 Web サイトを参照してください: https://mapstruct.org/documentation/stable/reference/html/


WeChat パブリックをフォローする
アカウントここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/CharlesYooSky/article/details/126004466