这可能是最全面的SpringDataMongoDB开发笔记
MongoDB数据库,在最近使用越来越广泛,在这里和Java的开发者一起分享一下在Java中使用Mongodb的相关笔记。希望大家喜欢。关于MongoDB查询指令,请看我的上一篇文章。
Spring Data MongoDB提供了一些方便的映射注释供我们使用,下面列出官方说明地址以供参考
官方说明文档:https://docs.spring.io/spring-data/mongodb/docs/2.1.3.RELEASE/reference/html/#mapping-usageSpring Data MongoDB 支持的注解@Document : 文档标识,将 java 类与 Collection 文档对应 @Id : 文档的唯一标识,在 mongodb 中为 ObjectID,生成规则:时间戳+机器标识+进程ID+自增计数器(确保同一时间内ID不会冲突) @Field : 属性注解 @Indexed : 索引 @CompoundIndex : 混合索引 @GeoSpatialIndexed : 声明该字段为地理信息的索引 @Transient : 映射忽略的字段 (即不会保存到 mongodb) @Query :查询
SpringDataMongoDB的配置server: port: 9006 spring: application: name: tensquare‐spit #指定服务名 data: mongodb: host: localhost:40000 database: spitdb redis: host: 127.0.0.1依赖
在使用 SpringDataMongoDB 之前,需要先声明对 SpringData 模块的依赖关系。
既然 SpringData 存储库抽象中的中央接口是 Repository 。 该接口的子类 CrudRepository 实现了实体类的 CRUD 功能,如果需要的话,也可以通过继承该接口来拓展 :public interface CrudRepository extends Repository { S save(S entity); Optional findById(ID primaryKey); Iterable findAll(); long count(); void delete(T entity); boolean existsById(ID primaryKey); // … more functionality omitted. }
除了 CrudRepository 之外,还有 JpaRepository 和 MongoRepository。在 CrudRepository 中,有许多抽象方法添加了额外的方法来简化对实体的分页访问。
1.简单的CRUD查询。
定一个一个实体类。public class Spit implements Serializable { @Id private String _id; private String content; private Date publishtime; private String userid; private String nickname; private Integer visits; private Integer thumbup; private Integer share; private Integer comment; private String state; private String parentid; }
对于简单的查询,我们只需要继承MongoRepository即可。
Dao层public interface SpitDao extends MongoRepository { public Page findByParentid(String parentid, Pageable pageable); }
Service层@Service @Transactional public class SpitService { @Autowired private SpitDao spitDao; @Autowired private IdWorker idWorker; @Autowired private MongoTemplate mongoTemplate; public List findAll(){ List list = mongoTemplate.findAll(Spit.class); return spitDao.findAll(); } public Spit findById(String id){ Spit s = spitDao.findById(id).get(); return spitDao.findById(id).get(); } public void save(Spit spit){ spit.set_id(idWorker.nextId()+""); spitDao.save(spit); } //分页查询 public Page findByParentid(String parentid,int page,int size){ Pageable pageable = PageRequest.of(page-1,size); return spitDao.findByParentid(parentid,pageable); } }复杂的查询:mongoTemplate
由于查询相对于其他增删改的操作要复杂一些,所以在这里单独说一下查询。还看上面的例子就可以。
首先我们先介绍一下几个和查询有关的类Query、Criteria、Sort、PageRequest、PageImplQuery
查询对象定义一个查询的所有要素,其中包括筛选条件、排序、起始行、返回条数等内容query(CriteriaDefinition criteriaDefinition): 静态方法通过注入一个CriteriaDefinition条件对象获得Query查询对象。在简单查询时使用此方法将非常的方便。
例如:mongoTemplate.find(Query.query(Criteria.where("parameter3").lt(new Date()) addCriteria(CriteriaDefinition criteriaDefinition) : 添加一个CriteriaDefinition查询条件类到本次查询 skip(long skip) : 跳过文档的数量,可以与limit配合使用实现分页效果 limit(int limit) : 查询返回的文档数量。 with(Sort sort) : 添加一个Sort排序对象 with(Pageable pageable): 添加一个Pageable分页对象。Pageable可以注入一个Sort,所以分页和排序可以一起添加。
例如:Pageable pageable = new PageRequest(1,3,sort); Criteria
查询条件类,使用此类定义查询时的查询条件相当于SQL的where。
Sort
查询排序类,使用此类可以创建查询排序。
public void thumbup(String spitId) { Query query = new Query(); query.addCriteria(Criteria.where("_id").is("1")); Update update = new Update(); update.inc("thumbup",1); mongoTemplate.updateFirst(query,update,"spit"); } public void add(Spit spit){ spit.set_id(idWorker.nextId()+""); spit.setPublishtime(new Date()); spit.setVisits(0); spit.setShare(0); spit.setThumbup(0); spit.setComment(0); spit.setState("1"); if (spit.getParentid() != null&& "".equals(spit.getParentid())){ //如果存在上级ID,评论 Query query = new Query(); query.addCriteria(Criteria.where("_id").is(spit.getParentid())); Update update = new Update(); update.inc("comment",1); mongoTemplate.updateFirst(query,update,"spit"); } spitDao.save(spit); }
通过以上的例子基本可以解决的Mongodb的复杂的查询了。关于Mongodb的多表联查。我将在下一篇文章来深入的探讨。
华为不配充电头为啥大家都原谅它至从iPhone12开始顶着环保的大旗开始不出充电器,陆陆续续有很多品牌更疯,但是都被骂得狗血淋头,我一直就好奇,为啥大家都不配,而不骂iPhone。难道真的是第一个吃螃蟹的人总是
苹果iPhone12s13Pro系列新渲染图现在已经8月19号了,下半年到来了,大家最期待的发布会苹果秋季发布会即将来临,届时将推出新的旗舰手机系统,虽然还没有确定名字,不知道叫iPhone12S还是iPhone13,但该系
圾皇菜圾互啄,买了肠子都悔青的手机1。Note207699的售价,1080p60Hz的屏幕,8256。好在三星想的比较周到,怕消费者7000块买个容易摔碎的手机,直接配置了耐摔的复合材料后盖!只要升级2000块,你
魅族手机现在还值不值得购买来聊聊我的亲身感受,我有一台魅族16thPlus,用了没到一个月,其他魅族手机我没有用过所以不是很清楚。外形很一般可以说有点丑,大下巴大额头,外表比较光滑,手上出油出汗多的时候特别
你们要的华为P50来啦华为P50Pro搭载海思麒麟90004G芯片与高通骁龙8884G芯片。其中,搭载骁龙8884G版本的机型9月开售。外观方面,华为P50Pro厚8。5mm,重约195g,采用3D柔性
iQOO8Pro正式发布2021年8月17日晚间iQOO8系列发布了,iQOO8将于8月24日000正式开售,到时候能不能抢到就靠你单身多年的手速啦,全系都支持最高24期分期免息。我们来看看它的价格iQO
iPhoneX和iPhoneXS在外表上怎么分辨你们或许知道iPhone7和iPhone8在外形上面怎么分辨,但是我相信你们分辨不了iPhoneX和iPhoneXS在外形上面有什么区别,提前知道的你懂的啦,不懂的也没关系,我来告
小米11UItra大跳水小米11UItra大家都不陌生吧,重量234g。搭配高通骁龙888处理器,E4的屏幕材质,完美的6。81寸曲面屏,120Hz刷新率,真的香,前置2000万后置9600万,5倍的光学
小米雷总要送3。7亿给首批米粉,你们领到了吗昨晚小米发布了MIX4和小米平板5,屏下摄像头加上骁龙888的MIX4售价4999起,会不会带起手机界屏下摄像头主流呢,你们觉得怎么样,很多人说就4999买了个屏下摄像头和试验品骁
除了iphone什么手机最值得入手相信不少人最近都有遇到这个问题,我就遇上了,想把苹果换掉换安卓手机,但是对于我这个用了很多年的苹果手机的人来说,我怕影响我的使用感和习惯。这最近让我很纠结,有没有什么推荐的呢。在我
住友制药与VR医疗服务商BehaVR合作恐鬼症梦魇将上线(VRPinea10月25日讯)今日重点新闻住友制药将向BehaVR投资2300万美元,用于开发商业化VR疗法微型投影仪开发商TriLite获800万欧元融资,本轮融资将用于推动其