Spring Data MongoDB实战(上)
本文会详细展示Spring Data MongoDB是如何访问MongoDB数据库的。MongoDB是一个开源的文档型NoSQL数据库,而Spring Data MongoDB是Spring Data的模块之一,专用于访问MongoDB数据库。Spring Data MongoDB模块既提供了基于方法名的查询方式,也提供了基于注释的查询方式。
1、用Spring Data配置并管理MongoDB
要安装MongoDB数据库,可以从这里下载:https://www.mongodb.org/downloads
安装过程省略。完成MongoDB的安装和运行后,可以开始应用开发了。
首先在Eclipse创建一个简单的Maven项目,并配置pom.xml管理Spring Data MongoDB项目的依赖。内容如下:
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>SpringDataMongoDBDemo</groupId>
<artifactId>SpringDataMongoDBDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.7.2.RELEASE</version>
</dependency>
</dependencies>
</project>
Eclipse会下载所需的JAR包并把依赖关系配置到项目的类路径下。现在项目的依赖关系已经完成导入,可以开始编写实际的代码了。
首先创建需要持久化到MongoDB数据库的实体类。
Person.java
package com.ch.jpa.entity;
import java.util.ArrayList;
import java.util.List;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.mongodb.core.mapping.DBRef;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "person")
public class Person {
@Id
private Long personId;
private String name;
private int age;
@DBRef(db = "address")
private List<Address> addresses = new ArrayList<>();
public Person() {
}
@PersistenceConstructor
public Person(Long personId, String name, int age) {
super();
this.personId = personId;
this.name = name;
this.age = age;
}
public Long getPersonId() {
return personId;
}
public void setPersonId(Long personId) {
this.personId = personId;
}
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 List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
@Override
public String toString() {
return "Person [personId=" + personId + ", name=" + name + ", age=" + age + ", addresses=" + addresses + "]";
}
}
注释@Document表示待持久化的数据是一个集合。如果集合没有指定名字,那么默认会使用实体类的类名作为集合名。
注释@Id表示被注解的域被映射到集合中的_id列。如果实体类中未使用此注释,那么默认名为id的域会被映射到集合中的_id列。而且此域的值由MongoDB的驱动包自动产生,它的值在在POJO中是不可用的。
注释@DBRef用于在当前的实体类中引用已有的实体类。然而,与关系数据库的情况不同,如果我们保存当前实体,它不会保存引用的相关实体。引用的相关实体的持久化是分开的。
注释@PersistenceConstructor用于标记从MongoDB数据库服务器取回数据时创建实体的构造方法。
下面是关联的Address实体类:
Address.java
package com.ch.jpa.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "address")
public class Address {
@Id
private long addressId;
private String address;
private String city;
private String state;
private long zipcode;
public Address() {
System.out.println("CAlling default cons");
}
@PersistenceConstructor
public Address(long addressId, String address, String city, String state, long zipcode) {
super();
this.addressId = addressId;
this.address = address;
this.city = city;
this.state = state;
this.zipcode = zipcode;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public long getZipcode() {
return zipcode;
}
public void setZipcode(long zipcode) {
this.zipcode = zipcode;
}
@Override
public String toString() {
return "Address [address=" + address + ", city=" + city + ", state=" + state + ", zipcode=" + zipcode + "]";
}
}
版权