环境介绍
Java环境下简单的Spring工程
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>3.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>bson</artifactId>
<version>4.0.4</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-core</artifactId>
<version>4.0.4</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.0.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<!-- <dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.12.5</version>
</dependency>-->
</dependencies>
注入必要的Bean
在学习使用mongoTemplate的时候,一定要注意spring版本和mongodb-driver的版本,在mongodb-driver早些版本的时候,使用的是Mongo代表一个客户端
com.mongodb.Mongo
但现在的较新版本已经删除该类,与之代替的是MongoClient
com.mongodb.client.MongoClient;
所以,使用的spring-data-mongodb也必须是支持的较新的mongo-driver的。
现在开始正式写配置(如下是基于java的配置)
@Configuration
public class MongoConfig {
@Bean
public MongoClientFactoryBean mongoClientFactoryBean() {
MongoClientFactoryBean factoryBean = new MongoClientFactoryBean();
factoryBean.setHost("192.168.1.100");
factoryBean.setPort(27017);
return factoryBean;
}
@Bean
public MongoOperations mongoTemplate(MongoClient mongoClient) {
return new MongoTemplate(mongoClient, "studydb");
}
}
MongoClientFactoryBean也就是旧版本的MongoFactoryBean,官方解释说“可以更方便的配置MongoClient"。也就是说,在配置MongoClientFactoryBean的时候会自动装配一个MongoClient在容器里面,因此在装配mongoTemplate的收可以直接将MongoClient作为参数传入。
当然在其他地方使用MongoClient,就只需要@Autowired。
测试
package mongod;
import com.mongodb.client.MongoClients;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.data.mongodb.core.MongoTemplate;
public class MongoMain {
public static void main(String[] args) {
ApplicationContext ioc = new AnnotationConfigApplicationContext(MongoConfig.class);
MongoTemplate mongoTemplate = ioc.getBean(MongoTemplate.class);
Person person = new Person(null, "JayHoo", 21, "四川省绵阳市");
mongoTemplate.insert(person);
}
}
其中使用到一个Person的类,代码简单如下
@Document(collection = "person")
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Data
public class Person {
@Id
private String id;
private String name;
private int age;
@Transient
private String address;
}
执行的目的就是在数据库里插入一条person记录,效果如图
注意: 在配置实体类时,address上使用@Transient注解,就表明address不会被序列化到mongodb数据库中。
填坑记
之前用springBoot根本不会考虑这些问题,谁叫我喜欢折腾自己呢~
1.导错包
根据方法栈显示,在MongoTemplate的1442行调用了一个方法,这个方法就是
com.mongod.client.MongoCollection.insertOne()
这里得提一句,网络上说java链接mongodb需要三个包,分别是
mongo-java-driver
mongodb-driver-core
bson
其实这三个包足够连mongodb了,但是spring做mongotemplate的时候,并没选择第一个包,取而代之的是
mongo-java-sync
这一点可以从SpringBoot的依赖中可以看出,因此将mongo-java-driver换成mongodb-driver-sync就可以和Spring整合了。