zoukankan      html  css  js  c++  java
  • Spring Data MongoDB 一:入门篇(环境搭建、简单的CRUD操作)

    原文:http://blog.csdn.net/congcong68/article/details/44545253

    一.简介

         Spring Data  MongoDB 项目提供与MongoDB文档数据库的集成。Spring Data MongoDB POJO的关键功能区域为中心的模型与MongoDB的DBCollection轻松地编写一个存储库交互数据访问。

    二.Spring Data MongoDB的配置以及下载对应的Jar

      1.安装MongoDb数据库,我们在上一篇就已经介绍过了,这边就不在介绍了,MongoDB 入门(安装与配置)

       2.下载spring的spring-data的子项目两个jar,分别是spring-data-commons和spring-data-mongodb

               http://projects.spring.io/spring-data-mongodb/

               我这边下载是两个jar分别是:

              spring-data-commons-1.7.2.RELEASE.jar

             spring-data-mongodb-1.4.2.RELEASE.jar

       3.下载mongoDb的java驱动jar包

           http://central.maven.org/maven2/org/mongodb/mongo-java-driver/

           这边有很多版本,下载自己对应得版本,我下载是:

            mongo-java-driver-2.9.3.jar

             

       4.用Java测试一下MongoDB是否能正常连接

    [java] view plain copy
     
    1. public class TestMongodb {  
    2.     @Test   
    3.     public void testMongodb()  
    4.     {  
    5.       try{     
    6.             // 连接到 mongodb 服务  
    7.              Mongo mongo = new Mongo("127.0.0.1", 27017);    
    8.             //根据mongodb数据库的名称获取mongodb对象 ,  
    9.              DB db = mongo.getDB( "test" );  
    10.              Set<String> collectionNames = db.getCollectionNames();    
    11.                // 打印出test中的集合    
    12.               for (String name : collectionNames) {    
    13.                     System.out.println("collectionName==="+name);    
    14.               }    
    15.                
    16.           }catch(Exception e){  
    17.              e.printStackTrace();  
    18.           }  
      运行能获取test数据库下的集合,说明能正常连接数据库

         

    5.Spring的配置文件

       1)applicationContext-mongo.xml

       

    [html] view plain copy
     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
    4.     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"  
    5.     xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo"  
    6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
    7.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
    8.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
    9.     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd  
    10.     http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd  
    11.     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
    12.     <context:component-scan base-package="com.mongo" />  
    13.     <!-- 获取配置资源 -->  
    14.     <context:property-placeholder location="classpath:jdbc.properties" />  
    15.       
    16.     <bean class="cn.mongo.util.SpringContextUtil"></bean>  
    17.       
    18.     <mongo:mongo id="mongo"  replica-set="${mongo.replicaSet}">  
    19.       <!--  
    20.          connections-per-host: 每个主机答应的连接数(每个主机的连接池大小),当连接池被用光时,会被阻塞住   
    21.          max-wait-time: 被阻塞线程从连接池获取连接的最长等待时间(ms)  
    22.          connect-timeout:在建立(打开)套接字连接时的超时时间(ms)  
    23.          socket-timeout:套接字超时时间;该值会被传递给Socket.setSoTimeout(int)  
    24.          slave-ok:指明是否答应驱动从次要节点或者奴隶节点读取数据  
    25.          -->  
    26.     <mongo:options  
    27.         connections-per-host="${mongo.connectionsPerHost}"  
    28.         threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"  
    29.         connect-timeout="${mongo.connectTimeout}"   
    30.         max-wait-time="${mongo.maxWaitTime}"  
    31.         auto-connect-retry="${mongo.autoConnectRetry}"   
    32.         socket-keep-alive="${mongo.socketKeepAlive}"  
    33.         socket-timeout="${mongo.socketTimeout}"  
    34.         slave-ok="${mongo.slaveOk}"  
    35.         write-number="${mongo.writeNumber}"  
    36.         write-timeout="${mongo.riteTimeout}"  
    37.         write-fsync="${mongo.writeFsync}"/>  
    38.     </mongo:mongo>  
    39.        <!-- 设置使用的数据库 名-->  
    40.       <mongo:db-factory dbname="test" mongo-ref="mongo"/>  
    41.       <!-- mongodb的模板 -->  
    42.      <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">  
    43.         <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>  
    44.      </bean>  
    45. </beans>  
      

     2)jdbc.properties

    [html] view plain copy
     
    1. mongo.replicaSet=127.0.0.1:27017  
    2. mongo.connectionsPerHost=8  
    3. mongo.threadsAllowedToBlockForConnectionMultiplier=4  
    4. mongo.connectTimeout=1000  
    5. mongo.maxWaitTime=1500  
    6. mongo.autoConnectRetry=true  
    7. mongo.socketKeepAlive=true  
    8. mongo.socketTimeout=1500  
    9. mongo.slaveOk=true  
    10. mongo.writeNumber=1  
    11. mongo.riteTimeout=0  
    12. mongo.writeFsync=true  
    说明:

     我们可以上官方网查看文档http://docs.spring.io/spring-data/data-mongo/docs/1.7.0.RC1/reference/html/#mongodb-connectors,这里面有说明怎么配置

       

    三.Spring 实现MongoDB的CRUD操作

        1.实现一个基础接口,是比较通用的 MongoBase.java类

    [java] view plain copy
     
    1. public interface MongoBase<T> {  
    2.     //添加  
    3.     public void insert(T object,String collectionName);    
    4.     //根据条件查找  
    5.     public T findOne(Map<String,Object> params,String collectionName);    
    6.     //查找所有  
    7.     public List<T> findAll(Map<String,Object> params,String collectionName);    
    8.     //修改  
    9.     public void update(Map<String,Object> params,String collectionName);   
    10.     //创建集合  
    11.     public void createCollection(String collectionName);  
    12.     //根据条件删除  
    13.     public void remove(Map<String,Object> params,String collectionName);  
    14.       
    15. }  
      

       2.实现一个实体类,我这边实现了User类

      @Document注解,表示这个POJO最终要持久化为MongoDB中的document

    [java] view plain copy
     
    1. @Document  
    2. public class User implements Serializable {  
    3.     /** 
    4.      *  
    5.      */  
    6.     private static final long serialVersionUID = 1L;  
    7.     private String id;  
    8.     private String name;  
    9.     private int age;  
    10.     private String password;  
    11.       
    12.     public String getName() {  
    13.         return name;  
    14.     }  
    15.     public void setName(String name) {  
    16.         this.name = name;  
    17.     }  
    18.     public int getAge() {  
    19.         return age;  
    20.     }  
    21.     public void setAge(int age) {  
    22.         this.age = age;  
    23.     }  
    24.     public String getPassword() {  
    25.         return password;  
    26.     }  
    27.     public void setPassword(String password) {  
    28.         this.password = password;  
    29.     }  
    30.     public String getId() {  
    31.         return id;  
    32.     }  
    33.     public void setId(String id) {  
    34.         this.id = id;  
    35.     }  
    36.       
    37.       
    38.   
    39. }  

     3.实现UserDao类,就是实现User自己操作数据库的接口,这个UserDao也继承了MongoBase接口,我们这边UserDao没实现其他额外的接口

        

    [java] view plain copy
     
    1. public interface UserDao extends MongoBase<User>{  
    2.   
    3. }  

     4.实现UserDaoImpl具体类,这边是实际操作数据库

         

    [java] view plain copy
     
    1. @Repository("userDaoImpl")  
    2. public class UserDaoImpl implements UserDao {  
    3.       
    4.     @Resource  
    5.     private MongoTemplate mongoTemplate;  
    6.   
    7.     @Override  
    8.     public void insert(User object,String collectionName) {  
    9.         mongoTemplate.insert(object, collectionName);  
    10.     }  
    11.   
    12.     @Override  
    13.     public User findOne(Map<String,Object> params,String collectionName) {  
    14.          return mongoTemplate.findOne(new Query(Criteria.where("id").is(params.get("id"))), User.class,collectionName);    
    15.     }  
    16.   
    17.     @Override  
    18.     public List<User> findAll(Map<String,Object> params,String collectionName) {  
    19.         List<User> result = mongoTemplate.find(new Query(Criteria.where("age").lt(params.get("maxAge"))), User.class,collectionName);  
    20.         return result;  
    21.     }  
    22.   
    23.     @Override  
    24.     public void update(Map<String,Object> params,String collectionName) {  
    25.         mongoTemplate.upsert(new Query(Criteria.where("id").is(params.get("id"))), new Update().set("name", params.get("name")), User.class,collectionName);  
    26.     }  
    27.   
    28.     @Override  
    29.     public void createCollection(String name) {  
    30.         mongoTemplate.createCollection(name);  
    31.     }  
    32.   
    33.   
    34.     @Override  
    35.     public void remove(Map<String, Object> params,String collectionName) {  
    36.         mongoTemplate.remove(new Query(Criteria.where("id").is(params.get("id"))),User.class,collectionName);  
    37.     }  

      说明:

           我们可以上官方网查看文档http://docs.spring.io/spring-data/data-mongo/docs/1.7.0.RC1/reference/html/#mongodb-connectors

            mongoTemplate.upsert

                 

                  这边update里面提供了很多功能,可以根据条件进行修改,Criteria这个类也提供了where 、and、lt等,我们在查询年龄大于30的查出来,mongoTemplate.find(new Query(Criteria.where("age").lt(params.get("maxAge"))), User.class,collectionName);Criteria还很多

       如图所示:

                    

       4.实现测试类

          我们这边为了节省时间,就没写服务类,我们直接调用dao就可以了,实现了TestUser.java类

          1)添加并根据条件查找列表

             

    [java] view plain copy
     
    1. public class TestUser {  
    2.       
    3.     private static UserDao userDaoImpl;  
    4.     private static  ClassPathXmlApplicationContext  app;  
    5.     private static String collectionName;  
    6.     @BeforeClass    
    7.     public static void initSpring() {   
    8.         try {         
    9.          app = new ClassPathXmlApplicationContext(new String[] { "classpath:applicationContext-mongo.xml",    
    10.                 "classpath:spring-dispatcher.xml" });    
    11.         userDaoImpl = (UserDao) app.getBean("userDaoImpl");   
    12.         collectionName ="users";  
    13.         } catch (Exception e) {  
    14.             e.printStackTrace();  
    15.         }  
    16.            }   
    17.       
    18.         @Test   
    19.         public void testAdd()  
    20.         {  
    21.           
    22.             //添加一百个user  
    23.             for(int i=0;i<100;i++){  
    24.                 User user =new User();  
    25.                 user.setId(""+i);  
    26.                 user.setAge(i);  
    27.                 user.setName("zcy"+i);  
    28.                 user.setPassword("zcy"+i);  
    29.                 userDaoImpl.insert(user,collectionName);  
    30.             }  
    31.             Map<String,Object> params=new HashMap<String,Object>();  
    32.             params.put("maxAge", 50);  
    33.             List<User> list=userDaoImpl.findAll(params,collectionName);  
    34.             System.out.println("user.count()=="+list.size());  
    35.         }  
       运行一下,我们能正常查找年龄大于50的

            

        2)根据ID进行修改

             

    [java] view plain copy
     
    1.            @Test   
    2. ublic void testUdate(){  
    3. Map<String,Object> params=new HashMap<String,Object>();  
    4. params.put("id", "1");  
    5. User user=userDaoImpl.findOne(params, collectionName);  
    6. System.out.println("user.name==="+user.getName());  
    7. System.out.println("=============update==================");  
    8. params.put("name", "hello");  
    9. userDaoImpl.update(params, collectionName);  
    10.  user=userDaoImpl.findOne(params, collectionName);  
    11. System.out.println("user.name==="+user.getName());  

         3)根据ID删除对应的数据

             

    [java] view plain copy
     
    1.             @Test   
    2. ublic void testRemove(){  
    3. Map<String,Object> params=new HashMap<String,Object>();  
    4. params.put("id", "2");  
    5. userDaoImpl.remove(params, collectionName);  
    6. User user=userDaoImpl.findOne(params, collectionName);  
    7. System.out.println("user=="+user);  

       

     
     
  • 相关阅读:
    MVC5 + EF6 + Bootstrap3 (13) 查看详情、编辑数据、删除数据
    MVC5 + EF6 + Bootstrap3 (12) 新建数据
    MVC5 + EF6 + Bootstrap3 (11) 排序、搜索、分页
    [C#详解] (1) 自动属性、初始化器、扩展方法
    MVC5 + EF6 + Bootstrap3 (10) 数据查询页面
    MVC5 + EF6 + Bootstrap3 (9) HtmlHelper用法大全(下)
    MVC5 + EF6 + Bootstrap3 (8) HtmlHelper用法大全(上)
    MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统
    ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用
    ASP.NET MVC5 + EF6 入门教程 (5) Model和Entity Framework
  • 原文地址:https://www.cnblogs.com/shihaiming/p/7691900.html
Copyright © 2011-2022 走看看