栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MapStruct 简化映射

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MapStruct 简化映射

简化 Java bean 类型之间映射

学习视频链接:https://www.bilibili.com/video/BV1E5411n7HR?from=search&seid=9468054775434592661&spm_id_from=333.337.0.0

目录
  • 1 使用
  • 2 @Mapper
  • 3 @Mappings与@Mapping
  • 4 @MappingTarget和@AfterMapping
  • 5 批量转换
  • 6 @BeanMapping
  • 7 @InheritConfiguration
  • 8 @InheritInverseConfiguration

1 使用
		
            org.mapstruct
            mapstruct
            1.3.1.Final
        

        
            org.mapstruct
            mapstruct-processor
            1.3.1.Final
        
...

    1.4.2.Final

...

    
        org.mapstruct
        mapstruct
        ${org.mapstruct.version}
    

...

    
        
            org.apache.maven.plugins
            maven-compiler-plugin
            3.8.1
            
                1.8
                1.8
                
                    
                        org.mapstruct
                        mapstruct-processor
                        ${org.mapstruct.version}
                    
                
            
        
    

...

可以创建interface或者abstract class

package com.example.demo.mapper;

import com.example.demo.pojo.User;
import com.example.demo.pojo.UserRoleDto;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;


@Mapper
public interface UserRoleMapper {

    //ClassLoader 加载方式
    UserRoleMapper INSTANCE=Mappers.getMapper(UserRoleMapper.class);

    @Mappings({
            @Mapping(source = "id", target = "id"),
            @Mapping(source = "username", target = "username"),
            @Mapping(source = "role.roleName", target = "roleName")
    })
    UserRoleDto toUserRoleDto(User user);

}

package com.example.demo.mapper;

import com.example.demo.pojo.User;
import com.example.demo.pojo.UserRoleDto;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;


@Mapper
public abstract class UserRoleMapper {

    //ClassLoader 加载方式
    public static UserRoleMapper INSTANCE=Mappers.getMapper(UserRoleMapper.class);
    
    public  abstract   UserRoleDto toUserRoleDto(User user);
    
}

2 @Mapper
  • 同类型且同名的属性会自动映射
  • MapStruct会自动类型转换
    • 8种基本类型和他们对应的包装类型之间
    • 8种基本类型(包括他们的包装类型)和string之间
    • 日期类型和string之间
3 @Mappings与@Mapping
  • 指定属性之间的映射关系
    • 日期格式化:dateFormat = "yyyy-MM-dd HH:mm:ss"
    • 数字格式化:numberFormat = "#.00"
  • source或target多余的属性对方没有,不会报错
  • ignore
  • 引用对象的映射处理
  • 批量映射
4 @MappingTarget和@AfterMapping

在映射最后一步对属性的自定义映射处理
@MappingTarget:表明传来的对象是已经赋过值的
@AfterMapping:表示让MapStruct在调用完自动转换的方法之后,会来自动调用本方法

package com.example.demo.mapper;

import com.example.demo.pojo.*;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;
import org.springframework.util.StringUtils;


@Mapper
public abstract class UserRoleMapper {

    //ClassLoader 加载方式
    public static  UserRoleMapper INSTANCE=Mappers.getMapper(UserRoleMapper.class);

    public  abstract UserRoleDto toUserRoleDto(User user);

    @AfterMapping
        //表示让MapStruct在调用完自动转换的方法之后,会来自动调用本方法
    void after(User user, @MappingTarget UserRoleDto userRoleDto) {
        //@MappingTarget:表明传来的对象是已经赋过值的

        String username = user.getUsername();
        if (username != null && !StringUtils.isEmpty(username)){
            userRoleDto.setRoleName(username);
        }

    }

}

5 批量转换
package com.example.demo.mapper;

import com.example.demo.pojo.*;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;
import org.springframework.util.StringUtils;

import java.util.List;


@Mapper
public abstract class UserRoleMapper {

    //ClassLoader 加载方式
    public static  UserRoleMapper INSTANCE=Mappers.getMapper(UserRoleMapper.class);

    //集合批量转换
    public  abstract List toListDto(List user);

}

package com.example.demo.test;

import com.example.demo.mapper.UserRoleMapper;
import com.example.demo.pojo.Role;
import com.example.demo.pojo.User;
import com.example.demo.pojo.UserRoleDto;

import java.util.ArrayList;
import java.util.List;


public class Test {

    public static void main(String[] args) {
        Role role = new Role(2L, "administrator", "用户");
        User user1 = new User(1001L,"张三","123456","15222222222","2626@qq.com",role);
        User user2 = new User(1002L,"李四","123456","15222222222","2626@qq.com",role);
        User user3 = new User(1003L,"王五","123456","15222222222","2626@qq.com",role);

        List users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        users.add(user3);

        List dto = UserRoleMapper.INSTANCE.toListDto(users);
        System.out.println(dto);

    }

}

6 @BeanMapping

ignoreByDefault :忽略MapStruct的默认映射行为。只映射那些@Mapping设置了的属性避免不需要的赋值、避免属性覆盖

@BeanMapping(ignoreByDefault = true)
@Mapping(source = "id", target = "id")
public  abstract Ids toIds(User user);
Role role = new Role(2L, "administrator", "用户");
User user1 = new User(1001L,"张三","123456","15222222222","2626@qq.com",role);



Ids ids = UserRoleMapper.INSTANCE.toIds(user1);
System.out.println("---"+ids);
输出:---Ids(id=1001, username=null)
7 @InheritConfiguration

更新的场景

@BeanMapping(ignoreByDefault = true)
@Mapping(source = "id", target = "id")
@Mapping(source = "username", target = "username")
public  abstract Ids toIds(User user);


@InheritConfiguration
@Mapping(target = "id", ignore = true)
public  abstract void toUpdate(User user, @MappingTarget Ids Ids) ;
package com.example.demo.test;

import com.example.demo.mapper.UserRoleMapper;
import com.example.demo.pojo.Ids;
import com.example.demo.pojo.Role;
import com.example.demo.pojo.User;
import com.example.demo.pojo.UserRoleDto;

import java.util.ArrayList;
import java.util.List;


public class Test {

    public static void main(String[] args) {
        Role role = new Role(2L, "administrator", "用户");
        User user1 = new User(1001L,"zhangsan","123456","null","2626@qq.com",role);

        Ids ids = UserRoleMapper.INSTANCE.toIds(user1);
        System.out.println(ids);

        User user2 = new User();
        user2.setUsername("lisi");
        System.out.println(user2);

        //通过user2的属性来更新已经存在的对象
        UserRoleMapper.INSTANCE.toUpdate(user2,ids);
        System.out.println(ids);
    }
}

输出:
Ids(id=1001, username=zhangsan, phoneNum=null)
User(id=null, username=lisi, password=null, phoneNum=null, email=null, role=null)
Ids(id=1001, username=lisi, phoneNum=null)
8 @InheritInverseConfiguration

反向映射。只继承@Mapping注解配置,不会继承@BeanMapping
name:指定使用哪一个方法的配置,写方法的名字

@BeanMapping(ignoreByDefault = true)
@Mapping(source = "id", target = "id")
@Mapping(source = "username", target = "username")
public  abstract Ids toIds(User user);


@BeanMapping(ignoreByDefault = true)
@InheritInverseConfiguration(name = "toIds")
public  abstract User inverse(Ids ids);
package com.example.demo.test;

import com.example.demo.mapper.UserRoleMapper;
import com.example.demo.pojo.Ids;
import com.example.demo.pojo.Role;
import com.example.demo.pojo.User;
import com.example.demo.pojo.UserRoleDto;

import java.util.ArrayList;
import java.util.List;


public class Test {

    public static void main(String[] args) {

        Ids ids = new Ids(1001L,"zhangsan","15222222222");
        System.out.println(ids);
        User user = UserRoleMapper.INSTANCE.inverse(ids);
        System.out.println(user);

    }


}

输出:
Ids(id=1001, username=zhangsan, phoneNum=15222222222)
User(id=1001, username=zhangsan, password=null, phoneNum=null, email=null, role=null)
mapper层
@Component
@Mapper
public abstract class UserRoleMapper {
	//ClassLoader 加载方式
    public static  UserRoleMapper INSTANCE=Mappers.getMapper(UserRoleMapper.class);
}

controller层
@Resource
private UserRoleMapper userRoleMapper;
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/684715.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号