最近在学习MongoDB,之前使用java简单的对mongoDB进行CRUD操作,这次就尝试Spring和MongoDB的整合,小编也是第一次接触MongoDB,如有写的完善的地方,还望大家多多包涵;好啦,废话不多说,咋们直接上代码。
Tips : 本次整合我们没有使用XMl的方式来管理Spring, 我们使用编码的方式。
一 :开发环境准备
(1):开发工具 IDEA 2016
(2):Spring 4.0.0 MongoDB 3.2.2 Maven 3.2
二 :创建maven工程,引入相应的依赖
创建过程在这里就不用多说了,下面是pom.xml的相关依赖
(1):pom.xml
<dependencies>
<!-- Junit测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<!-- MongoDB驱动 -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.2.2</version>
</dependency>
<!-- spring-data 依赖 -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.8.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons-core</artifactId>
<version>1.4.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>1.10.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.7.0.RELEASE</version>
</dependency>
<!-- 日志依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.5</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.8.3</version>
</dependency>
</dependencies>
(二):Person.java
/**
* 使用@Document注解标明在MongoDB数据库中生成的集合名称
*
* 若不指定则默认为类名第一个字母小写
*/
@Document(collection = "persons")
public class Person implements Serializable {
@Id
private String id;
private String name;
private Integer age ;
public Person() {
}
public Person(String id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
(三):PersonDao.java
public interface PersonDao {
/**
* 保存信息
* @param person
*/
void save(Person person);
/**
* 根据ID查询信息
* @param id
* @return
*/
Person findOneById(String id);
/**
* 根据姓名模糊查询
* @param nameReg
* @return
*/
List<Person> findListByRegex(String nameReg);
/**
* 根据ID查询并修改信息
* @param id
* @param person
* @return
*/
Person findAndModify(String id, Person person);
/**
* 根据ID删除信息
* @param id
*/
void deleteById(String id);
}
(4):PersonDaoImpl.java
public class PersonDaoImpl implements PersonDao {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 保存信息
*
* @param person
*/
public void save(Person person) {
mongoTemplate.save(person);
}
/**
* 根据ID查询信息
*
* @param id
* @return
*/
public Person findOneById(String id) {
Query query = new Query(Criteria.where("id").is(id));
return mongoTemplate.findOne(query, Person.class);
}
/**
* 根据姓名模糊查询
*
* @param nameReg
* @return
*/
public List<Person> findListByRegex(String nameReg) {
String reg = "\\w*" + nameReg + "\\w*";
Query query = new Query(Criteria.where("name").regex(reg));
return mongoTemplate.findAllAndRemove(query, Person.class);
}
/**
* 根据ID查询并修改信息
* 返回更新前的信息, 若要返回更新后的信息,则还需要第四个参数 FindAndModifyOptions
* @param id
* @param person
* @return
*/
public Person findAndModify(String id, Person person) {
Query query = new Query(Criteria.where("id").is(id));
Update update = new Update().set("age", person.getAge())
.set("name", person.getName());
//实现返回更新后的信息
FindAndModifyOptions options = new FindAndModifyOptions();
options.returnNew(true);
return mongoTemplate.findAndModify(query, update, options, Person.class);
}
/**
* 根据ID删除信息
*
* @param id
*/
public void deleteById(String id) {
Query query = new Query(Criteria.where("id").is(id));
mongoTemplate.remove(query, Person.class);
}
}
(5):java配置类(AppConfig.java)
@Configuration
public class AppConfig extends AbstractMongoConfiguration {
/**
* 指定数据库名称
* @return
*/
protected String getDatabaseName() {
return "springMongoJavaCode";
}
/**
* 连接MongoDB的主机和端口
* @return
* @throws Exception
*/
public Mongo mongo() throws Exception {
return new MongoClient("localhost",27017);
}
/**
* 将PersonDao放入Spring容器中,让Spring进行管理
* @return
*/
@Bean
public PersonDao personDao(){
return new PersonDaoImpl();
}
}
Tips : 在这个配置类注意到我们继承了org.springframework.data.mongodb.config.AbstractMongoConfiguration类
通过查看该类的源码我们不难发现,该类已经为我们管理了MongoTemplate, Mongo……
@Configuration
public abstract class AbstractMongoConfiguration {
public AbstractMongoConfiguration() {
}
protected abstract String getDatabaseName(); //返回集合的名称
/** @deprecated */
@Deprecated
protected String getAuthenticationDatabaseName() {
return null;
}
public abstract Mongo mongo() throws Exception; //通过它获取MongoClient
@Bean
public MongoTemplate mongoTemplate() throws Exception {
return new MongoTemplate(this.mongoDbFactory(), this.mappingMongoConverter());
}
@Bean
public MongoDbFactory mongoDbFactory() throws Exception {
return new SimpleMongoDbFactory(this.mongo(), this.getDatabaseName(), this.getUserCredentials(), this.getAuthenticationDatabaseName());
}
}
(6):测试类
public class PersonDaoImplTest {
@Autowired
private PersonDao personDao;
@Test
public void save() throws Exception {
Person person = new Person("1002","鱼小七",13);
personDao.save(person);
}
@Test
public void findOneById() throws Exception {
String id = "1002";
Person person = personDao.findOneById(id);
}
@Test
public void findListByRegex() throws Exception {
String nameReg = "大";
List<Person> persons = personDao.findListByRegex(nameReg);
System.out.println(persons);
}
@Test
public void findAndModify() throws Exception {
String id = "1002";
Person person = personDao.findOneById(id);
person.setAge(8);
Person person1 = personDao.findAndModify(id, person);
System.out.println(person1);
}
@Test
public void deleteById() throws Exception {
String id = "1002";
personDao.deleteById(id);
}
}
接下来让我们看看运行的截图