Spring Data for MongoDB是Spring Data的一个子模块。 目标是为MongoDB提供一个相近的一致的基于Spring的编程模型。
Spring Data for MongoDB核心功能是映射POJO到Mongo的DBCollection中的文档,并且提供Repository 风格数据访问层。
特性:官网:http://projects.spring.io/spring-data-mongodb/
下面我们实例说明spring-data-mongodb的使用。
1.添加依赖jar包
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.13.0</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.6.2.RELEASE</version> </dependency>2.定义实体
spring-data-mongodb中的实体映射是通过MongoMappingConverter这个类实现的。它可以通过注释把java类转换为mongodb的文档。
它有以下几种注释:
@Id - 文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成。
@Document - 把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。
@DBRef - 声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能,当你在本实例中修改了DERef对象里面的值时,单独保存本实例并不能保存DERef引用的对象,它要另外保存,如下面例子的Person和Account。
@Indexed - 声明该字段需要索引,建索引可以大大的提高查询效率。
@CompoundIndex - 复合索引的声明,建复合索引可以有效地提高多字段的查询效率。
@GeoSpatialIndexed - 声明该字段为地理信息的索引。
@Transient - 映射忽略的字段,该字段不会保存到mongodb。
@PersistenceConstructor - 声明构造函数,作用是把从数据库取出的数据实例化为对象。该构造函数传入的值为从DBObject中取出的数据。
package cn.slimsmart.mongodb.demo.spring; import java.util.Date; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.CompoundIndex; import org.springframework.data.mongodb.core.index.CompoundIndexes; import org.springframework.data.mongodb.core.index.Indexed; import org.springframework.data.mongodb.core.mapping.Document; @Document(collection = "user") @CompoundIndexes({ @CompoundIndex(name = "birthday_idx", def = "{'name': 1, 'birthday': -1}") }) public class User { @Id @Indexed(unique = true) private String id; @Indexed private String name; private Date birthday; 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 Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "User[id="+id+",name="+name+",birthday="+birthday+"]"; } }3.CRUD实现
package cn.slimsmart.mongodb.demo.spring; import java.util.List; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.domain.Sort.Order; 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.DB; @Repository public class UserRepository { @Autowired private MongoTemplate mongoTemplate; public void test() { Set<String> colls = this.mongoTemplate.getCollectionNames(); for (String coll : colls) { System.out.println("CollectionName=" + coll); } DB db = this.mongoTemplate.getDb(); System.out.println("db=" + db.toString()); } public void createCollection() { if (!this.mongoTemplate.collectionExists(User.class)) { this.mongoTemplate.createCollection(User.class); } } public List<User> findList(int skip, int limit) { Query query = new Query(); query.with(new Sort(new Order(Direction.ASC, "id"))); query.skip(skip).limit(limit); return this.mongoTemplate.find(query, User.class); } public List<User> findListByName(String name) { Query query = new Query(); query.addCriteria(new Criteria("name").is(name)); return this.mongoTemplate.find(query, User.class); } public User findOne(String id) { Query query = new Query(); query.addCriteria(new Criteria("_id").is(id)); return this.mongoTemplate.findOne(query, User.class); } public void insert(User entity) { this.mongoTemplate.insert(entity); } public void update(User entity) { Query query = new Query(); query.addCriteria(new Criteria("_id").is(entity.getId())); Update update = new Update(); update.set("birthday", entity.getBirthday()); update.set("name", entity.getName()); this.mongoTemplate.updateFirst(query, update, User.class); } }4.spring配置
mongodb.properties
monngo.host=192.168.36.61 monngo.port=23000
application-context.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:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation=" http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="cn.slimsmart.mongodb.demo.spring" /> <context:property-placeholder location="classpath*:mongodb.properties" /> <mongo:mongo id="mongo" host="${monngo.host}" port="${monngo.port}"> <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的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 --> <mongo:db-factory id="mongoDbFactory" dbname="User" mongo-ref="mongo" /> <!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 --> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> </bean> <!-- 映射转换器,扫描back-package目录下的文件,根据注释,把它们作为mongodb的一个collection的映射 User --> <mongo:mapping-converter base-package="cn.slimsmart.mongodb.demo.spring" /> <!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 --> <mongo:repositories base-package="cn.slimsmart.mongodb.demo.spring" /> <!-- To translate any MongoExceptions thrown in @Repository annotated classes --> <context:annotation-config /> </beans>
部署几个Mongos,使用同一个配置库,问题解决,具体配置如下:
<mongo:mongo id=
"mongo"
replica-set=
"${mongodb.replica-set}"
>
<mongo:options connections-per-host=
"${mongodb.connectionsPerHost}"
threads-allowed-to-block-
for
-connection-multiplier=
"${mongodb.threads-allowed-to-block-for-connection-multiplier}"
connect-timeout=
"${mongodb.connect-timeout}"
max-wait-time=
"${mongodb.max-wait-time}"
auto-connect-retry=
"${mongodb.auto-connect-retry}"
socket-keep-alive=
"${mongodb.socket-keep-alive}"
socket-timeout=
"${mongodb.socket-timeout}"
slave-ok=
"${mongodb.slave-ok}"
write-number=
"${mongodb.write-number}"
write-timeout=
"${mongodb.write-timeout}"
write-fsync=
"${mongodb.write-fsync}"
/>
</mongo:mongo>
|
其中,replica-set格式:ip1:port,ip2:port,...
package cn.slimsmart.mongodb.demo.spring; import java.util.Date; import java.util.UUID; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { @SuppressWarnings("resource") ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml"); UserRepository userRepository = context.getBean(UserRepository.class); userRepository.test(); userRepository.createCollection(); User user = new User(); user.setId(UUID.randomUUID().toString()); user.setName("jack"); user.setBirthday(new Date()); userRepository.insert(user); System.out.println(userRepository.findListByName("jack"));; } }
参考文档:
1.Spring Data for Mongo 介绍
2.详解Spring整合MongoDB