Java实体Bean映射器的ModelMapper使用

最近在项目开发中,各个模块中经常因为业务场景交互,会大量使用到搜索和查询的一些业务方法。

但是又不能影响其它模块已定义好的实体Bean对象,所以根据业务场景搜索结果定义不同的实体Bean对象,这样在代码中就会有很多不同的实体Bean转换的冗余代码。


1.ModelMapper 几个基础API方法

ModelMapper这个工具的入口类就是ModelMapper,因此转换就需要从这个类入口.简单看下API

(1)addConverter() :顾名思义,添加转换器

(2)addMappings() :添加映射器

(3)createTypeMap() :创建A-B的转换器关系

(4)getConfiguration() :获取配置

(5)map() ;映射处理


2.简单Model转换

public void testUserInfo(){

User user = new User();

user.setId(10000)

user.setName("Tom")

user.setAge(20);

user.setSex("男");


ModelMapper modelMapper = new ModelMapper();

// 转换
UserInfo obj = modelMapper.map(user, UserInfo.class);

}

该方法的优势就是可以自定义转换关系,实现不同的属性,不同类型的属性的复制,应用很广泛,但是也有一些缺点,就是没有的属性会为空值.


3.自定义转换

自定义有很多转换,比如Provider,Converter,Condition,PropertyMap等,以下是个综合的几个个例

@Test
    public void testUserToUserInfo(){
        User user = new User();
        user.setId(10000)
user.setName("Tom")
user.setAge(20);
user.setSex("男");
        ModelMapper modelMapper = new ModelMapper();

        //转换内容提供者
        Provider<String> personProvider = new AbstractProvider<String>() {
            public String get() {
                return "自定义提供者";
            }
        };
        //创建自定义转换规则
        Converter<String, String> toUppercase = new AbstractConverter<String, String>() {
            protected String convert(String source) {
                System.out.println(source);
                return source == null ? null : source.toUpperCase();
            }
        };
        //创建自定义条件转换
        Condition<Long,?> gt2 = context -> {
            System.out.println(context.getSource());
            return context.getSource() > 2;
        };
        //创建自定义映射规则
        PropertyMap<User,UserInfo> propertyMap = new PropertyMap<User, UserInfo>() {
            @Override
            protected void configure() {
                using(toUppercase).map(source.getName(),destination.getHonor());//使用自定义转换规则
                with(personProvider).map(source.getHonor(),destination.getName());//使用自定义属性提供覆盖
                map(source.getAvatar()).setAvatar(null);//主动替换属性
                skip(destination.getAge());
                when(gt2).map().setId(10000);//过滤属性
            }
        };
        //添加映射器
        modelMapper.addMappings(propertyMap);
        modelMapper.validate();
        //转换
        UserInfo userInfo = modelMapper.map(user,UserInfo.class);
        System.out.println(userInfo);
    }

分析下:
Provider,Converter,Condition三个都算是转换前奏,所有的转换规则都是在PropertyMap里面配置.所以分析这个里面的配置即可.
1.using(toUppercase).map(source.getName(),destination.getHonor());//使用自定义转换规则
首先toUppercase是一个Converter,也就是sources的name会经过这个转换器,然后才设置到destination的honor中.
2.with(personProvider).map(source.getHonor(),destination.getName());//使用自定义属性提供覆盖
personProvider类似一个Bean工厂,当使用这个的时候,对于sources调用getHonor()的时候实际上是调用personProvider的get方法.所以结果name='自定义提供者'
3.map(source.getAvatar()).setAvatar(null);//主动替换属性
可以主动重设某些属性
4.skip(destination.getAge());
过滤指定属性
5.when(gt2).map().setId(10000);//条件过滤属性
条件过滤属性,当满足gt2的时候才会调用setId方法.


4.对于集合的映射

对于集合的映射,因为泛型擦除的存在,所以需要告诉ModelMapper要转换的类型,所以就有了TypeToken这个类.

@Test
    public void testListToListDto() {
        User user1 = new User();
        user.setId(10000)
user.setName("Tom")
user.setAge(20);
user.setSex("男");

        User user2 = new User();
        user.setId(10000)
user.setName("Jual")
user.setAge(20);
user.setSex("女");
        List<User> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);


        ModelMapper modelMapper = new ModelMapper();
        List<UserInfo> userInfo = modelMapper.map(users,new TypeToken<List<UserInfo>>() {}.getType());
        System.out.println(userInfo);
    }


5.Manven地址:

<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>1.1.0</version>
</dependency>

猜你喜欢

转载自blog.csdn.net/szxiaohe/article/details/80029983