上篇说了java连接mongo,并进行增删改查
这篇说一下spring整合mongo
github上也有小demo,很简单,适合初学者,地址:点击跳转
1、首先创建maven项目,添加依赖
注意:对应的Spring框架版本是4.X的,使用的spring-data-mongodb是1.X的版本。千万不要选2.x版本。否则会出问题。
<!-- mongo驱动 -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.8.1</version>
</dependency>
<!-- spring与mongo集成 -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.10.7.RELEASE</version>
</dependency>
2、mongo.properties 文件
mongo.host=localhost
mongo.port=27017
mongo.username=root
mongo.password=root
mongo.defaultDbName=test
mongo.connectionsPerHost=10
mongo.threadsAllowedToBlockForConnectionMultiplier=5
mongo.minConnectionsPerHost=5
#连接超时时间
mongo.connectTimeout=1000
#等待时间
mongo.maxWaitTime=1500
#Socket超时时间
mongo.socketTimeout=1000
mongo.socketKeepAlive=true
mongo.description=chat messgae mongodb database
mongo.maxConnectionIdleTime=1500
mongo.maxConnectionLifeTime=0
#mongo slave
mongo.heartbeatSocketTimeout=1000
mongo.heartbeatConnectTimeout=1500
mongo.minHeartbeatFrequency=5
mongo.heartbeatFrequency=10
mongo.autoConnectRetry=true
mongo.slaveOk=true
3、spring_mongo.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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
<context:property-placeholder location="classpath:mongo.properties" />
<context:component-scan base-package="com.zhangchao.mongo" />
<!-- Activate annotation configured components -->
<context:annotation-config/>
<!-- ============ MongoDB config start ============ -->
<!-- 定义mongo对象,对应的是mongodb官方jar包中的Mongo,replica-set设置集群副本的ip地址和端口 -->
<mongo:mongo-client id="mongoClient" host="${mongo.host}" port="${mongo.port}" >
<!-- 一些连接属性的设置 -->
<mongo:client-options
connections-per-host="${mongo.connectionsPerHost}"
threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
connect-timeout="${mongo.connectTimeout}"
max-wait-time="${mongo.maxWaitTime}"
socket-keep-alive="${mongo.socketKeepAlive}"
socket-timeout="${mongo.socketTimeout}"></mongo:client-options>
</mongo:mongo-client>
<!-- 定义MongoDbFactory -->
<mongo:db-factory id="dbFactory" dbname="${mongo.defaultDbName}" mongo-ref="mongoClient"/>
<!-- 定义没有_class字段的converter -->
<bean id="mongoMappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
<bean id="defaultTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
<constructor-arg name="typeKey"><null/></constructor-arg>
</bean>
<bean id="mongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
<constructor-arg name="mongoDbFactory" ref="dbFactory" />
<constructor-arg name="mappingContext" ref="mongoMappingContext" />
<property name="typeMapper" ref="defaultTypeMapper"></property>
</bean>
<!-- 定义Template -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="dbFactory"/>
<constructor-arg name="mongoConverter" ref="mongoConverter"/>
<!--<constructor-arg name="databaseName" value="${mongo.databaseName}"/>-->
</bean>
<!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes -->
<!-- ============ MongoDB config end ============ -->
</beans>
4、准备一个实体类
package com.zhangchao.mongo.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import java.util.Date;
/**
* @author zc
*/
@Document(collection = "student") //注解对应表名
public class Student {
@Id
private String id;
@Field
private String name;
@Field
private Integer age;
@Field
private String gender;
@Field
private Date createTime;
public Student() {
}
public Student( String name, Integer age, String gender, Date createTime) {
this.name = name;
this.age = age;
this.gender = gender;
this.createTime = createTime;
}
public Student( String id, String name, Integer age, String gender, Date createTime) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.createTime = createTime;
}
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;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", createTime=" + createTime +
'}';
}
}
5、通过mongoTemplate操作数据库进行增删改查
在MongoTemplate实例上引用操作的首选方法是通过其接口MongoOperations。
package com.zhangchao.mongo.main;
import com.mongodb.WriteResult;
import com.zhangchao.mongo.entity.Student;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoOperations;
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 javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
* @author zc
*/
public class MongoTemplateTest{
@Resource
private MongoOperations mongoTemplate;
@Before
public void setUp() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring_mongo.xml");
mongoTemplate = (MongoOperations) context.getBean("mongoTemplate");
}
/**
* insert插入
*/
@Test
public void insertone(){
//insert: 若新增数据的主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常提示主键重复,不保存当前数据
mongoTemplate.insert(new Student( "dsfsdfsdfsdfsde","王五2",15,"女",new Date()),"student");
}
/**
* save插入
*/
@Test
public void save(){
//save若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作
mongoTemplate.save(new Student( "wwwwwwwwwwww","宋九",21,"男",new Date()),"student");
}
/**
* 查询所有
*/
@Test
public void find() {
List<Student> all = mongoTemplate.findAll(Student.class,"student");
for (Student s:all
) {
System.out.println(s);
}
}
/**
* 条件查询
*/
@Test
public void find1(){
Query query = new Query(Criteria.where("name").is("王五").and("age").gte(20).lte(30));
List<Student> student = mongoTemplate.find(query, Student.class, "student");
for (Student s :
student) {
System.out.println(s);
}
}
/**
* 排序查询(按年龄倒序)
*/
@Test
public void find2(){
Query query = new Query();
Query q = query.with(new Sort(new Sort.Order(Sort.Direction.DESC, "age")));
List<Student> student = mongoTemplate.find(q, Student.class, "student");
for (Student s :
student) {
System.out.println(s);
}
}
/**
* 删除(名字包含赵)
*/
@Test
public void delete(){
Query query = new Query(Criteria.where("name").regex("赵"));
WriteResult result = mongoTemplate.remove(query, "student");
System.out.println(result);
}
/**
* 修改
* 如果query条件没有筛选出对应的数据,那么upsert会插入一条新的数据,而update则什么都不会做
*/
@Test
public void update(){
Query query = new Query(Criteria.where("age").ne(25));
Update update = Update.update("gender","女");
// 更新满足条件的第一条数据
// WriteResult result = mongoTemplate.updateFirst(query, update, "student");
// System.out.println(result);
// 更新所有满足条件的数据
WriteResult result1 = mongoTemplate.updateMulti(query, update, "student");
System.out.println(result1);
}
@Test
public void upsert(){
Query query = new Query(Criteria.where("age").is(35));
Update update = Update.update("gender","男");
WriteResult result = mongoTemplate.upsert(query, update, "student");
System.out.println(result);
}
}