JMapperガイド
1. 概要
このチュートリアルでは、JMapper –a fast and easy to use mapping framework.について説明します。
JMapperを構成するさまざまな方法、カスタム変換を実行する方法、およびリレーショナルマッピングについて説明します。
2. Mavenの構成
まず、JMapper dependencyをpom.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の両方に同じ名前のフィールドが複数ある場合は、グローバルマッピングを利用できます。
たとえば、idとemailの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。 したがって、UserをUserDtoにマップすると、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にあります。