JMapperのガイド

JMapperガイド

1. 概要

このチュートリアルでは、JMappera fast and easy to use mapping framework.について説明します。

JMapperを構成するさまざまな方法、カスタム変換を実行する方法、およびリレーショナルマッピングについて説明します。

2. Mavenの構成

まず、JMapper dependencypom.xmlに追加する必要があります。


    com.googlecode.jmapper-framework
    jmapper-core
    1.6.0.1

3. ソースモデルと宛先モデル

構成に入る前に、このチュートリアル全体で使用する単純なBeanを見てみましょう。

まず、ソースBean –基本的なUserは次のとおりです。

public class User {
    private long id;
    private String email;
    private LocalDate birthDate;
}

そして、宛先Bean、UserDto:

public class UserDto {
    private long id;
    private String username;
}

ライブラリを使用して、ソースBeanUserから宛先BeanUserDtoに属性をマップします。

JMapperを設定するには、API、注釈、XML設定を使用する3つの方法があります。

次のセクションでは、これらのそれぞれについて説明します。

4. APIを使用する

APIを使用してJMapperを構成する方法を見てみましょう。

ここでは、ソースクラスと宛先クラスに構成を追加する必要はありません。 代わりに、すべてのthe configuration can be done using*JMapperAPI*,により、最も柔軟な構成方法になります。

@Test
public void givenUser_whenUseApi_thenConverted(){
    JMapperAPI jmapperApi = new JMapperAPI()
      .add(mappedClass(UserDto.class)
        .add(attribute("id").value("id"))
        .add(attribute("username").value("email")));

    JMapper userMapper = new JMapper<>
      (UserDto.class, User.class, jmapperApi);
    User user = new User(1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto result = userMapper.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getUsername());
}

ここでは、mappedClass()メソッドを使用してマップされたクラスUserDto.を定義し、次にattribute()メソッドを使用して各属性とそのマップされた値を定義します。

次に、構成に基づいてJMapperオブジェクトを作成し、そのgetDestination()メソッドを使用してUserDtoの結果を取得しました。

5. 注釈を使用する

we can use the @JMap annotation to configure our mappingがどのようになっているのか見てみましょう。

public class UserDto {
    @JMap
    private long id;

    @JMap("email")
    private String username;
}

そして、JMapperをどのように使用するかを次に示します。

@Test
public void givenUser_whenUseAnnotation_thenConverted(){
    JMapper userMapper = new JMapper<>(UserDto.class, User.class);
    User user = new User(1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto result = userMapper.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getUsername());
}

id属性の場合、ソースBeanと同じ名前であるため、ターゲットフィールド名を指定する必要はありませんでしたが、usernameフィールドの場合、usernameフィールドに対応することに注意してください。 Userクラスのt2)sフィールド。

次に、we only need to pass source and destination beans to our JMapper –これ以上の構成は必要ありません。

全体的に、この方法は使用するコードの量が最も少ないので便利です。

6. XML設定の使用

XML構成を使用してマッピングを定義することもできます。

user_jmapper.xmlでのサンプルXML構成は次のとおりです。


  
    
      
    
    
      
    
  

そして、XML構成をJMapperに渡す必要があります。

@Test
public void givenUser_whenUseXml_thenConverted(){
    JMapper userMapper = new JMapper<>
      (UserDto.class, User.class,"user_jmapper.xml");
    User user = new User(1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto result = userMapper.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getUsername());
}

XML構成を、ファイル名の代わりにStringとしてJMapperに直接渡すこともできます。

7. グローバルマッピング

ソースBeanと宛先Beanの両方に同じ名前のフィールドが複数ある場合は、グローバルマッピングを利用できます。

たとえば、idemailの2つのフィールドがあるUserDto1がある場合:

public class UserDto1 {
    private long id;
    private String email;

    // standard constructor, getters, setters
}

グローバルマッピングは、UserソースBeanで同じ名前のフィールドにマップされるため、使いやすくなります。

7.1. APIを使用する

JMapperAPI構成の場合、global()を使用します。

@Test
public void givenUser_whenUseApiGlobal_thenConverted() {
    JMapperAPI jmapperApi = new JMapperAPI()
      .add(mappedClass(UserDto.class).add(global())) ;
    JMapper userMapper1 = new JMapper<>
      (UserDto1.class, User.class,jmapperApi);
    User user = new User(1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto1 result = userMapper1.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getEmail());
}

7.2. 注釈を使用する

アノテーションの構成では、クラスレベルで@JGlobalMapを使用します。

@JGlobalMap
public class UserDto1 {
    private long id;
    private String email;
}

そして、ここに簡単なテストがあります:

@Test
public void whenUseGlobalMapAnnotation_thenConverted(){
    JMapper userMapper= new JMapper<>(
      UserDto1.class, User.class);
    User user = new User(
      1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto1 result = userMapper.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getEmail());
}

7.3. XML構成

また、XML構成の場合、<global/>要素があります。


  
    
  

そして、XMLファイル名を渡します。

@Test
public void givenUser_whenUseXmlGlobal_thenConverted(){
    JMapper userMapper = new JMapper<>
      (UserDto1.class, User.class,"user_jmapper1.xml");
    User user = new User(1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto1 result = userMapper.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getEmail());
}

8. カスタム変換

それでは、JMapperを使用してカスタム変換を適用する方法を見てみましょう。

UserDtoに新しいフィールドageがあります。これは、UserbirthDate属性から計算する必要があります。

public class UserDto {
    @JMap
    private long id;

    @JMap("email")
    private String username;

    @JMap("birthDate")
    private int age;

    @JMapConversion(from={"birthDate"}, to={"age"})
    public int conversion(LocalDate birthDate){
        return Period.between(birthDate, LocalDate.now())
          .getYears();
    }
}

したがって、User’s birthDateからUserDto’sage属性へのwe used @JMapConversion to apply a complex conversion。 したがって、UserUserDtoにマップすると、ageフィールドが計算されます。

@Test
public void whenUseAnnotationExplicitConversion_thenConverted(){
    JMapper userMapper = new JMapper<>(
      UserDto.class, User.class);
    User user = new User(
      1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto result = userMapper.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getUsername());
    assertTrue(result.getAge() > 0);
}

9. リレーショナルマッピング

最後に、リレーショナルマッピングについて説明します。 With this method, we need to define our JMapper using a target class each time.

ターゲットクラスがすでにわかっている場合は、マップされたフィールドごとにそれらを定義し、RelationalJMapperを使用できます。

この例では、1つのソースBeanUserがあります。

public class User {
    private long id;
    private String email;
}

そして、2つの宛先BeanUserDto1

public class UserDto1 {
    private long id;
    private String username;
}

そして、UserDto2

public class UserDto2 {
    private long id;
    private String email;
}

RelationalJMapper.を活用する方法を見てみましょう

9.1. APIを使用する

API構成では、targetClasses()を使用して各属性のターゲットクラスを定義できます。

@Test
public void givenUser_whenUseApi_thenConverted(){
    JMapperAPI jmapperApi = new JMapperAPI()
      .add(mappedClass(User.class)
      .add(attribute("id")
        .value("id")
        .targetClasses(UserDto1.class,UserDto2.class))
      .add(attribute("email")
        .targetAttributes("username","email")
        .targetClasses(UserDto1.class,UserDto2.class)));

    RelationalJMapper relationalMapper = new RelationalJMapper<>
      (User.class,jmapperApi);
    User user = new User(1L,"[email protected]");
    UserDto1 result1 = relationalMapper
      .oneToMany(UserDto1.class, user);
    UserDto2 result2 = relationalMapper
      .oneToMany(UserDto2.class, user);

    assertEquals(user.getId(), result1.getId());
    assertEquals(user.getEmail(), result1.getUsername());
    assertEquals(user.getId(), result2.getId());
    assertEquals(user.getEmail(), result2.getEmail());
}

ターゲットクラスごとに、ターゲット属性名を定義する必要があることに注意してください。

RelationalJMapperは、マップされたクラスの1つのクラスのみを取ります。

9.2. 注釈を使用する

アノテーションアプローチでは、classesも定義します。

public class User {
    @JMap(classes = {UserDto1.class, UserDto2.class})
    private long id;

    @JMap(
      attributes = {"username", "email"},
      classes = {UserDto1.class, UserDto2.class})
    private String email;
}

いつものように、注釈を使用する場合、これ以上の構成は必要ありません。

@Test
public void givenUser_whenUseAnnotation_thenConverted(){
    RelationalJMapper relationalMapper
      = new RelationalJMapper<>(User.class);
    User user = new User(1L,"[email protected]");
    UserDto1 result1 = relationalMapper
      .oneToMany(UserDto1.class, user);
    UserDto2 result2= relationalMapper
      .oneToMany(UserDto2.class, user);

    assertEquals(user.getId(), result1.getId());
    assertEquals(user.getEmail(), result1.getUsername());
    assertEquals(user.getId(), result2.getId());
    assertEquals(user.getEmail(), result2.getEmail());
}

9.3. XML構成

XML構成では、<classes>を使用して、各属性のターゲットクラスを定義します。

user_jmapper2.xmlは次のとおりです。


  
    
      
      
        
        
      
    
    
      
        
        
      
      
        
        
      
    
  

次に、XML構成ファイルをRelationalJMapperに渡します。

@Test
public void givenUser_whenUseXml_thenConverted(){
    RelationalJMapper relationalMapper
     = new RelationalJMapper<>(User.class,"user_jmapper2.xml");
    User user = new User(1L,"[email protected]");
    UserDto1 result1 = relationalMapper
      .oneToMany(UserDto1.class, user);
    UserDto2 result2 = relationalMapper
      .oneToMany(UserDto2.class, user);

    assertEquals(user.getId(), result1.getId());
    assertEquals(user.getEmail(), result1.getUsername());
    assertEquals(user.getId(), result2.getId());
    assertEquals(user.getEmail(), result2.getEmail());
}

10. 結論

このチュートリアルでは、JMapperを設定するさまざまな方法と、カスタム変換を実行する方法を学びました。

例の完全なソースコードはover on GitHubにあります。