通过继承com.baomidou.mybatisplus.extension.service.impl.ServiceImpl实现给实体类赋默认值

在项目中,每个实体类会有一些通用属性,比如创建人,创建时间、修改时间等信息。在每个模块的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) 方法
```java
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;
  }

你可能感兴趣的:(通过继承com.baomidou.mybatisplus.extension.service.impl.ServiceImpl实现给实体类赋默认值)