好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

MapStruct实体转换及List转换的方法讲解

开发中,我们经常需要将po转dto、dto转po等一些实体间的转换。比较出名的有beanutil 和modelmapper等,它们使用简单,但是在稍显复杂的业务场景下力不从心。mapstruct这个插件可以用来处理domin实体类与model类的属性映射,可配置性强。只需要定义一个 mapper 接口,mapstruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现。mapstruct官网地址: http://mapstruct.org/

引入依赖

?

1

2

3

4

5

<dependency>

   <groupid>org.mapstruct</groupid>

   <artifactid>mapstruct-jdk8</artifactid>

   <version> 1.1 . 0 . final </version>

</dependency>

需求

我们假设有学生student 类 需要转换成 用户 user 类,将学生信息存入用户信息库

此时student 类内容如下:

?

1

2

3

4

5

6

7

public class student {

   private integer id;

   private string name;

   private integer age;

   private string sex;

   //setters, getters, tostring() 方法此处省略不写,但是实际开发需要写的哦

   }

此时user 类内容如下:

?

1

2

3

4

5

6

7

public class user {

   private integer id;

   private string name;

   private integer age;

   private string sex;

   //setters, getters, tostring() 方法此处省略不写,但是实际开发需要写的哦

  }

转换model

此时 student 和 user 的属性名字都相同那么转换接口就是

?

1

2

3

4

5

6

7

8

9

10

import org.mapstruct.mapper;

@mapper (componentmodel = "spring" )

public interface usermapping {

   /**

    * student 转化为 user

    * @param student

    * @return

    */

    user studenttouser(student student);

}

程序运行前要先编译 mvn clean compile , 从而mapstruct框架生成usermappingimpl 实现类。

转换model 属性不匹配

如果 user 和 student 的属性名不对应例如:

此时student 类内容如下:

?

1

2

3

4

5

6

7

public class student {

   private integer id;

   private string sname;

   private integer age;

   private string sex;

   //setters, getters, tostring() 方法此处省略不写,但是实际开发需要写的哦

   }

此时user 类内容如下:

?

1

2

3

4

5

6

7

public class user {

   private integer id;

   private string uname;

   private integer age;

   private string sex;

   //setters, getters, tostring() 方法此处省略不写,但是实际开发需要写的哦

  }

那么转换接口为

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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);

}

转换model 属性类型不匹配

比如说user 类的sex字段类型改为boolean

此时user 类内容如下:

?

1

2

3

4

5

6

7

public class user {

   private integer id;

   private string uname;

   private integer age;

   private boolean sex;

   //setters, getters, tostring() 方法此处省略不写,但是实际开发需要写的哦

  }

这个转换需求有点变态,所以 需要我门自己写个转换类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public class usertransform {

   public string booleantostring( boolean value){

     if (value){

       return "男" ;

     }

     return "女" ;

   }

   public boolean strtoboolean(string str){

     if ( "男" .equals(str)) {

       return true ;

     }

     return false ;

   }

}

那么转换接口为(使用 usertransform.class 类)

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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);

}

转换list

当user 和 student 都是集合形式list 时应当如下转换

转化 list<> 集合时必须有 实体转化,因为在实现中,list 转换是 for循环调用 实体转化的。所以当属性名不对应时,应该在 实体转化进行 @mappings 的属性名映射配置,然后list的转换也会继承这和属性的映射。

例如 属性名相同

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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);

属性名不同:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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 compile 后自动生成)

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

@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;

   }

}

参考资料 : http://HdhCmsTesttuohang.net/article/178072.html

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接

原文链接:https://blog.csdn.net/u012373815/article/details/88367456

查看更多关于MapStruct实体转换及List转换的方法讲解的详细内容...

  阅读:15次