一、SpringBoot 集成MongoDB 引用 spring-boot-starter-data-mongodb 包
org.springframework.boot
spring-boot-starter-data-mongodb
二、spring-boot-starter-data-mongodb包提供的 MongoRepository 提供了各种查询方法和保存方法
@NoRepositoryBean
public interface MongoRepository extends PagingAndSortingRepository, QueryByExampleExecutor {
List save(Iterable var1);
List findAll();
List findAll(Sort var1);
S insert(S var1);
List insert(Iterable var1);
List findAll(Example var1);
List findAll(Example var1, Sort var2);
}
三、创建BaseDao 接口
注意:接口上加上 @NoRepositoryBean注解,避免Spring 扫描
这边添加三个update方法
第一个update方法根据传入的实体Bean中不为空的属性修改MongoDB 数据库
第二个update方法根据ID修改传入的map中的键值对修改MongoDB 数据库
第三个update方法传入修改的条件和修改的值修改MongoDB 数据库
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.NoRepositoryBean;
import java.io.Serializable;
import java.util.Map;
/**
* @Author chepeiqing
* @Description mongodb BaseDao
* @Date 2018/7/12
* @Time 下午3:01
* @Version V1.0.0
*/
@NoRepositoryBean
public interface BaseDao extends MongoRepository {
/**
* 根据传入的对象 修改
* @param id
* @param t
*/
void update(ID id, T t);
/**
* 根据id修改
* @param id 更新主键
* @param updateFieldMap key:需要更新的属性 value:对应的属性值
*/
void update(ID id, Map updateFieldMap);
/**
* 根据传入值修改
* @param queryFieldMap key:查询条件的属性 value:对应的属性值
* @param updateFieldMap key:需要更新的属性 value:对应的属性值
*/
void update(Map queryFieldMap, Map updateFieldMap);
}
四、BaseDao实现类BaseDaoImpl
此处继承 MongoRepository 类的实现方法 SimpleMongoRepository 并实现BaseDao
import org.springframework.data.mongodb.core.MongoOperations;
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.mongodb.repository.query.MongoEntityInformation;
import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.Map;
/**
* @Author chepeiqing
* @Description 类说明
* @Date 2018/7/12
* @Time 下午3:04
* @Version V1.0.0
*/
public class BaseDaoImpl extends SimpleMongoRepository implements BaseDao {
protected final MongoOperations mongoTemplate;
protected final MongoEntityInformation entityInformation;
private Class clazz;
public BaseDaoImpl(MongoEntityInformation metadata, MongoOperations mongoOperations) {
super(metadata, mongoOperations);
this.mongoTemplate = mongoOperations;
this.entityInformation = metadata;
clazz = entityInformation.getJavaType();
}
/**
* 修改
* @param id
* @param t
**/
@Override
public void update(ID id, T t) {
Update update = new Update();
// 获取实体类的所有属性,返回Field数组
Query query = new Query();
query.addCriteria(new Criteria("_id").is(id));
// 利用反射获取部位空的属性值
Field[] field = clazz.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
Field f = field[i];
// 设置些属性是可以访问的
f.setAccessible(true);
try {
Object object = f.get(t);
if (object != null) {
update.set(f.getName(), object);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
this.mongoTemplate.updateFirst(query, update, clazz);
}
/**
* @param id 更新主键
* @param updateFieldMap key:需要更新的属性 value:对应的属性值
*/
@Override
public void update(ID id, Map updateFieldMap) {
if (updateFieldMap != null && !updateFieldMap.isEmpty()) {
Criteria criteria = new Criteria("_id").is(id);
Update update = new Update();
updateFieldMap.forEach(update::set);
mongoTemplate.updateFirst(new Query(criteria), update, clazz);
}
}
/**
* @param queryFieldMap 字段名
* @param updateFieldMap key:需要更新的属性 value:对应的属性值
*/
@Override
public void update(Map queryFieldMap, Map updateFieldMap) {
Criteria criteria = new Criteria();
if (null != queryFieldMap && !queryFieldMap.isEmpty()) {
queryFieldMap.forEach((key, value) -> criteria.and(key).is(value));
}
if (updateFieldMap != null && !updateFieldMap.isEmpty()) {
Update update = new Update();
updateFieldMap.forEach(update::set);
mongoTemplate.updateFirst(new Query(criteria), update, clazz);
}
}
}
五、怎么使用
所有的Dao接口继承 BaseDao,不需要写实现类
/**
* @Author chepeiqing
* @Description 接口说明
* @Date 2018/7/16
* @Time 下午3:33
* @Version V1.0.0
*/
public interface ImagesDao extends BaseDao {
}
六、调用
注入ImagesDao 就可以直接调用 update方法
@Resource
private ImagesDao imagesDao;
public void updateImage(Images images){
imagesDao.update(images.getId(),images);
}