MapStruct java类型转换工具使用

一 导入依赖到maven

        <!-- vo entity转换用开始-->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.3.1.Final</version>
        </dependency>

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.3.1.Final</version>
            <!-- IntelliJ does not pick up the processor if it is not in the dependencies.
             There is already an open issue for IntelliJ see https://youtrack.jetbrains.com/issue/IDEA-150621
            -->
            <scope>provided</scope>
        </dependency>
        <!-- vo entity转换用结束-->

SysUserVoConverter

/*
 * Copyright 2019 Wicrenet, Inc. All rights reserved.
 */
package com.xxx.producer.controller.converter;

import com.xxx.producer.controller.model.SysUserVo;
import com.xxx.producer.entity.SysUser;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

/**
 * 【转换帮助类】
 *
 * @author YJX
 * Created on 2019/11/09 10:25
 */
@Mapper(uses = {UserOrderVoConverter.class, OrderVoConverter.class})
public interface SysUserVoConverter {

    SysUserVoConverter MAPPER = Mappers.getMapper(SysUserVoConverter.class);

//    @Mapping(source = "userOrderVo", target = "userOrder")
    @Mapping(source = "userOrderVos", target = "userOrders")
    @Mapping(source = "orderVos", target = "orders") 
    @Mapping(source = "storeId",target = "store.id")
    @Mapping(source = "storeName",target = "store.name")
    SysUser toEntity(SysUserVo sysUserVo);

    @InheritInverseConfiguration
    SysUserVo toVo(SysUser sysUser);

    @Mapping(source = "userOrders", target = "userOrderVos")
    @Mapping(source = "orders", target = "orderVos")
    @Mapping(source = "storeId",target = "storeId")
    @Mapping(source = "createTime",target = "createTime")
    SysUserVo toVoPlus(SysUser sysUser);
}

OrderVoConverter

package com.xxx.producer.controller.converter;

import com.xxx.producer.entity.Order;
import com.xxx.producer.controller.model.OrderVo;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

/**
 * (RUserOrder)表实体类转换工具类
 *
 * @author YJX
 * @since 2019-11-09 13:43:07
 */
@Mapper
public interface OrderVoConverter {

    OrderVoConverter MAPPER = Mappers.getMapper(OrderVoConverter.class);

    Order toEntity(OrderVo vo);

    @InheritInverseConfiguration
    OrderVo toVo(Order entity);

}

UserOrderVoConverter

package com.xxx.producer.controller.converter;

import com.xxx.producer.entity.UserOrder;
import com.xxx.producer.controller.model.UserOrderVo;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

/**
 * (RUserOrder)表实体类转换工具类
 *
 * @author YJX
 * @since 2019-11-09 13:43:07
 */
@Mapper
public interface UserOrderVoConverter {

    UserOrderVoConverter MAPPER = Mappers.getMapper(UserOrderVoConverter.class);

    UserOrder toEntity(UserOrderVo vo);

    @InheritInverseConfiguration
    UserOrderVo toVo(UserOrder entity);

}

SysUserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.producer.dao.SysUserMapper">

    <resultMap type="com.xxx.producer.entity.SysUser" id="mapper">
        <result property="id" column="id"/>
        <result property="parentId" column="parent_id"/>
        <result property="createTime" column="create_time"/>
        <result property="storeId" column="store_id"/>
        <result property="hierarchy" column="hierarchy"/>
        <result property="name" column="name"/>
        <result property="password" column="password"/>
        <result property="enabled" column="enabled"/>
        <result property="phone" column="phone"/>
        <result property="deleted" column="deleted"/>
        <result property="userTypeEnums" column="user_type_enums"/>
    </resultMap>

    <resultMap type="com.xxx.producer.entity.SysUser" id="cascadeMapper">
        <result property="id" column="id"/>
        <result property="parentId" column="parent_id"/>
        <result property="hierarchy" column="hierarchy"/>
        <result property="name" column="name"/>
        <result property="password" column="password"/>
        <result property="enabled" column="enabled"/>
        <result property="phone" column="phone"/>
        <result property="createTime" column="create_time"/>
        <result property="deleted" column="deleted"/>
        <result property="userTypeEnums" column="user_type_enums"/>
        <association property="store" javaType="com.xxx.producer.entity.Store" columnPrefix="store_"
                     resultMap="com.xxx.producer.dao.StoreMapper.mapper"/>
        <collection property="userOrders" ofType="com.xxx.producer.entity.UserOrder">
            <result property="id" column="userOrder_id"/>
            <result property="orderId" column="userOrder_order_id"/>
            <result property="userId" column="userOrder_user_id"/>
        </collection>
    </resultMap>


    <select id="cascade1" resultMap="cascadeMapper" parameterType="com.xxx.producer.entity.SysUser">
        SELECT
            su.*,
            ts.id           AS store_id,
            ts.name         AS store_name,
            ts.create_time  AS store_create_time,
            ts.update_time  AS store_update_time,
            ruo.id          AS userOrder_id,
            ruo.order_id    AS userOrder_order_id,
            ruo.user_id     AS userOrder_user_id
        FROM sys_user su
        LEFT JOIN r_user_order ruo ON su.id = ruo.user_id
        LEFT JOIN t_store ts ON su.store_id = ts.id
        where su.password = #{user.password}
    </select>

    <select id="cascadeList" resultMap="cascadeMapper" parameterType="com.xxx.producer.entity.SysUser">
        SELECT
        su.*,
        ts.id           AS store_id,
        ts.name         AS store_name,
        ts.create_time  AS store_create_time,
        ts.update_time  AS store_update_time,
        ruo.id          AS userOrder_id,
        ruo.order_id    AS userOrder_order_id,
        ruo.user_id     AS userOrder_user_id
        FROM sys_user su
        LEFT JOIN r_user_order ruo ON su.id = ruo.user_id
        LEFT JOIN t_store ts ON su.store_id = ts.id
        where su.name = #{user.name}
    </select>

    <delete id="isDeleted">

    </delete>

</mapper>

StoreMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.producer.dao.StoreMapper">
    <resultMap type="com.xxx.producer.entity.Store" id="mapper">
        <result property="id" column="id"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>

</mapper>

UserOrderMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.producer.dao.OrderMapper">
    <resultMap type="com.xxx.producer.entity.UserOrder" id="mapper">
        <result property="id" column="id"/>
        <result property="userId" column="user_id"/>
        <result property="orderId" column="order_id"/>
    </resultMap>

</mapper>

使用方法

package com.xxx.producer.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxx.producer.aspect.PerformanceLog;
import com.xxx.producer.controller.converter.SysUserVoConverter;
import com.xxx.producer.controller.model.SysUserVo;
import com.xxx.producer.dict.DeletedEnum;
import com.xxx.producer.dict.UserTypeEnum;
import com.xxx.producer.entity.SysUser;
import com.xxx.producer.exception.SZException;
import com.xxx.producer.msg.PagingVO;
import com.xxx.producer.msg.Result;
import com.xxx.producer.service.SysUserService;
import com.xxx.producer.service.help.SysUserVoRecursionHelper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;

/**
 * (SysUser)表控制层
 *
 * @author yangjunxiong
 * @since 2019-11-12 12:18:09
 */
@RestController
@RequestMapping("/sysUser")
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;

    /**
     * 条件分页查询数据
     *
     * @param pagingVO 分页参数
     * @param vo       查询实体
     * @return 分页数据
     */
    @GetMapping(value = "/paging")
    public Result selectPage(PagingVO pagingVO, SysUserVo vo) {
        // 一 多表分页
//        long total = this.logBackDao.selectCount(beginTimeStamp, endTimeStamp, logName, levelStr);
//        long offset = PayingUtils.getOffset(pagingVO.getPageNo(), pagingVO.getPageSize(), total);
//        List<LogBackEvent> data = this.logBackDao.selectPaging(beginTimeStamp, endTimeStamp, logName, levelStr, offset);
//        pagingVO.setTotal(data.size());
//        pagingVO.setRows(data);
//        if (CollectionUtils.isNotEmpty(data)) {
//            return Result.ok().put("data",pagingVO);
//        }

        ArrayList<UserTypeEnum> userTypeEnums = new ArrayList<>();
        userTypeEnums.add(UserTypeEnum.STUDENT);
        userTypeEnums.add(UserTypeEnum.TEACHER);

        // 单表分页
        IPage<SysUser> page = this.sysUserService.page(new Page<>(pagingVO.getPage(), pagingVO.getLimit()), new LambdaQueryWrapper<SysUser>()
//                .in(CollectionUtils.isNotEmpty(userTypeEnums), SysUser::getUserTypeEnums, UserTypeEnum.toMark(userTypeEnums))
                        .likeRight(StringUtils.isNotEmpty(vo.getHierarchy()), SysUser::getHierarchy, vo.getHierarchy() + vo.getId())//查询子节点需要加根节点的id
        );
        List<SysUserVo> collect = page.getRecords().stream().map(SysUserVoConverter.MAPPER::toVoPlus).collect(Collectors.toList());
        return Result.ok().put("data", collect).put("count", page.getPages());
    }


    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("/{id}")
    public Result selectOne(@PathVariable Serializable id) {
        SysUser byId = this.sysUserService.getById(id);
        return Result.ok().put("data", SysUserVoConverter.MAPPER.toVoPlus(byId));
    }

    /**
     * 新增数据
     *
     * @param vo 实体对象
     * @return 新增结果
     */
    @PostMapping
    public Result insert(@RequestBody SysUserVo vo) {
        Optional<String> verify = vo.verify();
        if (verify.isPresent()) {
            return Result.error(verify.get());
        }
        int count = this.sysUserService.count(new LambdaQueryWrapper<SysUser>().eq(StringUtils.isNotEmpty(vo.getPassword()), SysUser::getPassword, vo.getPassword()));
        if (count >= 1) {
            return Result.error("该数据已存在");
        }
        SysUser byId = this.sysUserService.getById(vo.getParentId());
        if (Objects.isNull(byId)) {
            return Result.error("父节点不存在!");
        }
        int hierarchyDeep = getHierarchyDeep(byId.getHierarchy());
        if (hierarchyDeep == 10) {
            return Result.error("最多挂载10层,无法继续挂载子节点");
        }

        SysUser sysUser = SysUserVoConverter.MAPPER.toEntity(vo);
        return this.sysUserService.save(sysUser) ? Result.ok().put("id", sysUser.getId()) : Result.error("保存失败");

    }

    /**
     * 根据树路径获取层级
     *
     * @return 层级
     */
    private int getHierarchyDeep(String hierarchy) {
        return (int) (Arrays.stream(hierarchy.split("/")).filter(StringUtils::isNotBlank).count() + 1);
    }



    /**
     * 修改数据
     *
     * @param vo 实体对象
     * @return 修改结果
     */
    @PutMapping
    public Result update(@RequestBody SysUserVo vo) {
        vo.verify(false, "password");
        SysUser byId = this.sysUserService.getById(vo.getId());
        if (Objects.isNull(byId)) {
            return Result.error("修改的数据不存在");
        }
        SysUser byId1 = this.sysUserService.getById(byId.getParentId());
        SysUser sysUser = SysUserVoConverter.MAPPER.toEntity(vo);
        sysUser.setHierarchy(byId1.getHierarchy() + byId.getParentId() + "/");
        boolean b = this.sysUserService.updateById(sysUser);
        return b ? Result.ok().put("id", sysUser.getId()) : Result.error("修改失败");
    }

    /**
     * 修改挂载节点
     * @author YJX
     * @date 2019/11/24 11:55
     * @param id
     * @param newParentId
     **/
    @PutMapping(value = "update_hierarchy")
    public Result updateHierarchy(Long id,Long newParentId) {
        SysUser byId = this.sysUserService.getById(id);
        if (Objects.isNull(byId)) {
            throw new SZException("修改的数据不存在!");
        }
        SysUser newParent = this.sysUserService.getById(newParentId);
        if (0 != newParentId) {
            if (Objects.isNull(newParent)) {
                throw new SZException("挂载的父节点不存在");
            }
        }
        //维护层级字段
        if (!byId.getParentId().equals(newParentId)) {
//            改变了父节点  所有子节点的层级字段需要维护
            this.sysUserService.updateHierarchy(id,newParentId);
        }
        return Result.ok();
    }


    /**
     * 删除数据
     *
     * @param ids 主键结合
     * @return 删除结果
     */
    @DeleteMapping
    public Result delete(@RequestParam("ids") List<Long> ids) {
        return this.sysUserService.removeByIds(ids) ? Result.ok() : Result.error("删除失败");
    }


    /*
     * 【 递归查询 】
     *
     * @author yangjunxiong
     * @date 2019/11/12 15:03
     * @param id
     * @return com.xxx.producer.msg.Result
     **/
    @GetMapping("/recursion/{id}")
    @ResponseBody
    public Result recursion(@PathVariable Long id) {
        System.out.println("id = " + id);
        SysUser one = this.sysUserService.getOne(new QueryWrapper<SysUser>().lambda().eq(SysUser::getId, id));
        if (Objects.isNull(one)) {
            return Result.error("该节点不存在");
        }

        //查询one节点
        List<SysUser> userList = this.sysUserService.list(new LambdaQueryWrapper<SysUser>().likeRight(SysUser::getHierarchy,one.getHierarchy()));

        //转成Vo
        List<SysUserVo> sysUserVoList = userList.stream().map(SysUserVoConverter.MAPPER::toVoPlus).collect(Collectors.toList());

        //找出父节点
        List<SysUserVo> parentNode = sysUserVoList.stream().filter(model -> Objects.equals(model.getParentId(), one.getParentId())).collect(Collectors.toList());

        //递归成树
        List<SysUserVo> sysUserVos = SysUserVoRecursionHelper.toTree(parentNode.get(0).getParentId(), sysUserVoList);

        return Result.ok().put("data", sysUserVos);
    }

    /*
     * 【 级联查询 】
     *
     * @author yangjunxiong
     * @date 2019/11/12 14:57
     * @param sysUserVo
     * @param pagingVO
     * @return com.xxx.producer.msg.Result
     **/
    @GetMapping("/lambda_cascade")
    @ResponseBody
    @PerformanceLog(title = "lambda_cascade测试", maxTime = 1)
    public Result cascade(@RequestBody SysUserVo sysUserVo) {
        //校验全部参数
//        Optional<String> verify = sysUserVo.verify();
        //校验指定参数
        sysUserVo.verify("name");
        //校验 未排除校验参数
//        Optional<String> verify = sysUserVo.verify(false, "name");


        Optional<SysUserVo> optional = this.sysUserService.cascade1(SysUserVoConverter.MAPPER.toEntity(sysUserVo)).map(SysUserVoConverter.MAPPER::toVo);

        return Result.ok().put("data", optional.orElseGet(SysUserVo::new));
    }

    /*
     * 【 级联查询 】
     *
     * @author yangjunxiong
     * @date 2019/11/12 14:57
     * @param sysUserVo
     * @param pagingVO
     * @return com.xxx.producer.msg.Result
     **/
    @GetMapping("/lambda_cascade_list")
    @ResponseBody
    @PerformanceLog(title = "lambda_cascade测试", maxTime = 1)
    public Result cascadeList(@RequestBody SysUserVo sysUserVo) {
        //校验全部参数
//        Optional<String> verify = sysUserVo.verify();
        //校验指定参数
        sysUserVo.verify("name");
        //校验 未排除校验参数
//        Optional<String> verify = sysUserVo.verify(false, "name");

        ArrayList<SysUserVo> sysUserVos = new ArrayList<>();
        this.sysUserService.cascadeList(SysUserVoConverter.MAPPER.toEntity(sysUserVo)).forEach(sysUser -> sysUserVos.add(SysUserVoConverter.MAPPER.toVo(sysUser)));

        return Result.ok().put("data", sysUserVos);
    }


    /*
     * 【 是否逻辑删除 】
     * @param ids
     **/
    @DeleteMapping("/delFlag/{ids}")
    public Result delFlag(@PathVariable("ids") List<Long> ids) {
        return this.sysUserService.delFlag(ids, DeletedEnum.IS_DELETE) ? Result.ok("操作成功!") : Result.error("操作失败!");
    }

}
发布了71 篇原创文章 · 获赞 3 · 访问量 8759

猜你喜欢

转载自blog.csdn.net/qq_40250122/article/details/103198787