预先了解知识
1,spring data Jpa 基础
2,mongodb 基础
Spring data 是现代化的数据访问技术,他为传统的关系型数据库与nosql 数据库提供了统一的数据库访问接口。本博文写一写自己初次整合Spring data 与Mongodb 的过程 与 踩过的坑。
先总结一下自己出过的异常:
1,mongoClient 对象找不到,这个是由于低版本的mongodb-java 驱动中没有集成,最好采取新一点的版本
2,如果你提升了mongodb-java 的版本,却没有提升spring 的版本的话,会抛 mongoDbTemplete 对象不能创建的异常,
由于spring 3.x 到4.x 变化较大,mongoDb-java 驱动1.6以上要求spring 4.x。
这是本人第一次在开源中国上写博客,可能由于浏览器问题,感觉编辑器不太好用,代码整洁度不好,大家见谅
本实例采用maven 做依赖管理,以下是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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SpringDataMongo</groupId>
<artifactId>pra</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>pra Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency> <!-- Spring framework -->
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency><!-- spring data mongo 项目驱动 -->
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.7.2.RELEASE</version>
</dependency>
<dependency><!-- mongodb java 驱动-->
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
<build>
<finalName>pra</finalName>
</build>
</project>
接着是Spring bean.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xmlns:repository="http://www.springframework.org/schema/data/repository"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.7.xsd
http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository-1.7.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<!--开启注解扫描 --><!-- 扫描 com.yuhuan 及其子包 -->
<context:component-scan base-package="com.yuhuan"></context:component-scan>
<!-- 配置mongodb --><!-- port 配置mongodb 端口,默认是27017-->
<mongo:db-factory id="mongoDbFactory" dbname="yuhuan" port="12345"/>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongoDbFactory" />
<property name="writeConcern" value="SAFE"></property>
</bean>
</beans>
接着是实体类 Person.java 和Address.java ,Person.java 通过注解加入到spring 容器中 Person 对象依赖Address 对象
package com.yuhuan.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document //Mongodb使用这个注解
public class Person {
@Id
private String id;
private String name;
private int age;
private Address address;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
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 Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
下面是Address类
package com.yuhuan.entity;
public class Address {
private String addr;
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getPro() {
return pro;
}
public void setPro(String pro) {
this.pro = pro;
}
private String pro;
}
}
服务层接口类
package com.yuhuan.repository;
import java.util.List;
import com.mongodb.WriteResult;
public interface UserRepository<T> {
public List<T> getAllObjects();
public void saveObject(T object);
public T getObject(String id);
public WriteResult updateObject(String id, String name);
public void deleteObject(String id);
public void createCollection();
public void dropCollection();
}
服务层接口实现类 用@repository 注解将其加入Spring 容器
package com.yuhuan.repository;
import java.util.List;
import javax.annotation.Resource;
import org.apache.catalina.User;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
import com.mongodb.WriteResult;
import com.yuhuan.entity.Person;
@Repository
public class UserRepositoryImpl implements UserRepository<Person> {
@Resource
private MongoTemplate mongoTemplate;
public List<Person> getAllObjects() {
return mongoTemplate.findAll(Person.class);
}
public void saveObject(Person object) {
mongoTemplate.insert(object);
}
public Person getObject(String id) {
return mongoTemplate.findOne(new Query(Criteria.where("id").is(id)),
Person.class);
}
public WriteResult updateObject(String id, String name) {
return mongoTemplate.updateFirst(
new Query(Criteria.where("id").is(id)),
Update.update("name", name), Person.class); }
public void deleteObject(String id) {
mongoTemplate.remove(new Query(Criteria.where("id").is(id)),
Person.class);
}
public void createCollection() {
if (!mongoTemplate.collectionExists(Person.class)) {
mongoTemplate.createCollection(Person.class);
}
}
public void dropCollection() {
if (mongoTemplate.collectionExists(Person.class)) {
mongoTemplate.dropCollection(Person.class);
}
}
}
最后就是我们的测试类,本例子只测试了添加对象的方法
package test01;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yuhuan.entity.Address;
import com.yuhuan.entity.Person;
import com.yuhuan.repository.UserRepositoryImpl;
public class Test01 {
public static void main(String[] args){
ApplicationContext ctx=new ClassPathXmlApplicationContext("bean.xml");
Person person=new Person();
person.setName("yuhuan");
person.setAge(20);
Address address=new Address();
address.setAddr("中国");
address.setPro("lalala");
person.setAddress(address);
UserRepositoryImpl userRepositoryImpl=(UserRepositoryImpl) ctx.getBean("userRepositoryImpl");
userRepositoryImpl.saveObject(person);
}
}