com.baomidou.mybatisplus.extension.service.impl.ServiceImplを継承することで、エンティティクラスにデフォルト値を付与

10883 ワード

プロジェクトでは、各エンティティクラスに共通のプロパティがあります.たとえば、作成者、作成時間、変更時間などの情報があります.各モジュールのserviceレイヤで各エンティティクラスに属性付与を行い、手間がかかります.mybatisのサービス実装クラスを継承し、クラスの反射メカニズムによって、エンティティクラスに対する汎用属性の付与を実現する可能性がありますか.mybatisのサービス実装クラスは汎用型を用い,汎用型を実現する.したがって継承クラスも汎用性を用いて汎用性を実現する.コードは次のとおりです.
トップページのサブクラスは汎用を使用し、汎用を親に渡します.
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;
  }