Spring data Mongodb

来源:互联网 发布:淘宝店铺怎样使用seo 编辑:程序博客网 时间:2024/05/16 12:30

Spring data MongoDB

Spring Data MongoDB 官方给予的简介截图如下:

翻译为:Spring Data MongoDB 是 Spring Data项目的一部分,旨在为新的数据存储提供一个熟悉且一致的机遇spring的编程模型,同时保留存储特有的特征和功能。

Spring data MongoDB 实例

第一步:新建一个Spring工程。过程略。

第二步:添加相应的依赖包。pom.xml文件中的完整内容如下:

    <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>com.wrh</groupId>      <artifactId>springdatamongodb</artifactId>      <version>1.0-SNAPSHOT</version>      <packaging>jar</packaging>      <name>springdatamongodb</name>      <url>http://maven.apache.org</url>      <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>      </properties>      <dependencies>        <dependency>          <groupId>junit</groupId>          <artifactId>junit</artifactId>          <version>4.12</version>          <scope>test</scope>        </dependency>        <dependency>          <groupId>org.springframework.data</groupId>          <artifactId>spring-data-mongodb</artifactId>          <version>1.10.4.RELEASE</version>        </dependency>          <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-commons -->          <dependency>              <groupId>org.springframework.data</groupId>              <artifactId>spring-data-commons</artifactId>              <version>1.13.4.RELEASE</version>          </dependency>          <!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->          <dependency>              <groupId>org.mongodb</groupId>              <artifactId>mongo-java-driver</artifactId>              <version>3.4.2</version>          </dependency>      </dependencies>    </project>

第三步:用Java测试一下MongoDB是否能正常连接

    @Test    public void testMongodb(){        //连接到mongodb服务        Mongo mongo = new Mongo("127.0.0.1",27017);        System.out.println("连接成功");        //根据mongodb数据库的名称获取mongodb对象        DB db = mongo.getDB("test");        Set<String> collectionNames = db.getCollectionNames();        for(String s:collectionNames){            System.out.println("collectionName==="+s);        }    }

测试结果如下:
左边为IDEA控制台的输出结果,右边为通过终端查看数据库的结果。
可以看到是一致的,连接正常。

第四步:编写相关的代码来完成数据的存储呀、查找呀、更新呀、删除呀

这里不采用xml文件的方式来配置相关的bean,而是使用Java代码来配置。配置代码如下

     @Configuration    public class MongoConfig {        @Bean        public MongoFactoryBean mongo(){            MongoFactoryBean mongo = new MongoFactoryBean();            mongo.setHost("localhost");            return mongo;        }        @Bean        public MongoOperations mongoTemplate(Mongo mongo){            return new MongoTemplate(mongo,"OrdersDB");        }    }

实体类

实体类使用了@Document和@Id注解

    @Document    public class User implements Serializable {        /**         *         */        private static final long serialVersionUID = 1L;        @Id        private String id;        private String name;        private int age;        private String password;        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }        public int getAge() {            return age;        }        public void setAge(int age) {            this.age = age;        }        public String getPassword() {            return password;        }        public void setPassword(String password) {            this.password = password;        }        public String getId() {            return id;        }        public void setId(String id) {            this.id = id;        }    }

这里先不编写Dao层、service层等相关代码,直接在测试类中进行存储、查询数据等操作。

    public class UserTest {        private static MongoOperations mongo;        @BeforeClass        public static void before(){            ApplicationContext ctx = new AnnotationConfigApplicationContext(MongoConfig.class);            mongo = (MongoOperations)ctx.getBean("mongoTemplate");        }        @Test        public void testAdd()        {            //添加一百个user            for(int i=0;i<100;i++){                User user =new User();                user.setId(""+i);                user.setAge(i);                user.setName("wrh"+i);                user.setPassword("wrh"+i);                mongo.save(user);            }            List<User> userList = mongo.findAll(User.class);            System.out.println(userList.size());        }     }

执行上面的代码之后,在MongoDB数据库查询的结果如下,说明存储数据成功。

下面我们就引入Dao层来与数据库进行交互。

1、实现一个基础接口,取名为MongoBase。

    /**     * @Author:wojiushimogui     * @Description:     * @Date:Created by 下午6:02 on 2017/6/11.     */    public interface MongoBase<T> {        //添加        public void insert(T object,String collectionName);        //根据条件查找        public T findOne(Map<String,Object> params, String collectionName);        //查找所有        public List<T> findAll(Map<String,Object> params, String collectionName);        //修改        public void update(Map<String,Object> params,String collectionName);        //创建集合        public void createCollection(String collectionName);        //根据条件删除        public void remove(Map<String,Object> params,String collectionName);    }

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

    public interface UserDao extends MongoBase<User>{    }

3、UserDao的实现类UserDaoImpl,这个类是实际操作数据库

    /**     * @Author:wojiushimogui     * @Description:     * @Date:Created by 下午6:05 on 2017/6/11.     */    public class UserDaoImpl implements UserDao {        @Autowired        private MongoTemplate mongoTemplate;        public UserDaoImpl() {        }        //    public UserDaoImpl(MongoTemplate mongoTemplate) {    //        System.out.println("heihei");    //        mongoTemplate = mongoTemplate;    //    }        public void insert(User object, String collectionName) {            mongoTemplate.insert(object, collectionName);        }        public User findOne(Map<String, Object> params, String collectionName) {            return mongoTemplate.findOne(new Query(Criteria.where("id").is(params.get("id"))), User.class, collectionName);        }        public List<User> findAll(Map<String, Object> params, String collectionName) {            List<User> result = mongoTemplate.find(new Query(Criteria.where("age").lt(params.get("maxAge"))), User.class, collectionName);            return result;        }        public void update(Map<String, Object> params, String collectionName) {            mongoTemplate.upsert(new Query(Criteria.where("id").is(params.get("id"))), new Update().set("name", params.get("name")), User.class, collectionName);        }        public void createCollection(String name) {            mongoTemplate.createCollection(name);        }        public void remove(Map<String, Object> params, String collectionName) {            mongoTemplate.remove(new Query(Criteria.where("id").is(params.get("id"))), User.class, collectionName);        }    }

4、测试类

    public class UserTest {        private static MongoOperations mongo;        private static UserDao userDao;        private static String collectionName;        @BeforeClass        public static void before(){            ApplicationContext ctx = new AnnotationConfigApplicationContext(MongoConfig.class);            mongo = (MongoOperations)ctx.getBean("mongoTemplate");            userDao = (UserDao)ctx.getBean("userDaoImpl");            collectionName = "user";        }        @Test        public void testAdd2()        {            //添加100个user            for(int i=0;i<100;i++){                User user =new User();                user.setId(""+i);                user.setAge(i);                user.setName("wojiushimogui"+i);                user.setPassword("wrh"+i);                userDao.insert(user,collectionName);            }            Map<String,Object> params=new HashMap<String,Object>();            params.put("maxAge", 50);            List<User> userList=userDao.findAll(params,collectionName);            System.out.println("user.count()=="+userList.size());        }    }

通过观察运行结果可知程序运行正常并完成了相应的功能。

关于数据的插入、更新以及查找可以参考本文所列出的参考资料。

遇到的问题

在此实践过程中,在本文中采用的是采用Java代码来装配bean。由于UserDaoImpl类中持有一个MongoTemplate的应用,在《Spring In Action》这本书中的2.3.3节中介绍了借助于JavaConfig实现注入,按照其介绍的方法在MongoConfig配置类中的代码如下,在UserDaoImpl类中的MongoTemplate总报空指针异常。

    @Configuration    public class MongoConfig {        @Bean        public Mongo mongo(){            return new Mongo("localhost");        }        @Bean(name = "mongoTemplate")        public MongoOperations mongoTemplate(Mongo mongo){            return new MongoTemplate(mongo,"OrdersDB");        }        @Bean(name = "userDaoImpl")        public UserDao userDao(){            return new UserDaoImpl((MongoTemplate)mongoTemplate(mongo()));        }    }

原因不知道为什么也。

解决方法为:在UserDaoImpl类中的MongoTemplate属性上使用注解@Autowired进行修饰,

    @Autowired    private MongoTemplate mongoTemplate;

而在配置类MongoConfig中的代码如下:

    @Bean(name = "userDaoImpl")    public UserDao userDao(){        return new UserDaoImpl();    }

参考文档

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

http://docs.spring.io/spring-data/data-mongo/docs/1.7.0.RC1/reference/html/#mongodb-connectors

http://docs.spring.io/spring-data/data-mongodb/docs/current/reference/html/index.html

原创粉丝点击