mybatis-plus代码生成下如何对实体类进行属性扩展

前言

mybatis-plus的逆向工程帮助我们解决许多项目启动初期的很多繁琐操作,对于代码生成我们现在也是用的越来越普遍了。那么在这种模式下生成的实体类是表与实体一对一存在的,那么我们如何通过代码去实现实现属性的扩展,本篇文章提供一种解决思路,当然方法不止一种,也希望伙伴们能够一起讨论。

场景:用户表—用户实体类 权限表----权限实体。
目的:将权限信息扩展到实体类上。

实体类:

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_user")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    private String username;

    private String password;

    private Date createTime;

    private String salt;

    private String nickName;

    private String yx;
    private String gs;
    private String bm;
    private String zw;
    private String dz;
}

UserVo继承User并进行属性扩展

@Data
public class UserVo extends User {
    //角色信息
    @ApiModelProperty(hidden = true)
    private List<Role> roleList;
    //权限信息
    @ApiModelProperty(hidden = true)
    private List<Permission> permissionList;
}

我们写一个工具类来进行此操作
这里使用抽象类。E代表泛指父类,V泛指子类。

public abstract  class BaseEntityWrapper<E,V> {

    public BaseEntityWrapper(){
    }
    /**
     * 定义一个规范,子类各自实现自己的业务逻辑,
     * @return
     */
    public abstract  V entityVO(E entity);
    
}

创建UserWrapper继承BaseEntityWrapper,实现属性扩展。

@Component
public class UserWrapper extends BaseEntityWrapper<User, UserVo> {
    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private PermissionMapper permissionMapper;

    public static UserWrapper userWrapper;

    //流式编程
    public static UserWrapper build() {
        return userWrapper;
    }

    /**
     * 当Spring注入到管理到此类的时候,就会立马执行带有此注解的方法。
     */
    @PostConstruct
    public  void init(){
        userWrapper = this;
    }

    /**
     * 赋值操作
     */
    @Override
    public  UserVo entityVO(User user) {
        UserVo userVo = new UserVo();
        if (user != null) {
            try {
                //因为我们最后需要返回子类,所以在此处我们需要将user的其他信息都赋值到子类上。
                userVo = BeanUtil.copyFromFather(user,userVo);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //进行数据查询并赋值,根据自己业务去操作
            List<Role> roles = roleMapper.findRoleByUserId(user.getId());
            List<Permission> permissions = new ArrayList<>();
            for (Role role : roles) {
                for (Permission permission :permissionMapper.findPermissionListByRoleId(role.getId())) {
                    permissions.add(permission);
                }
            }
            userVo.setPermissionList(permissions);
            userVo.setRoleList(roles);
        }
        return userVo;
    }
}

copyFromFather方法:
这里是使用反射来进行赋值的

public class BeanUtil {

    public static <T,E> E  copyFromFather(T father, E child) throws Exception {

        //判断是否是父子类关系
        if(child.getClass().getSuperclass() != father.getClass()){
            throw  new Exception("参数异常!,非继承关系");
        }
        Class<?> fatherClass = father.getClass();
        Field[] fields = fatherClass.getFields();
        for (Field field : fields) {
            Method method = fatherClass.getDeclaredMethod("get"+upperFirstChar(field.getName()));
            Object obj = method.invoke(father);
            field.setAccessible(true);
            field.set(child,obj);
        }
        return child;
    }

    private static String upperFirstChar(String simpleName) {
        char[] chars = simpleName.toCharArray();
        //32 是大写小ASCII 字母的差值. 比如 a 是96 A 64
        chars[0] +=(1>>5);
        return String.valueOf(chars);
    }
}

测试

 System.out.println("==============="+UserWrapper.build().entityVO(user).toString());

结果成功对User的属性进行了扩展。

最后,如果大佬们发现了错误或者有更好的方法,希望指点一二,在此感谢了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章