MongoDB作爲查詢性能優越的Nosql數據庫在項目中運用越來越多,逐漸變成主要的數據庫。
下面,在SpringBoot項目中引入MongoDB,使用MongoTemplate作爲工具。
Maven節點
前提當然是在本地搭建起Mongo服務,導入Maven節點。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>mongodb-plus-spring-boot-starter</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.8.1</version>
</dependency>
配置
yml中配置數據庫 ,mongo默認端口號27017。
data:
mongodb:
uri: mongodb://localhost:27017/zs
創建類
注意:@Data是lombok工具包的,JSONObject是hutool工具包的
實體類
我模擬的是,點擊加錢,生成記錄的場景,裏面的類型最好是用包裝類。
@Data
@Document(collection="AddMoney")
public class AddMoney implements Serializable {
String id;
Integer type;
Double money;
String creattime;
}
DAO類
已經配置過,直接依賴注入。
@Repository
public class AddMoneyDao {
/**
* MongoTemplate
*/
@Autowired
private MongoTemplate mongoTemplate;
}
增加一條數據,id自動生成,返回一個有id的對象。
/*
* 增加一條數據
*/
public AddMoney saveOne(AddMoney param) {
return mongoTemplate.insert(param);
}
查詢操作,Query類型爲篩選條件,在查詢修改和刪除中通用,Criteria是拼接條件,where().is(),也可以是其他的lt、lte、gt、gte、ne等等。
排序或者限制輸出行數這些與where無關的在Query裏設置q.limit()、q.skip()、q.with(Sort.by(Sort.Order.desc(sname)));
/*
* 根據id查詢
*/
public AddMoney findOneById(String id){
Query q=new Query( Criteria.where("_id").is(id));
List<AddMoney> list = mongoTemplate.find(q, AddMoney.class);
if(list.size()==1){
return list.get(0);
}else
return null;
}
/*
* 查詢全部
*/
public List<AddMoney> findAll() {
return mongoTemplate.findAll(AddMoney.class);
}
/*
* 查詢全部並排序
*/
public List<AddMoney> findAllSort(String sname) {
Query q=new Query();
q.with(Sort.by(Sort.Order.desc(sname)));
return mongoTemplate.find(q, AddMoney.class);
}
修改數據入參由修改內容和條件篩選組成,Update對象中設置修改內容,篩選條件和查詢一樣,返回值爲改變列數等信息。
注意入參的修改對象屬性爲null就是對應字段不修改,不爲null就是修改爲入參的值,所以要用包裝類,否則int double這些默認爲0。
/*
* 根據id修改數據
*/
public String updateById(AddMoney params,String id){
JSONObject json= JSONUtil.parseObj(params);
Query q=new Query(Criteria.where("_id").is(id));
Update update = new Update();
json.forEach((s, o) -> {
update.set(s,o);
});
UpdateResult result=mongoTemplate.updateFirst(q,update,params.getClass());
return result.toString();
}
/*
* 修改多個
*/
public String update(AddMoney params,int type){
JSONObject json= JSONUtil.parseObj(params);
Query q=new Query(Criteria.where("type").is(type));
Update update = new Update();
json.forEach((s, o) -> {
update.set(s,o);
});
UpdateResult result=mongoTemplate.updateMulti(q,update,AddMoney.class);
return result.toString();
}
刪除數據,返回值爲刪除行數
/*
* 按id刪除
*/
public String deleteById(String id){
Query q=new Query(Criteria.where("_id").is(id));
DeleteResult deleteResult=mongoTemplate.remove(q,AddMoney.class);
return deleteResult.toString();
}
調用
寫完調用測試一下
@Service
public class UserServiceImpl implements UserService {
@Autowired
AddMoneyDao plusMoneyDao;
@Override
public AddMoney findOneById(String id) {
return plusMoneyDao.findOneById(id);
}
@Override
public String updateOne(AddMoney a,String id) {
return plusMoneyDao.updateById(a,id);
}
@Override
public String updateByType(AddMoney a, int type) {
return plusMoneyDao.update(a,type);
}
@Override
public String deleteOne(String id) {
return plusMoneyDao.deleteById(id);
}
@Override
public List<AddMoney> findAll() {
return plusMoneyDao.findAllSort("money");
}
@Override
public AddMoney saveOne(AddMoney addMoney) {
return plusMoneyDao.saveOne(addMoney);
}
}