前言
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的屬性進行了擴展。
最後,如果大佬們發現了錯誤或者有更好的方法,希望指點一二,在此感謝了!