封裝MongoDB通用Dao

樓主在開發過程中使用mongodb時發現mongodb沒有像mybaties-generator那樣的工具來生成dao層接口,需要手動實現,感覺有點麻煩,便心血來潮封裝了一些常用的增刪改查的通用接口。使開發人員使用mongodb開發時更加簡單方便。子類dao繼承後需指定bean類型。如有錯誤歡迎大家指正。具體代碼如下:
MongodbBaseDao.java:

import com.mongodb.client.result.DeleteResult;
import org.bson.Document;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mapping.MappingException;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.util.Pair;
import org.springframework.util.Assert;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.Date;
import java.util.List;

public class MongodbBaseDao<T> {
    @Autowired
    private MongoTemplate mongoTemplate;
    public void insert(T t) {
        mongoTemplate.insert(t);
    }
    public DeleteResult delete(T t){
        return mongoTemplate.remove(t);
    }
    public DeleteResult deleteById(Object id){
        T t = mongoTemplate.findById(id, getTClass());
        return delete(t);
    }
    public DeleteResult delete(Query query){
        return mongoTemplate.remove(query,getTClass());
    }

    public void update(T t) {
       mongoTemplate.save(t);
    }
    public T findById(Object id) {
        return mongoTemplate.findById(id,getTClass());
    }
    public List<T> findAll() {
        return mongoTemplate.findAll(getTClass());
    }
    public List<T> find(Query query){
        return mongoTemplate.find(query,getTClass());
    }

    public boolean exists(Query query){
        return  mongoTemplate.exists(query,getTClass());
    }
    public boolean exists(T t){
        return  exists(getIdQueryFor(t));
    }
    public boolean exitsById(Object id){
        return exists(findById(id));
    }
    public long count(Query query) {
        return mongoTemplate.count(query,getTClass());
    }
    private Class<T> getTClass() {
        Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        return tClass;
    }
    private Pair<String, Object> extractIdPropertyAndValue(Object object) {
        Assert.notNull(object, "Id cannot be extracted from 'null'.");
        Class<?> objectType = object.getClass();
        if (object instanceof Document) {
            return Pair.of("_id", ((Document)object).get("_id"));
        } else {
            MongoPersistentEntity<?> entity = (MongoPersistentEntity)mongoTemplate.getConverter().getMappingContext().getPersistentEntity(objectType);
            if (entity != null && entity.hasIdProperty()) {
                MongoPersistentProperty idProperty = (MongoPersistentProperty)entity.getIdProperty();
                return Pair.of(idProperty.getFieldName(), entity.getPropertyAccessor(object).getProperty(idProperty));
            } else {
                throw new MappingException("No id property found for object of type " + objectType);
            }
        }
    }

    private Query getIdQueryFor(Object object) {
        Pair<String, Object> id = this.extractIdPropertyAndValue(object);
        return new Query(Criteria.where((String)id.getFirst()).is(id.getSecond()));
    }


}

子類dao:

@Repository
public class PropertyDao extends MongodbBaseDao<PropertyManage>{

}

sevice層代碼:

@Service
public class PropertyServiceImpl implements PropertyService {
    @Autowired
    private PropertyDao propertyDao;

    @Override
    public List<PropertyManage> list(String application, String key, String profile, String status) {
        Criteria criteria = Criteria.where("id").ne(null);
        if (application != null && application.length() > 0) {
            criteria.and("application").is(application);
        }
        if (key != null && key.length() > 0) {
            criteria.and("key").is(key);
        }
        if (profile != null && profile.length() > 0){
            criteria.and("profile").is(profile);
        }
        if (status != null && status.length() > 0) {
            criteria.and("status").is(Integer.parseInt(status));
        }
        return propertyDao.find(Query.query(criteria));
    }

    @Override
    public boolean modify(PropertyManage propertyManage) {
        propertyDao.update(propertyManage);
        return true;
    }

    @Override
    public boolean delete(String id) {
        return propertyDao.deleteById(id).getDeletedCount() > 0;
    }

    @Override
    public boolean add(PropertyManage propertyManage) {
        propertyDao.insert(propertyManage);
        return true;
    }

    @Override
    public PropertyManage findById(String id) {
        return propertyDao.findById(id);
    }

    @Override
    public boolean eixsts(PropertyManage propertyManage) {
        return propertyDao.exists(propertyManage);
    }

如需轉載請標明出處https://blog.csdn.net/u014682892/article/details/82663442,謝謝合作!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章