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
- spring-data 集成mongodb
- Spring-data集成mongodb
- MongoDB集成Spring Data
- Spring Data for Mongodb
- MongoDB集成Spring Data
- spring data MongoDB分页
- Spring data MongoDB
- Spring data Mongodb
- Spring Data MongoDB
- mongodb spring-data 使用
- Spring Data MongoDB插入
- Spring Data MongoDB更新
- Spring Data MongoDB查询
- Spring Data MongoDB删除
- MongoDB 整合Spring(spring-data-mongodb)
- spring-data-mongodb MongoDB 整合 Spring
- Spring Data MongoDB 入门例子
- Spring Data MongoDB - Reference Documentation
- shell 中##和%%的用法
- 【Asp.net】—web.config配置详解
- nginx(非openresty) 实现解析uri自动upstream并支持动态新增删除(redisCluster)节点(四种方式)
- java继承的问题
- linux 下安装maven
- Spring data Mongodb
- DNS相关名词解释(CNAME)
- DevExpress控件使用之SearchLookUpEdit (多选)
- BottomNavigationView 的使用
- WinDBG 技巧:如何生成Dump 文件(.dump 命令)
- python(小总结) 占位符、时间、
- Android 6.0权限逻辑详解
- 使用okhttp3简单执行网络请求
- Unity热更新方案