前言
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 roleList;
//权限信息
@ApiModelProperty(hidden = true)
private List permissionList;
}
我们写一个工具类来进行此操作 这里使用抽象类。E代表泛指父类,V泛指子类。
public abstract class BaseEntityWrapper {
public BaseEntityWrapper(){
}
/**
* 定义一个规范,子类各自实现自己的业务逻辑,
* @return
*/
public abstract V entityVO(E entity);
}
创建UserWrapper继承BaseEntityWrapper,实现属性扩展。
@Component
public class UserWrapper extends BaseEntityWrapper {
@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 roles = roleMapper.findRoleByUserId(user.getId());
List 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 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的属性进行了扩展。
最后,如果大佬们发现了错误或者有更好的方法,希望指点一二,在此感谢了!