结合springdata实现增删改查
上一篇文章已经介绍了环境搭建和公用dao的实现,现在就来简单的说一下代码结构和简单的增删改查
一、业务dao继承基础的mongodbDao(代码示例)
package com.glgd.recarticle.dao;
import java.util.ArrayList;
import java.util.List;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Order;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
import com.glgd.recarticle.bean.ArticleComments;
import com.glgd.recarticle.bean.ArticleSearchBean;
import com.glgd.recarticle.domain.Article;
import com.mongodb.MongoBaseDao;
import com.util.StringUtil;
@Repository(value="com.glgd.recarticle.dao.ArticleDao")
public class ArticleDao extends MongoBaseDao<Article> {
/**
* 根据查询条件分页查询文章
* @param searchBean 查询
* @param skip 每页开始的位置 (skip:每一页开始位置;第一页第一条skip=0)
* @param limit 每页的大小
* @return
*/
public List<Article> findListBySearchBean(ArticleSearchBean searchBean,int skip,int limit){
List<Article> list = null;
Query query = new Query();
Criteria criteria = new Criteria();
//查询条件
List<Criteria> list1 = new ArrayList<Criteria>();
//contentType条件 加入OR
List<Integer> clist = searchBean.getContentTypeList();
if(null != clist){
Criteria[] orArray = new Criteria[clist.size()];
for(int i = 0; i < clist.size(); i++){
orArray[i] = Criteria.where("contentType").is(clist.get(i));
}
list1.add(new Criteria().orOperator(orArray));
}
if(!StringUtil.isEmpty(searchBean.getArticleTitle())){
list1.add(Criteria.where("articleTitle").regex(searchBean.getArticleTitle().trim()));
}
if(searchBean.getArticleStatus() != null){
list1.add(Criteria.where("articleStatus").is(searchBean.getArticleStatus()));
}
if(!StringUtil.isEmpty(searchBean.getEditor())){
list1.add(criteria = Criteria.where("editor").regex(searchBean.getEditor().trim()));
}
if(!StringUtil.isEmpty(searchBean.getArticleType())){
list1.add( Criteria.where("articleType").is(searchBean.getArticleType()));
}
//只选择开始时间
if(searchBean.getStartTime()!= null){
list1.add(Criteria.where("publishDate").gte(searchBean.getStartTime().getTime()));
}
//只选择结束时间
if(searchBean.getEndTime()!= null ){
list1.add(Criteria.where("publishDate").lt(searchBean.getEndTime().getTime()));
}
//转换条件查询
if(list1.size()>0){
Criteria[] criteriaCondition = list1.toArray(new Criteria[list1.size()]);
criteria.andOperator(criteriaCondition);
query.addCriteria(criteria);
}
query.skip(skip);
query.limit(limit);
query.sort().on("publishDate", Order.DESCENDING);
list = this.findByQuery(query, Article.class);
return list;
}
public long getCount(ArticleSearchBean searchBean){
long count = 0;
Query query = new Query();
Criteria criteria = new Criteria();
//查询条件
List<Criteria> list = new ArrayList<Criteria>();
//contentType条件 加入OR
List<Integer> clist = searchBean.getContentTypeList();
if(null != clist){
Criteria[] orArray = new Criteria[clist.size()];
for(int i = 0; i < clist.size(); i++){
orArray[i] = Criteria.where("contentType").is(clist.get(i));
}
list.add(new Criteria().orOperator(orArray));
}
if(!StringUtil.isEmpty(searchBean.getArticleTitle())){
list.add(Criteria.where("articleTitle").regex(searchBean.getArticleTitle().trim()));
}
if(searchBean.getArticleStatus() != null){
list.add(Criteria.where("articleStatus").is(searchBean.getArticleStatus()));
}
if(!StringUtil.isEmpty(searchBean.getEditor())){
list.add(Criteria.where("editor").regex(searchBean.getEditor().trim()));
}
if(!StringUtil.isEmpty(searchBean.getArticleType())){
list.add( Criteria.where("articleType").is(searchBean.getArticleType()));
}
//只选择开始时间
if(searchBean.getStartTime()!= null){
list.add(Criteria.where("publishDate").gte(searchBean.getStartTime().getTime()));
}
//只选择结束时间
if(searchBean.getEndTime()!= null ){
list.add(Criteria.where("publishDate").lt(searchBean.getEndTime().getTime()));
}
//转换条件查询
if(list.size()>0){
Criteria[] criteriaCondition = list.toArray(new Criteria[list.size()]);
criteria.andOperator(criteriaCondition);
query.addCriteria(criteria);
}
count = this.getCount(query, Article.class);
return count;
}
/**
* 新增评论
* @param _id
* @param comments
*/
public void addComments(String _id,ArticleComments comments){
Query query = Query.query(Criteria.where("_id").is(_id));
Update update = new Update();
update.addToSet("comments", comments);
this.updateFirst(query, update, Article.class);
}
/**
* 根据条件获取文章下的评论
* @param searchBean
* @param skip
* @param pageSize
* @return
*/
public List<Article> getAllComments(ArticleSearchBean searchBean){
Query query = new Query();
query.fields().include("comments");
Criteria criteria = new Criteria();
//查询条件
List<Criteria> listCriteria = new ArrayList<Criteria>();
if(!StringUtil.isEmpty(searchBean.getUseName())){
listCriteria.add(Criteria.where("comments.userName").regex(searchBean.getUseName().trim()));
}
if(!StringUtil.isEmpty(searchBean.getKeyWord())){
listCriteria.add(Criteria.where("comments.content").regex(searchBean.getKeyWord().trim()));
}
if(searchBean.getCommentDate()!= null){
listCriteria.add(Criteria.where("comments.commentTime").lt(searchBean.getCommentDate().getTime()+(3600*1000*24L)));
listCriteria.add(Criteria.where("comments.commentTime").gte(searchBean.getCommentDate().getTime()));
}
//转换条件查询
if(listCriteria.size()>0){
Criteria[] criteriaCondition = listCriteria.toArray(new Criteria[listCriteria.size()]);
criteria.andOperator(criteriaCondition);
query.addCriteria(criteria);
}
List<Article> articleList = this.findByQuery(query, Article.class);
return articleList;
}
/**
* 删除评论的内嵌文档
* @param userId
* @param commentTime
* @param _id
*/
public void deleteComment(long userId,long commentTime,String _id){
Query query = Query.query(Criteria.where("comments.userId").is(userId).and("comments.commentTime").is(commentTime).and("_id").is(_id));
Update update = new Update();
update.unset("comments.$");
this.updateFirst(query, update, Article.class);
this.deleteNULLcomment(_id);
}
/**
* 清空评论中的null并且评论数-1
* @param _id
*/
public void deleteNULLcomment(String _id){
Query query = Query.query(Criteria.where("_id").is(_id));
Update update = new Update();
update.pull("comments", null);
update.inc("commentCount", -1);
this.updateFirst(query, update, Article.class);
}
/**
* 更新文章信息
* @param article
*/
public void updateArticle(Article article){
Query query = Query.query(Criteria.where("_id").is(article.get_id()));
Update update = new Update();
update.set("articleTitle", article.getArticleTitle());
update.set("articleType", article.getArticleType());
update.set("editor", article.getEditor());
update.set("articleStatus", article.getArticleStatus());
update.set("publishDate", article.getPublishDate());
update.set("sortFlag", article.getSortFlag());
update.set("rcoverImage", article.getRcoverImage());
update.set("overview", article.getOverview());
update.set("articleDetail", article.getArticleDetail());
update.set("contentType", article.getContentType());
update.set("sconverImage", article.getSconverImage());
this.updateFirst(query, update, Article.class);
}
/**
* 根据文章主键删除文章
* @param _id
*/
public void deleteArticleById(String _id){
Query query = Query.query(Criteria.where("_id").is(_id));
this.delete(query, Article.class);
}
/**
* 删除评论时,更新评论数
* @param _id
* @param comments
*/
public void updateCommentCount(String _id,int size){
Query query = Query.query(Criteria.where("_id").is(_id));
Update update = new Update();
update.inc("commentCount", -size);
this.updateFirst(query, update, Article.class);
}
/**
* 添加和删除收藏时更新收藏次数
* @param _id
* @param size
*/
public void updateCollectCount(String _id,int size){
Query query = Query.query(Criteria.where("_id").is(_id));
Update update = new Update();
update.inc("collectCount", size);
this.updateFirst(query, update, Article.class);
}
/**
* 更新浏览次数
* @param _id
* @param size
*/
public void updateBrowseCount(String _id,int size){
Query query = Query.query(Criteria.where("_id").is(_id));
Update update = new Update();
update.inc("scanCount", size);
this.updateFirst(query, update, Article.class);
}
}
二、对于Dao中对数据库集合的操作总结:
1、查询 :查询语句(注意事不能有多个Or和and--->new Criteria().and("").is("").orOperator(criteria).is(""))类似这样的操作查询时是会报错的,所以改为如下方式:
Query query = new Query();
Criteria criteria = new Criteria();
//查询条件
List<Criteria> list1 = new ArrayList<Criteria>();
//contentType条件 加入OR
List<Integer> clist = searchBean.getContentTypeList();
if(null != clist){
Criteria[] orArray = new Criteria[clist.size()];
for(int i = 0; i < clist.size(); i++){
orArray[i] = Criteria.where("contentType").is(clist.get(i));
}
list1.add(new Criteria().orOperator(orArray));
}
//只选择结束时间
if(searchBean.getEndTime()!= null ){
list1.add(Criteria.where("publishDate").lt(searchBean.getEndTime().getTime()));
}
//转换条件查询
if(list1.size()>0){
Criteria[] criteriaCondition = list1.toArray(new Criteria[list1.size()]);
criteria.andOperator(criteriaCondition);
query.addCriteria(criteria);
}
query.skip(skip);
query.limit(limit);
query.sort().on("publishDate", Order.DESCENDING);
list = this.findByQuery(query, Article.class);
a).模糊匹配:Criteria.where("articleTitle")
.regex(searchBean.getArticleTitle().trim()) regex方法用来进行模糊匹配,类似于 sql 的like;
b). 内嵌文档查询:结合图片中
根据条件查询type(内嵌文档查询):代码示例如下
if(!StringUtil.isEmpty(paramBean.getPtype())){
listCriteria.add(Criteria.where("type.ptype").is(paramBean.getPtype()));
}
if(!StringUtil.isEmpty(paramBean.getFtype())){
listCriteria.add(Criteria.where("type.fctype").is(paramBean.getFtype()));
}
c).分页查询:
query.skip(skip);
<span> </span> query.limit(limit);
d).查询结果排序: org.springframework.data.mongodb.core.query.Order
query.sort().on("publishDate", Order.DESCENDING);
e).对内嵌文档切片查询:由于我在springdata 框架中没有找到对应的api所以自己,写了一个简单的示例,可以结合示例灵活应用。数据结构图
//关于内嵌文档 的 切片查询
public static void main(String[] args) throws UnknownHostException {
Mongo mogo = new Mongo("127.0.0.1",27017);
DB db = mogo.getDB("authTest");
DBCollection successCard = db.getCollection("successCard");
successCard.rename("successCard_20160112");
BasicDBObject query = new BasicDBObject("_id", new ObjectId("5694b1ef977dfabb53a16d51"));
BasicDBObject fields = new BasicDBObject(
"commentList",
new BasicDBObject("$slice", new int[] { 1, 3 }));
DBCursor resultsCursor = successCard.find(query, fields);
while(resultsCursor.hasNext()){
System.out.println(resultsCursor.next().toMap().get("commentList"));
}
}