详解MongoDB和Spring整合的实例代码
mongodb现在用的非常非常多,如何和spring整合也是经常碰到的问题。
spring提供了mongotemplate
这样一个模板类的实现方法,简化了具体操作。
下面讲一下具体实现:
添加依赖
<dependency> <groupid>org.springframework.data</groupid> <artifactid>spring-data-mongodb</artifactid> <version>1.10.3.release</version> </dependency>
其余spring相关的忽略
spring的配置applicationcontext-mongo.xml
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemalocation=" http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd"> <context:property-placeholder ignore-unresolvable="true" location="classpath:/mongodb.properties"/> <mongo:mongo-client id="mongoclient" host="${mongo.host}" port="${mongo.port}"> <!-- credentials="${mongo.user}:${mongo.pwd}@${mongo.defaultdbname}"--> </mongo:mongo-client> <mongo:db-factory id="mongodbfactory" dbname="${mongo.database}" mongo-ref="mongoclient"/> <!-- 默认mongodb类型映射 --> <bean id="defaultmongotypemapper" class="org.springframework.data.mongodb.core.convert.defaultmongotypemapper"> <constructor-arg name="typekey"> <!-- 这里设置为空,可以把 spring data mongodb 多余保存的_class字段去掉 --> <null/> </constructor-arg> </bean> <mongo:repositories base-package="com.critc.mongo"/> <!-- 自动扫描以下包的有doucment注解的类 --> <mongo:mapping-converter id="mappingconverter" base-package="com.critc.mongo.model" type-mapper-ref="defaultmongotypemapper"> </mongo:mapping-converter> <!-- mongodb的模板 --> <bean id="mongotemplate" class="org.springframework.data.mongodb.core.mongotemplate"> <constructor-arg name="mongodbfactory" ref="mongodbfactory"/> <constructor-arg name="mongoconverter" ref="mappingconverter"/> </bean> </beans>
mongo:mongo-client
是定义mongodb的客户端连接,需要host和port参数,如果需要账号密码的话,需要增加credentials配置
mongo:db-factory
配置连接工厂,指定具体的连接数据库,本例默认为test
defaultmongotypemapper
默认mongodb类型映射
mongo:mapping-convertermongodb
的实体映射
mongotemplate
这是最主要的,定义模板类,依赖连接工厂和实体映射
这里举一个article的增删改查的例子。
相关实体article.java
@document(collection = "article_info") public class article { @id private string id;//id @field("title") private string title;//标题 @field("url") private string url;//链接 @field("author") private string author;//作者 @field("tags") private list<string> tags;//tag 标签 @field("visit_count") private long visitcount;//访问次数 @field("add_time") private date addtime;//添加时间 // get set方法省略
@document(collection = "article_info")
这个注解和hibernate的注解entiry
非常相似,就是定义一个文档,对象mongodb存储的collection的名称是article_info
@id指该字段是主键,不能缺少
@field("add_time")指该字段映射mongodb的实际字段,如果一致可以省略
articlerepository实际访问接口
@repository("articlerepository") public interface articlerepository extends pagingandsortingrepository<article, string> { //分页查询 public page<article> findall(pageable pageable); //根据author查询 public list<article> findbyauthor(string author); //根据作者和标题查询 public list<article> findbyauthorandtitle(string author, string title); //忽略参数大小写 public list<article> findbyauthorignorecase(string author); //忽略所有参数大小写 public list<article> findbyauthorandtitleallignorecase(string author, string title); //排序 public list<article> findbyauthororderbyvisitcountdesc(string author); public list<article> findbyauthororderbyvisitcountasc(string author); //自带排序条件 public list<article> findbyauthor(string author, sort sort); }
spring的data repository封装了一套增删改查的方法,就和jpa实现的一样,articlerepository
继承pagingandsortingrepository
,就集成了常用的增删改查方法,比如save、findone、exists、findall、delete等等,可以采用默认实现方式来完成常用的增删改查操作。
测试上述各个方法articlerepositorytest.java
@runwith(springjunit4classrunner.class) @contextconfiguration(locations = {"classpath*:applicationcontext-mongo.xml"}) public class articlerepositorytest { @autowired private articlerepository articlerepository; /** * 新增记录 */ @test public void add() { //增加一条记录 article article = new article(); article.setid("1"); article.settitle("mongotemplate的基本使用"); article.setauthor("kcy"); article.seturl("http://jianshu.com/"); article.settags(arrays.aslist("java", "mongodb", "spring")); article.setvisitcount(0l); article.setaddtime(new date()); articlerepository.save(article); //批量添加 list<article> articles = new arraylist<>(10); for (int i = 0; i < 10; i++) { article article2 = new article(); article2.setid(string.valueof(i + 1)); article2.settitle("mongotemplate的基本使用"); article2.setauthor("kcy"); article2.seturl("http://jianshu.com" + i); article2.settags(arrays.aslist("java", "mongodb", "spring")); article2.setvisitcount(0l); article2.setaddtime(new date()); articles.add(article2); } articlerepository.save(articles); } /** * 修改记录,修改id为1的访问次数+1 */ @test public void update() { article article = articlerepository.findone("1"); article.setvisitcount(article.getvisitcount() + 1); articlerepository.save(article); } /** * 批量修改,查看author为kcy的统一修改为kcy2 */ @test public void batchupdate() { list<article> articles = articlerepository.findbyauthor("kcy"); articles.foreach(article -> { article.setauthor("kcy2"); }); articlerepository.save(articles); } /** * 删除记录,删除id为10的 */ @test public void delete() { article article = articlerepository.findone("10"); articlerepository.delete(article); } @test public void batchdelete() { list<article> articles = articlerepository.findbyauthor("kcy2"); articlerepository.delete(articles); } /** * 查询所有 * * @author 孔垂云 */ @test public void findall() { iterable<article> articles = articlerepository.findall(); articles.foreach(article -> { system.out.println(article.tostring()); }); } /** * 根据author查询 * * @author 孔垂云 */ @test public void findbyauthor() { list<article> articles = articlerepository.findbyauthor("kcy"); articles.foreach(article -> { system.out.println(article.tostring()); }); } /** * 按照author和title查询 * * @author 孔垂云 */ @test public void findbyauthorandtitle() { list<article> articles = articlerepository.findbyauthorandtitle("kcy", "mongotemplate的基本使用"); articles.foreach(article -> { system.out.println(article.tostring()); }); } /** * 根据作者查询,忽略大小写 * * @author 孔垂云 */ @test public void findbyauthorignorecase() { list<article> articles = articlerepository.findbyauthorignorecase("jason"); articles.foreach(article -> { system.out.println(article.getid()); }); } /** * 忽略所有参数的大小写 * * @author 孔垂云 */ @test public void findbyauthorandtitleallignorecase() { list<article> articles = articlerepository.findbyauthorandtitleallignorecase("kcy", "mongotemplate的基本使用"); articles.foreach(article -> { system.out.println(article.tostring()); }); } /** * 根据author查询,并且以访问次数降序排序显示 * * @author 孔垂云 */ @test public void findbyauthororderbyvisitcountdesc() { list<article> articles = articlerepository.findbyauthororderbyvisitcountdesc("kcy"); articles.foreach(article -> { system.out.println(article.tostring()); }); } /** * 根据作者查询,并且以访问次数升序排序显示 * * @author 孔垂云 */ @test public void findbyauthororderbyvisitcountasc() { list<article> articles = articlerepository.findbyauthororderbyvisitcountasc("kcy"); articles.foreach(article -> { system.out.println(article.tostring()); }); } /** * 自带排序条件 * * @author 孔垂云 */ @test public void findbyauthorbysort() { list<article> articles = articlerepository.findbyauthor("kcy", new sort(direction.asc, "visitcount")); articles.foreach(article -> { system.out.println(article.tostring()); }); } /** * 分页查询所有,并且排序 */ @test public void findbypage() { int page = 1; int size = 2; pageable pageable = new pagerequest(page, size, new sort(direction.asc, "visitcount")); page<article> pageinfo = articlerepository.findall(pageable); //总数量 system.out.println(pageinfo.gettotalelements()); //总页数 system.out.println(pageinfo.gettotalpages()); for (article article : pageinfo.getcontent()) { system.out.println(article.tostring()); } } }
上面一段代码较长,基本上mongodb常用的各种例子都讲清楚了,比如增加、批量增加、修改、删除、按id查找、按标题查询、分页等等。
源码下载
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
详解MongoDB和Spring整合的实例代码
-
Android实现状态栏和虚拟按键背景颜色的变化实例代码详解
-
MongoDB分片键的选择和案例实例详解
-
webpack学习笔记之代码分割和按需加载的实例详解
-
Spring 整合Shiro 并扩展使用EL表达式的实例详解
-
微信小程序 动态的设置图片的高度和宽度详解及实例代码
-
Spring Boot和Thymeleaf整合结合JPA实现分页效果(实例代码)
-
如何优雅的进行Spring整合MongoDB详解
-
spring boot-2.1.16整合swagger-2.9.2 含yml配置文件的代码详解
-
详解python 条件语句和while循环的实例代码