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的屬性進行了擴展。

最後,如果大佬們發現了錯誤或者有更好的方法,希望指點一二,在此感謝了!

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