Spring+SpringMVC+MongoDB案例

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: ---------------------------------------------------------------------------------------------[版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/64948728作者:朱培      ID:sdksdk0  
---------------------------------------------------------------------------------------------
[版权申明:本文系作者原创,转载请注明出处] 
文章出处:http://blog.csdn.net/sdksdk0/article/details/64948728
作者:朱培      ID:sdksdk0     
--------------------------------------------------------------------------------------------

     MongoDB是一个NoSql数据库,MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。其存储结构为BSON。

下面是通过一个Spring+SpringMVC+MongoDB的案例来说明mongodb的基本使用。mongdb的基本结构这里就不再重复说明。从入门到应用。源码地址: https://github.com/sdksdk0/mongodbDemo

一、入门

MongoDB的提供了一个面向文档存储,  将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

首先从入门程序开始。

1、新建maven工程,导入mongodb的驱动包。

         <dependency>
                        <groupId>org.mongodb</groupId>
                        <artifactId>mongodb-driver</artifactId>
                        <version>3.4.2</version>
        </dependency>

2、连接数据库

                MongoClient  mongoClient=new MongoClient("127.0.0.1",27017);
                  //连接到数据库
                  MongoDatabase  mongoDatabase=mongoClient.getDatabase("tf");
                  System.out.println("连接成功");

3、创建集合并获取集合
          
                 mongoDatabase.createCollection("test");
                  //System.out.println("创建集合成功");
                  
                  //获取集合
                  MongoCollection<Document> collection = mongoDatabase.getCollection("test");

4、插入文档
   
      //插入文档
      public static void createDocument(MongoCollection<Document> collection){
            
            Document  document=new Document("title","MongoDB")
                 .append("description", "database")
                 .append("likes", 100)
                 .append("by", "Fly");
            ArrayList<Document> documents = new ArrayList<Document>();
            documents.add(document);
            collection.insertMany(documents);
            System.out.println("文档插入成功");
            
      }


5、查询文档

      //查询文档
      public  static void  findIterable(MongoCollection<Document>  collection){
            FindIterable<Document>  findIterable=collection.find();
            MongoCursor<Document> iterator = findIterable.iterator();
            while(iterator.hasNext()){
                  System.out.println(iterator.next());
            }
      }




6、更新文档

    //更新文档
      public  static void  updateMany(MongoCollection<Document>  collection){
            collection.updateMany(Filters.eq("likes",100),new Document("$set",new Document("likes",200)));
            
            //查询文档
            findIterable(collection);
      }
      
7、删除文档

     //删除
      public  static void deleteMany(MongoCollection<Document>  collection){
            //删除符合条件的第一个文档
            
            collection.deleteOne(Filters.eq("likes",200));
            
            //删除所有符合条件的文档
            collection.deleteMany(Filters.eq("likes",200));
            
            //查询文档
            findIterable(collection);          
      }





二、应用

     这个案例的主要内容是,我们在spring中配置mongodb的数据源,如何可以添加修改删除和条件查询,因为是面向对象的,所以这里可以使用的是HQL语句来操作mongodb数据库。
这里主要用的是用户 userId 、name、age来演示。

1、web.xml配置

<? xml  version = "1.0"  encoding = "UTF-8" ?>
< web-app  xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xmlns = "http://java.sun.com/xml/ns/javaee"  xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
       xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
       id = "sys"  version = "2.5" >
       < description > mongo </ description >
       < display-name > service Java Deploy V1.0.0 </ display-name >
       < context-param >
             < param-name > webAppRootKey </ param-name >
             < param-value > mongo </ param-value >
       </ context-param >
       <!-- 加载log4j -->
       < context-param >
             < param-name > log4jConfigLocation </ param-name >
             < param-value > /WEB-INF/classes/sysconfig/properties/log4j.properties
             </ param-value >
       </ context-param >
       <!-- 加载xml config -->
       < context-param >
             < param-name > contextConfigLocation </ param-name >
             < param-value > classpath*:syscoreConfig/*/*.xml
            classpath:sysconfig/spring/*.xml
            classpath:sysconfig/springmvc/*.xml
             </ param-value >
       </ context-param >
       <!-- 编码 -->
       < filter >
             < filter-name > encodingFilter </ filter-name >
             < filter-class > org.springframework.web.filter.CharacterEncodingFilter </ filter-class >
             < init-param >
                   < param-name > encoding </ param-name >
                   < param-value > UTF-8 </ param-value >
             </ init-param >
             < init-param >
                   < param-name > forceEncoding </ param-name >
                   < param-value > true </ param-value >
             </ init-param >
       </ filter >
       < filter-mapping >
             < filter-name > encodingFilter </ filter-name >
             < url-pattern > /* </ url-pattern >
       </ filter-mapping >
       <!-- 定义LOG4J监听器 -->
       < listener >
             < listener-class > org.springframework.web.util.Log4jConfigListener </ listener-class >
       </ listener >
       <!-- 监听 自动装配ApplicationContext的配置信息 -->
       < listener >
             < listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class >
       </ listener >
       <!-- spring mvc -->
       < servlet >
             < servlet-name > springMvc </ servlet-name >
             < servlet-class > org.springframework.web.servlet.DispatcherServlet </ servlet-class >
             < init-param >
                   < param-name > ContextConfigLocation </ param-name >
                   < param-value > classpath:sysconfig/spring-servlet.xml </ param-value >
             </ init-param >
             < load-on-startup > 1 </ load-on-startup >
       </ servlet >
       < servlet-mapping >
             < servlet-name > springMvc </ servlet-name >
             < url-pattern > / </ url-pattern >
       </ servlet-mapping >
       < welcome-file-list >
             < welcome-file > index.jsp </ welcome-file >
       </ welcome-file-list >
</ web-app >




2、spring-mvc.xml配置

扫描注解:

<!-- com.rui.pro.dao.*.impl/**,com.rui.pro.service.*.impl/**,com.rui.pro.controller/** -->
       < context:component-scan  base-package = " **.dao.***,**.service.***,**.controller.**" />
       < bean
             class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" >
             < property  name = "order"  value = "0"  />
       </ bean >
       < bean  id = "messageAdapter"
             class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" >
             < property  name = "messageConverters" >
                   < list >
                         < bean
                               class = "org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"  />
                   </ list >
             </ property >
       </ bean >
       < bean
             class = "org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"  />
       < bean  class = "org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"  />
       < bean  id = "exceptionMessageAdapter"
             class = "org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver" >
             < property  name = "messageConverters" >
                   < list >
                         <!-- Support JSON MappingJacksonHttpMessageConverter -->
                         < bean
                               class = "org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"  />
                   </ list >
             </ property >
       </ bean >





3、db.xml配置
这里配置的是mongodb数据库的属性以及一些包

       < mongo:mongo  id = "mongo"  host = "localhost"  port = "27017" >
             < mongo:options  connections-per-host = "8"
                   threads-allowed-to-block-for-connection-multiplier = "4"
                   connect-timeout = "1000"  max-wait-time = "1500"  auto-connect-retry = "true"
                   socket-keep-alive = "true"  socket-timeout = "1500"  slave-ok = "true"
                   write-number = "1"  write-timeout = "0"  write-fsync = "true"  />
       </ mongo:mongo >
       < mongo:db-factory  id = "mongoDbFactory"  dbname = "tf"
             mongo-ref = "mongo"  />
       < mongo:mapping-converter  base-package = "cn.tf.mongodb.demo.bean"
             id = "mongoConverter"  />
       < bean  id = "mongoTemplate"  class = "org.springframework.data.mongodb.core.MongoTemplate" >
             < constructor-arg  name = "mongoDbFactory"  ref = "mongoDbFactory"  />
             < constructor-arg  name = "mongoConverter"  ref = "mongoConverter"  />
       </ bean >
       < mongo:repositories  base-package = "cn.tf.mongodb.demo.bean"  />
       < bean  id = "userDao"  class = "cn.tf.mongodb.demo.dao.impl.UserDaoImpl" >
             < property  name = "mongoTemplate"  ref = "mongoTemplate"  />
       </ bean >

       <!-- 扫描实现 -->
       < context:annotation-config  />



4、bean类

      private  String  id ;
       private  Integer  userId ;
       private  String  name ;
       private  Integer  age ;

设置其setter/getter方法、构造方法、toString等。


5、Dao层


public  interface  UserDao {
      List<User> get();
      User getOne(Integer id);
      
       public  void  findAndModify(Integer id, Integer age);
       void  insert(User u);
      
       void  removeOne(Integer id);
      
       //修改多条
       void  update(User criteriaUser, User user) ;
      
       // 按条件查询, 分页 <br>
       public  List<User> find(User criteriaUser,  int  skip,  int  limit);
      
       //根据条件查询出来后 再去修改
       public  User findAndModify(User criteriaUser, User updateUser);
       //查询出来后 删除
       public  User findAndRemove(User criteriaUser) ;
       //统计
       public  long  count(User criteriaUser);
       //条件查询
       public  Query getQuery(User criteriaUser);
   }


6、实现类

@Repository
public  class  UserDaoImpl  implements  UserDao {
       private  MongoOperations  mongoTemplate ;
       // @Autowired
       // @Qualifier("mongoTemplate")
       public  void  setMongoTemplate(MongoOperations mongoTemplate) {
             this . mongoTemplate  = mongoTemplate;
      }
       public  List<User> get() {
            List<User> user =  mongoTemplate .findAll(User. class );
             return  user;
      }
       public  User getOne(Integer id) {
            User user =  mongoTemplate .findOne( new  Query(Criteria.where( "userId" )
                        .is(id)), User. class );
             return  user;
      }
       public  void  findAndModify(Integer id, Integer age) {
             /*mongoTemplate.updateFirst(new Query(Criteria.where("userId").is(id)),
                        new Update().inc("age", age), User.class);*/
            
             mongoTemplate .updateFirst( new  Query(Criteria.where( "userId" ).is(id)),
                         new  Update().set( "age" , age), User. class );
      }
       public  void  insert(User u) {
             mongoTemplate .insert(u);
      }
       public  void  removeOne(Integer id) {
            Criteria criteria = Criteria.where( "userId" ).in(id);
             if  (criteria !=  null ) {
                  Query query =  new  Query(criteria);
                   if  (query !=  null
                              &&  mongoTemplate .findOne(query, User. class ) !=  null )
                         mongoTemplate .remove( mongoTemplate .findOne(query, User. class ));
            }
      }
       /**
       * 修改多条  <br>
       *  ------------------------------<br>
       *
       *  @param  criteriaUser
       *  @param  user
       */
       public  void  update(User criteriaUser, User user) {
            Criteria criteria = Criteria.where( "age" ).gt(criteriaUser.getAge());
            ;
            Query query =  new  Query(criteria);
            Update update = Update.update( "name" , user.getName()).set( "age" ,
                        user.getAge());
             mongoTemplate .updateMulti(query, update, User. class );
      }
       /**
       * 按条件查询, 分页  <br>
       *  ------------------------------<br>
       *
       *  @param  criteriaUser
       *  @param  skip
       *  @param  limit
       *  @return
       */
       public  List<User> find(User criteriaUser,  int  skip,  int  limit) {
            Query query = getQuery(criteriaUser);
            query.skip(skip);
            query.limit(limit);
             return  mongoTemplate .find(query, User. class );
      }
       /**
       * 根据条件查询出来后 再去修改  <br>
       *  ------------------------------<br>
       *
       *  @param  criteriaUser
       *            查询条件
       *  @param  updateUser
       *            修改的值对象
       *  @return
       */
       public  User findAndModify(User criteriaUser, User updateUser) {
            Query query = getQuery(criteriaUser);
            Update update = Update.update( "age" , updateUser.getAge()).set( "name" ,
                        updateUser.getName());
             return  mongoTemplate .findAndModify(query, update, User. class );
      }
       /**
       * 查询出来后 删除  <br>
       *  ------------------------------<br>
       *
       *  @param  criteriaUser
       *  @return
       */
       public  User findAndRemove(User criteriaUser) {
            Query query = getQuery(criteriaUser);
             return  mongoTemplate .findAndRemove(query, User. class );
      }
       /**
       * count  <br>
       *  ------------------------------<br>
       *
       *  @param  criteriaUser
       *  @return
       */
       public  long  count(User criteriaUser) {
            Query query = getQuery(criteriaUser);
             return  mongoTemplate .count(query, User. class );
      }
       /**
       * 条件查询
       *
       *  @param  criteriaUser
       *  @return
       */
       public  Query getQuery(User criteriaUser) {
             if  (criteriaUser ==  null ) {
                  criteriaUser =  new  User();
            }
            Query query =  new  Query();
             if  (criteriaUser.getId() !=  null ) {
                  Criteria criteria = Criteria.where( "userId" ).is(criteriaUser.getId());
                  query.addCriteria(criteria);
            }
             if  (criteriaUser.getAge() > 0) {
                  Criteria criteria = Criteria.where( "age" ).gt(criteriaUser.getAge());
                  query.addCriteria(criteria);
            }
             if  (criteriaUser.getName() !=  null ) {
                  Criteria criteria = Criteria.where( "name" ).regex(
                               "^"  + criteriaUser.getName());
                  query.addCriteria(criteria);
            }
             return  query;
      }
}


添加成功之后我们可以使用db.user.find()命令查看。




7、controller层

@Controller
@RequestMapping ( "user" )
public  class  UserController {
      
       @Autowired
      UserDao  userDao ;
      
       public  void  setUserDao(UserDao userDao) {
             this . userDao  = userDao;
      }
       @RequestMapping ( "test" )
       @ResponseBody
       public  String test(){
             return  "hello" ;
      }
      
       @ResponseBody
       @RequestMapping ( "get" )
       public  List<User> get(HttpServletRequest request,HttpServletResponse response){
            List<User> user= userDao .get();
            System. out .println( this .getClass().getName()+ ":" +user);
             return  user;
      }
}

8、我们可以在浏览器中访问




总之,mongodb是一个非常不错的数据库。通过与spring的整合,可以很方便的使用这个Nosql数据库。







相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
14天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
40 2
|
19天前
|
Java Maven Spring
Spring 小案例体验创建对象的快感
本文介绍了如何在IDEA中创建一个Spring项目,包括项目创建、配置pom.xml文件以引入必要的依赖、编写实体类HelloSpring及其配置文件applicationContext.xml,最后通过测试类TestHelloSpring展示如何使用Spring的bean创建对象并调用方法。
26 0
|
2月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
2月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
60 2
|
3月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
161 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
3月前
|
NoSQL MongoDB 数据库
python3操作MongoDB的crud以及聚合案例,代码可直接运行(python经典编程案例)
这篇文章提供了使用Python操作MongoDB数据库进行CRUD(创建、读取、更新、删除)操作的详细代码示例,以及如何执行聚合查询的案例。
35 6
|
3月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
4月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
4月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查