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 パブリックをフォローする
アカウント