在Spring启动时与mongodb一起摇摆

我是Spring Boot的粉丝,这是Spring Boot上的mongodb示例项目。 大多数mongodb示例项目是如此基础,以至于您不会太过分。 您可以搜索普通的Spring Data示例,但是它们可能比您想要的复杂得多。 所以这是我的。
这是我要使用的pom。

<!--?xml version="1.0" encoding="UTF-8"?-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelversion>4.0.0</modelversion><groupid>caught.co.nr</groupid><artifactid>boottoymongodb</artifactid><version>1.0-SNAPSHOT</version><packaging>war</packaging><!-- Inherit defaults from Spring Boot --><parent><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-parent</artifactid><version>1.0.0.BUILD-SNAPSHOT</version></parent><dependencies><dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-data-mongodb</artifactid></dependency></dependencies><!-- Needed for fat jar --><build><plugins><plugin><groupid>org.springframework.boot</groupid><artifactid>spring-boot-maven-plugin</artifactid></plugin></plugins></build><repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>http://repo.spring.io/snapshot</url><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginrepositories><pluginrepository><id>spring-snapshots</id><url>http://repo.spring.io/snapshot</url></pluginrepository></pluginrepositories>
</project>

我唯一需要的依赖项是“ spring-boot-starter-data-mongodb”,其中包含spring boot mongodb项目的所有必需依赖项。 接下来是我的收藏的模型。 文档注释指向我的收藏集,名为“产品”。 仅当您的型号名称与集合名称不匹配时才需要。 您可以看到一个字段注释,该注释将集合中的字段名称映射到模型的字段名称。

@Document(collection = "products")
public class Product {@Idprivate String id;private String sku;@Field(value = "material_name")private String materialName;private Double price;private Integer availability;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getSku() {return sku;}public void setSku(String sku) {this.sku = sku;}public String getMaterialName() {return materialName;}public void setMaterialName(String materialName) {this.materialName = materialName;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}public Integer getAvailability() {return availability;}public void setAvailability(Integer availability) {this.availability = availability;}@Overridepublic String toString() {return "Product{" +"id='" + id + '\'' +", sku='" + sku + '\'' +", materialName='" + materialName + '\'' +", price=" + price +", availability=" + availability +'}';}
}

不需要,我们将需要DAO层来操纵我的数据。 如果要在DAO层中使用自动生成的查找方法,MongoRepository是我应该实现的接口。 这些自动生成的方法可以查询模型的每个字段。 有关方法名称语法的完整列表,请参见此处 。 我在下面的查询将使用一个sku名称,并在我的集合中搜索该名称并返回匹配的名称。

public interface ProductRepository extends MongoRepository < Product, String >{public List < Product > findBySku(String sku);
}

现在,我将介绍一个服务,该服务将调用我的DAO接口。 但是请稍等,我没有实现此接口,而是编写了必要的代码以获取模型,对吗? 是的,这些方法是自动生成的,我不需要此接口的实现。

@Service
public class ProductService {@Autowiredprivate ProductRepository repository;public List < Product > getSku(String sku){return repository.findBySku(sku);}
}

接下来,启动我们的Boot示例。 这是我们的主要课程:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class BootMongoDB implements CommandLineRunner {@Autowiredprivate ProductService productService;private static final Logger logger = LoggerFactory.getLogger(BootMongoDB.class);public void run(String... args) throws Exception {List < Product > sku = productService.getSku("NEX.6");logger.info("result of getSku is {}", sku);}public static void main(String[] args) throws Exception {SpringApplication.run(BootMongoDB.class, args);}
}

如果您连接到mongodb实例,并且sku与您搜索的名称匹配,那么您将看到一个或多个产品。 我们所做的是非常基本的。 如果我要更复杂的查询怎么办? 例如,如果我想要一个特定的SKU,其可用性等于“ 1”? 我不能不使用一些@Query魔术来做到这一点。 所以我要更新我的DAO类。

public interface ProductRepository extends MongoRepository < Product, String >{public List < Product > findBySku(String sku);@Query(value = "{sku: ?0, availability : 1}")public List < Product > findBySkuOnlyAvailables(String sku);
}

我为mongodb提供了直接查询,其中方法签名中的sku将插入查询中的“?0”并将被发送到mongodb。 您可以先更新服务,然后再更新主要方法以查看其是否有效。 如果您对mongodb的语法不太熟悉,那么您可能不喜欢编写可读性不强的查询。 然后是时候添加自定义DAO类了。 除了自动生成的方法外,无法向ProductRepository添加和使用其他方法。 因此,我们将添加几个类,并提供一个不错的精选方法。 我们的存储库类名为“ ProductRepository”。 我们将添加一个名为“ ProductRepositoryCustom”的新接口和一个新方法,该方法将为给定名称找到可用的骨架(findBySkuOnlyAvailables方法的双胞胎)。

public interface ProductRepositoryCustom {public List < Product > findBySkuOnlyAvailablesCustom(String sku);
}

然后为此提供一个实现。 在下面,您看到我们注入了ProductRepositoryCustom的mongotemplate并对其进行了处理。 我们创建两个条件。 第一个用于sku名称,第二个用于可用性。

public class ProductRepositoryImpl implements ProductRepositoryCustom {@Autowiredprivate MongoTemplate mongoTemplate;public List < Product > findBySkuOnlyAvailablesCustom(String sku) {Criteria criteria = Criteria.where("sku").is(sku).
andOperator(Criteria.where("availability").is(1));return mongoTemplate.find(Query.query(criteria), Product.class);}
}

定制实现的最后一步是ProductRepository类的更新。 正如您在下面看到的,我唯一需要的更新是添加了ProductRepositoryCustom,以便我们可以将它们链接在一起。 所有这些命名听起来都有些愚蠢。 但是请注意,尽管自定义接口的名称并不重要,但是实现名称的更改将导致引发异常:

Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property only found for type String! Traversed path: Product.sku.

要解决此问题,请确保实现类的名称为“ ProductRepositoryImpl”,这是扩展MongoRepository和“ Impl”的接口名称的串联。

public interface ProductRepository extends MongoRepository < Product, String>, ProductRepositoryCustom

如果我们将新方法添加到服务层:

@Service
public class ProductService {@Autowiredprivate ProductRepository repository;public List < Product > getSku(String sku){return repository.findBySku(sku);}public List < Product > getAvailableSkuCustom(String sku){return repository.findBySkuOnlyAvailablesCustom(sku);}
}

然后更新我们的主类的run方法:

public void run(String... args) throws Exception {List < Product > sku = productService.getSku("NEX.6");logger.info("result of getSku is {}", sku);List < Product > availableSkuCustom = productService.getAvailableSkuCustom("NEX.6");logger.info("result of availableSkuCustom is {}", availableSkuCustom);}

同样,您必须在日志中看到一些内容! 您可以在github上检查整个项目。

翻译自: https://www.javacodegeeks.com/2014/05/rocking-with-mongodb-on-spring-boot.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android git上传出现错误,热更新上传patch包时提示上传失败,文件不合法

集成配置信息classpath com.android.tools.build:gradle:3.3.2classpath "com.tencent.bugly:tinker-support:1.1.5"distributionUrlhttps://services.gradle.org/distributions/gradle-5.0-all.zipapi com.tencent.bugly:crashreport_upgrade:1.3.6api com.tencent.…

第一章笔记(chapter 1 note

犯错对编程而言非常有教育性. 早期犯的错误越多, 学到的东西就越多.编辑器是提供了编写, 管理, 开发与测试程序的环境, 有时也称为集成开发环境(Integrated Development Environment, IDE).任何环境及任何语言中, 开发程序的编辑, 编译, 链接与执行这四个步骤都是一样的.犯错乃…

又做了3个极品菜[图]

今天的是&#xff1a; 极品豆角炒鸡蛋 极品黄瓜炒鸡蛋 极品炒菠菜没鸡蛋 其他我做的菜请看 《我做的菜很香很好吃[有图]》 转载于:https://www.cnblogs.com/zjneter/archive/2008/04/13/1151383.html

生成器与迭代器

生成器与迭代器一、生成器 1.列表推导式 列表推导式是Python内置的非常简单且强大的可以用来轻松创建列表的方法。它可以使用非常简单的语句利用其他列表创建新的列表。 例如&#xff0c;创建1到10的所有偶数的平方的列表&#xff1a; list [i*i for i in range(1,11) if i%20…

Spring Integration Java DSL示例

现在已经为Spring Integration引入了新的基于Java的DSL &#xff0c;这使得可以使用基于纯Java的配置而不是基于Spring XML的配置来定义Spring Integration消息流。 我尝试使用DSL来获得示例集成流–我称其为Rube Goldberg流 &#xff0c;因为它在尝试大写作为输入传递的字符串…

automake linux,Linux下automake软件编译与发布快速入门

Linux下automake软件编译与发布快速入门2008-04-22eNet&Ciweek进入编辑界面&#xff0c;输入内容如下&#xff1a;AUTOMAKE_OPTIONSforeignbin_PROGRAMSsimserver1 #软件包名称simserver1_SOURCESsimserver1.cpp  #源文件列表&#xff0c;如果有多个则用空格分开LIBS -l…

取消 Vue 中格式编译警告

使用VS Code在学习 Vue 的过程中&#xff0c;博主是在2.0之后开始学习的&#xff0c;在写项目的时候发现控制台经常会报一大堆的警告&#xff0c;都是关于格式的&#xff0c;有时候少空格&#xff0c;有时候多空格&#xff0c;不胜其烦&#xff0c;出现这个问题是因为在初始化的…

常用激活函数(激励函数)理解与总结

转载自https://blog.csdn.net/tyhj_sf/article/details/79932893 什么是激活函数&#xff1f; 神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值&#xff0c;并将输入值传递给下一层&#xff0c;输入层神经元节点会将输入属性值直接传递给下一层&#…

[原创]水知道答案吗?(一)

《水知道答案》是一本书的名字&#xff0c;我很有兴趣重复其中的试验&#xff0c;验证其真伪。书中提到的众多试验中&#xff0c;有一个试验最好做。实验内容&#xff1a;初始条件&#xff1a;取三个杯子&#xff0c;倒上相同水源的水&#xff0c;然后每个杯子放进一粒米饭粒。…

html5标签的兼容性处理

HTML5的语义化标签以及属性   1.可以让开发者非常方便地实现清晰的web页面布局&#xff0c;加上CSS3的效果渲染&#xff0c;快速建立丰富灵活的web页面显得非常简单 2.使用他们能让代码语义化更直观,而且更方便SEO优化。 但是此HTML5新标签在IE6/IE7/IE8上并不能识别&#xf…

Spring Security配置错误

我最近看到Mike Wienser的SpringOne2GX谈论了Application Security Pitfalls 。 如果您在Servlet容器上使用Spring的堆栈&#xff0c;这将非常有用&#xff0c;值得一看。 它使我想起了我曾经面临的一个严重的Spring Security Misconfiguration。 在Spring的指导项目Securing …

android fragmentactivity fragment,Android:Activity与Fragment通信(99%)完美解决方案

前言最近一直在想着能否有一种更好的方案来解决&#xff1a;Android中Activity与Fragment之间通信的问题&#xff0c;什么叫更好呢&#xff0c;就是能让Fragment的复用性高&#xff0c;性能还有好(不用反射)&#xff0c;代码还要好维护&#xff0c;不需要为每对Activity和Fragm…

分布式人工智能标记语言(DAIML)示例

DAIML&#xff08;Distributed Artificial Intelligence Markup Language&#xff09;是用于分布式人工智能系统中智能语言的标记库。DAIML主要分为Pattern和Template两部分&#xff0c;Pattern用于模式匹配&#xff0c;Template用于回答模板&#xff0c;下面将分别介绍两者的示…

Ext.js数据展示问题name展示code

出现以上问题是因为model中定义的类型跟数据库不匹配 去掉js中vehicleModel的type或者改为type:int即可。转载于:https://www.cnblogs.com/feifeicui/p/10438900.html

新一代网络模式Web 2.0火爆发展

据TechnologyReview网站2006年4月12日消息&#xff0c;如果你是一位网络高手&#xff0c;你会发现网络工具和服务领域天翻地覆的新变化越来越充斥你的生活。你可以在Eventful网站或Upcoming网站上保存社交日历&#xff1b;可以在Gootodo上安排计划&#xff1b;在Box.net上储存1…

Solr中的前缀和后缀匹配

搜索引擎都是关于查找字符串的。 用户输入一个查询词&#xff0c;然后从反向索引中检索它。 有时&#xff0c;用户正在寻找的值只是索引中值的子字符串&#xff0c;并且用户可能也对这些匹配感兴趣。 对于德语这样的包含复合词&#xff08;例如Semmelkndel&#xff09;的语言&a…

评价viper4android,ViPer4android. FX顶级音效!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼名称&#xff1a;OPPO X903 杜比音效脉冲反馈样本 For VIPER4Android FX v2.0样本数量&#xff1a;72适配V4A版本&#xff1a;ViPER4Android FX v2.2.0.1 或更高适用范围&#xff1a;耳机内放制作者&#xff1a;漫游因特网授权&…

使用FormData进行Ajax请求上传文件

Servlet3.0开始提供了一系列的注解来配置Servlet、Filter、Listener等等。这种方式可以极大的简化在开发中大量的xml的配置。从这个版本开始&#xff0c;web.xml可以不再需要&#xff0c;使用相关的注解同样可以完成相应的配置。 我笔记里也有记文件上传&#xff1a;https://w…

基于 jq 实现拖拽上传 APK 文件,js解析 APK 信息

技术栈 jquery文件上传&#xff1a;jquery.fileupload&#xff0c;github 文档apk 文件解析&#xff1a;app-info-parser&#xff0c;github 文档参考&#xff1a;前端解析ipa、apk安装包信息 —— app-info-parser 支持功能 点击或拖拽上传 apk 文件校验文件类型及文件大小js …

POI获取WORD信息

最近由于工作需要&#xff0c;调研了一下关于poi获取word字体信息方面的方法&#xff0c;在这里mark一下。 首先word格式分为doc和docx&#xff0c;分别利用HWPFDocument和XWPFDocument对文档进行解析&#xff0c;话不多说&#xff0c;直接贴代码&#xff1a; 解析doc格式1 imp…