详解MongoDB和Spring整合的实例代码

网友投稿 261 2023-04-28


详解MongoDB和Spring整合的实例代码

MongoDB现在用的非常非常多,如何和Spring整合也是经常碰到的问题。

Spring提供了MongoTemplate这样一个模板类的实现方法,简化了具体操作。

下面讲一下具体实现:

添加依赖

org.springframework.data

spring-data-mongodb

1.10.3.RELEASE

其余Spring相关的忽略

Spring的配置applicationContext-mongo.xml

xmlns:util="http://springframework.org/schema/util"

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:context="http://springframework.org/schema/context"

xmlns:mongo="http://springframework.org/schema/data/mongo"

xsi:schemaLocation="

http://springframework.org/schema/util http://springframework.org/schema/util/spring-util.xsd

http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/context http://springframework.org/schema/context/spring-context.xsd

http://springframework.org/schema/data/mongo http://springframework.org/schema/data/mongo/sprihttp://ng-mongo.xsd">

ignore-unresolvable="true" location="classpath:/mongodb.properties"/>

dbname="${mongo.database}"

mongo-ref="mongoClient"/>

type-mapper-ref="defaultMongoTypeMapper">

xmlns:util="http://springframework.org/schema/util"

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:context="http://springframework.org/schema/context"

xmlns:mongo="http://springframework.org/schema/data/mongo"

xsi:schemaLocation="

http://springframework.org/schema/util http://springframework.org/schema/util/spring-util.xsd

http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/context http://springframework.org/schema/context/spring-context.xsd

http://springframework.org/schema/data/mongo http://springframework.org/schema/data/mongo/sprihttp://ng-mongo.xsd">

ignore-unresolvable="true" location="classpath:/mongodb.properties"/>

dbname="${mongo.database}"

mongo-ref="mongoClient"/>

type-mapper-ref="defaultMongoTypeMapper">

ignore-unresolvable="true" location="classpath:/mongodb.properties"/>

dbname="${mongo.database}"

mongo-ref="mongoClient"/>

type-mapper-ref="defaultMongoTypeMapper">

dbname="${mongo.database}"

mongo-ref="mongoClient"/>

type-mapper-ref="defaultMongoTypeMapper">

type-mapper-ref="defaultMongoTypeMapper">

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")

@Field("tags")

private List 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

{

//分页查询

public Page

findAll(Pageable pageable);

//根据author查询

public List

findByAuthor(String author);

public List

findByAuthorAndTitle(String author, String title);

//忽略参数大小写

public List

findByAuthorIgnoreCase(String author);

//忽略所有参数大小写

public List

findByAuthorAndTitleAllIgnoreCase(String author, String title);

//排序

public List

findByAuthorOrderByVisitCountDesc(String author);

public List

findByAuthorOrderByVisitCountAsc(String author);

//自带排序条件

public List

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

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

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

articles = articleRepository.findByAuthor("kcy2");

articleRepository.delete(articles);

}

/**

* 查询所有

*

* @author 孔垂云

*/

@Test

public void findAll() {

Iterable

articles = articleRepository.findAll();

articles.forEach(article -> {

System.out.println(article.toString());

});

}

/**

* 根据author查询

*

* @author 孔垂云

*/

@Test

public void findByAuthor() {

List

articles = articleRepository.findByAuthor("kcy");

articles.forEach(article -> {

System.out.println(article.toString());

});

}

/**

* 按照author和title查询

*

* @author 孔垂云

*/

@Test

public void findByAuthorAndTitle() {

List

articles = articleRepository.findByAuthorAndTitle("kcy", "MongoTemplate的基本使用");

articles.forEach(article -> {

System.out.println(article.toString());

});

}

/**

*

* @author 孔垂云

*/

@Test

public void findByAuthorIgnoreCase() {

List

articles = articleRepository.findByAuthorIgnoreCase("JASON");

articles.forEach(article -> {

System.out.println(article.getId());

});

}

/**

* 忽略所有参数的大小写

*

* @author 孔垂云

*/

@Test

public void findByAuthorAndTitleAllIgnoreCase() {

List

articles = articleRepository.findByAuthorAndTitleAllIgnoreCase("KCY", "MONGOTEMPLATE的基本使用");

articles.forEach(article -> {

System.out.println(article.toString());

});

}

/**

* 根据author查询,并且以访问次数降序排序显示

*

* @author 孔垂云

*/

@Test

public void findByAuthorOrderByVisitCountDesc() {

List

articles = articleRepository.findByAuthorOrderByVisitCountDesc("kcy");

articles.forEach(article -> {

System.out.println(article.toString());

});

}

/**

*

* @author 孔垂云

*/

@Test

public void findByAuthorOrderByVisitCountAsc() {

List

articles = articleRepository.findByAuthorOrderByVisitCountAsc("kcy");

articles.forEach(article -> {

System.out.println(article.toString());

});

}

/**

* 自带排序条件

*

* @author 孔垂云

*/

@Test

public void findByAuthorBySort() {

List

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

pageInfo = articleRepository.findAll(pageable);

//总数量

System.out.println(pageInfo.getTotalElements());

//总页数

System.out.println(pageInfo.getTotalSFkzLEWqOPages());

for (Article article : pageInfo.getContent()) {

System.out.println(article.toString());

}

}

}

上面一段代码较长,基本上MongoDB常用的各种例子都讲清楚了,比如增加、批量增加、修改、删除、按id查找、按标题查询、分页等等。

源码下载

本工程详细源码


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springmvc+spring+mybatis实现用户登录功能(下)
下一篇:vue移动端裁剪图片结合插件Cropper的使用实例代码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~