MapStructの実体転換及びList変換の方法説明


開発においては、POをDTM、DPOに切り替えるなど、いくつかのエンティティ間の変換が常に必要です。有名なのはBenUtilやModelMapperなど、使い勝手は簡単ですが、やや複雑なビジネスシーンでは力不足です。MapStructというプラグインは、dominエンティティ類とmodel類の属性マッピングを処理するために使用でき、配置性が高い。Mapperインターフェースを定義するだけで、MapStructは自動的にこのマッピングインターフェースを実現し、複雑で煩雑なマッピングを回避して実現します。MapStruct公式サイトのアドレス:http://mapstruct.org/
依存を導入

    <dependency>
      <groupId>org.mapstruct</groupId>
      <artifactId>mapstruct-jdk8</artifactId>
      <version>1.1.0.Final</version>
    </dependency>
需要
私達は学生student類があると仮定して、ユーザーuser類に変換して、学生情報をユーザー情報ライブラリに保存します。
Studentクラスの内容は以下の通りです。

public class Student {
  private Integer id;
  private String name;
  private Integer age;
  private String sex;
  //setters, getters, toString()         ,            
  }
この時User類の内容は以下の通りです。

public class User {
  private Integer id;
  private String name;
  private Integer age;
  private String sex;
  //setters, getters, toString()         ,            
 }
モデルを変換
StudentとUserの属性名は同じです。変換インターフェースは

import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface UserMapping {
  /**
   * Student     User
   * @param Student
   * @return
   */
   User studentToUser(Student student);
}
プログラムを実行する前に、まずmvn clean compleをコンパイルして、mapstuctフレームがUserMappingImpl実現クラスを生成します。
変換モデルの属性が一致しません。
UserおよびStudentの属性名が正しくない場合、例えば、
Studentクラスの内容は以下の通りです。

public class Student {
  private Integer id;
  private String sname;
  private Integer age;
  private String sex;
  //setters, getters, toString()         ,            
  }
この時User類の内容は以下の通りです。

public class User {
  private Integer id;
  private String uname;
  private Integer age;
  private String sex;
  //setters, getters, toString()         ,            
 }
変換インターフェースは

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring")
public interface UserMapping {
  /**
   * Student     User
   * @param Student
   * @return
   */
   @Mappings({
      @Mapping(target = "uname", source = "sname")
     //            ","       @Mapping
     // ,@Mapping(target = "uname", source = "sname")
  })
   User studentToUser(Student student);
}
変換モデルの属性タイプが一致しません。
たとえば、userクラスのsexフィールドのタイプをbollanに変更します。
この時User類の内容は以下の通りです。

public class User {
  private Integer id;
  private String uname;
  private Integer age;
  private boolean sex;
  //setters, getters, toString()         ,            
 }
この変換はちょっと変態が必要です。だから、自分でタイプを書く必要があります。

public class UserTransform {
  public String booleanToString(boolean value){
    if(value){
      return " ";
    }
    return " ";
  }
  public boolean strToBoolean(String str){
    if (" ".equals(str)) {
      return true;
    }
    return false;
  }
}
変換インターフェースは(UserTrans form.classクラスを使う)です。

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring",uses = UserTransform.class)
public interface UserMapping {
  /**
   * Student     User
   * @param Student
   * @return
   */
   @Mappings({
      @Mapping(target = "uname", source = "sname")
     //            ","       @Mapping
     // ,@Mapping(target = "uname", source = "sname")
  })
   User studentToUser(Student student);
}
転換リスト
userとstudentが集合形式リストである場合は、以下のように変換します。
List<>集合を変換する時は実体転化が必要です。実現において、List変換はfor循環呼び出しエンティティ転化であるからです。したがって、属性名が対応していない場合は、@Mappingsの属性名マッピング配置を実体変換で行うべきであり、その後、listの変換もこれと属性のマッピングを引き継ぐことになる。
たとえば属性名が同じです。

import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface UserMapping {
  /**
   * Student     User
   * @param Student
   * @return
   */
   User studentToUser(Student student);
   /**
   * Students     Users
   * @param Students
   * @return
   */
   List<User> studentsToUsers(List<Student> students);
属性名が違います

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring")
public interface UserMapping {
  /**
   * Student     User
   * @param Student
   * @return
   */
   @Mappings({
      @Mapping(target = "uname", source = "sname")
     //            ","       @Mapping
     // ,@Mapping(target = "uname", source = "sname")
  })
   User studentToUser(Student student);
  /**
   *    studentsToUsers          studentToUser      studentToUser      
   * Students     Users
   * @param Students
   * @return
   */
   List<User> studentsToUsers(List<Student> students);
}
自動的に生成されるUserMappingImpl実装を示します(このような場合はmvn clean compleを実行して自動的に生成されます)

@Component
public class UserMappingImpl implements UserMapping {
  @Override
  public User studentToUser(student student) {
    if ( student == null ) {
      return null;
    }
    User user = new User();
    User.setId(student.getId() );
    User.setName(student.getName() );
    //            
    //User.setUname(student.getSname() );
    User.setSex(student.getSex() );
    User.setAge(student.getAge() );
    return user;
  }
  @Override
  public List<User> studentsToUsers(List<student> students) {
    if ( students == null ) {
      return null;
    }
    List<User> list = new ArrayList<User>();
    for ( student student : students ) {
      list.add( studentToUser( student ) );
    }
    return list;
  }
}
参考資料:https://www.jb51.net/article/157763.htm
締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。