通过继承com.baomidou.mybatisplus.extension.service.impl.ServiceImpl实现给实体类赋默认值_zhrzhhymaffia的专栏-CSDN博客 ---- mybatis plus 开坑

在项目中,每个实体类会有一些通用属性,比如创建人,创建时间、修改时间等信息。在每个模块的service层给每个实体类进行属性赋值,费时费事。有没有可能写通过继承mybatis的service实现类,通过类的反射机制,实现对实体类的通用属性赋值。
mybatis的service实现类使用泛型,实现通用型。因此继承类也要使用泛型,实现通用性。代码如下

首页子类使用泛型,并将泛型传给父类。

MyServiceImpl<M extends BaseMapper<T>, T> extends ServiceImpl<M,T>

定义所有实体类的通用属性名称

private String [] properNames = new String[]{"fcreateTime","fcreateUserId","fcreateUserName"};
重写 public boolean save(T entity) 方法

public boolean save(T entity) {

//获得登录用户信息(shiro)

User user = (User) SecurityUtils.getSubject().getPrincipal();

String userId = user == null ? "" : String.valueOf(user.getUserId());
String userName = user == null ? "" : String.valueOf(user.getUsername());

//定义object数组,存储属性默认值,类型一定要跟实体类中定义的一致,不然会报错

Object[] properValues = new Object[]{new Date(), userId, userName};
Class<?> clazz = entity.getClass();
 //通过类的反射机制,获得类型的所有属性和属性的get、set方法。
Field[] fields = clazz.getDeclaredFields();
//写数据
int index = 0;
for (Field field : fields) {
    if (index == properNames.length) {
        break;
    }
    for (int i = 0; i < properNames.length; i++) {
        if (properNames[i].equalsIgnoreCase(field.getName())) {//判断属性是否是默认值属性
            try {
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
                Method wM = pd.getWriteMethod();//获得写方法
                wM.invoke(entity, properValues[i]);//调用set方法,给属性赋值
                index++;
                continue;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}
return retBool(this.baseMapper.insert(entity));

}


在sava方法中,定义需要处理的默认值属性数组和默认值数组,为了减少时间复杂度,定义游标index,记录默认值是否处理完成,处理完的即跳出循环。

if (index == properNames.length) {

 break;

}


---------------------------------------------------

原网址: [访问](https://blog.csdn.net/zhrzhhymaffia/article/details/104359290)
创建于: 2021-06-02 15:39:02
目录: default

请先后发表评论
  • 最新评论
  • 总共0条评论