摘自:https://www.zhaochao.top/article/138,更多开发技术请访问 https://www.zhaochao.top
一 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
二 application.properties配置
spring.data.mongodb.uri=mongodb://username:password@ip:port(一般为27017)/test
三 编写CRUD
package com.study.springboot.SpringBoot_A.cache.mongodb.impl;
import com.study.springboot.SpringBoot_A.bean.User;
import com.study.springboot.SpringBoot_A.cache.mongodb.MongoService;
import org.springframework.beans.factory.annotation.Autowired;
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.Component;
import java.util.List;
/**
* @author 赵超
* @Description
* @create 2018-03-30 13:38
**/
@Component
public class MongoServiceImpl implements MongoService {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 设置User对象保存的collectionName,
* 不指定collectionName保存,会默认使用对象名称,
* 后面的CRUD操作中的collectionName均不为必填参数
*/
private static final String userCollectionName = "myCollection";
/**
* 保存对象
* @param user
*/
@Override
public void saveUser(User user) {
//不指定collectionName保存,会默认使用对象名称
// mongoTemplate.save(user);
//指定collectionName保存
mongoTemplate.save(user, userCollectionName);
}
/**
* 条件查找
* @param userName
* @return
*/
@Override
public List<User> findUserByUserName(String userName) {
Query query = new Query(Criteria.where("userName").is(userName));
User one = mongoTemplate.findOne(query, User.class, userCollectionName);
System.out.println("one: " + one);
List<User> users = mongoTemplate.find(query, User.class, userCollectionName);
System.out.println("all: " + users);
return users;
}
/**
* 修改更新对象
* @param user
*/
@Override
public void updateUser(User user) {
Query query = new Query(Criteria.where("id").is(user.getId()));
Update update = new Update().set("userName", user.getUserName()).set("passWord", user.getPassWord());
//更新查询返回结果集的第一条
mongoTemplate.updateFirst(query, update, User.class, userCollectionName);
//更新查询返回结果集的所有
mongoTemplate.updateFirst(query, update, User.class, userCollectionName);
}
/**
* 删除对象
* @param id
*/
@Override
public void deleteUserById(Long id) {
Query query = new Query(Criteria.where("id").is(id));
mongoTemplate.remove(query, User.class, userCollectionName);
}
}
四 测试
package com.study.springboot.SpringBoot_A.cache;
import com.study.springboot.SpringBoot_A.SpringBootAApplication;
import com.study.springboot.SpringBoot_A.bean.User;
import com.study.springboot.SpringBoot_A.cache.mongodb.MongoService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author 赵超
* @Description
* @create 2018-03-30 13:40
**/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(SpringBootAApplication.class)
public class TestMongo {
@Autowired
private MongoService mongoService;
@Test
public void testSave() {
User user = new User("username", "111222", "121@334.com", "zc", "2018-03-30");
user.setId(1010l);
mongoService.saveUser(user);
}
@Test
public void testQuery() {
String userName = "username";
mongoService.findUserByUserName(userName);
}
@Test
public void testUpdate() {
User user = new User("newName", "66666", "121@334.com", "zc", "2018-03-30");
user.setId(100l);
mongoService.updateUser(user);
}
@Test
public void testDelete() {
mongoService.deleteUserById(100l);
}
}
五 多数据源(并未自己测试)
在多mongodb数据源的情况下,我们换种更优雅的方式来实现
1、pom包配置
添加lombok和spring-boot-autoconfigure包引用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>RELEASE</version>
</dependency>
Lombok – 是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。简单试了以下这个工具还挺好玩的,加上注解我们就不用手动写 getter\setter、构建方式类似的代码了。
spring-boot-autoconfigure – 就是spring boot的自动化配置。
2、配置文件使用YAML的形式添加两条数据源,如下:
mongodb:
primary:
host: 192.168.9.60
port: 20000
database: test
secondary:
host: 192.168.9.60
port: 20000
database: test1
3、配置两个库的数据源
封装读取以mongodb开头的两个配置文件
@Data
@ConfigurationProperties(prefix = "mongodb")
public class MultipleMongoProperties {
private MongoProperties primary = new MongoProperties();
private MongoProperties secondary = new MongoProperties();
}
配置不同包路径下使用不同的数据源
第一个库的封装:
@Configuration
@EnableMongoRepositories(basePackages = "com.neo.model.repository.primary",
mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)
public class PrimaryMongoConfig {
protected static final String MONGO_TEMPLATE = "primaryMongoTemplate";
}
第二个库的封装:
@Configuration
@EnableMongoRepositories(basePackages = "com.neo.model.repository.secondary",
mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
public class SecondaryMongoConfig {
protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate";
}
读取对应的配置信息并且构造对应的MongoTemplate。
@Configuration
public class MultipleMongoConfig {
@Autowired
private MultipleMongoProperties mongoProperties;
@Primary
@Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
public MongoTemplate primaryMongoTemplate() throws Exception {
return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));
}
@Bean
@Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)
public MongoTemplate secondaryMongoTemplate() throws Exception {
return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));
}
@Bean
@Primary
public MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {
return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
mongo.getDatabase());
}
@Bean
public MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {
return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
mongo.getDatabase());
}
}
两个库的配置信息已经完成。
4、创建两个库分别对应的对象和Repository
借助lombok来构建对象
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "first_mongo")
public class PrimaryMongoObject {
@Id
private String id;
private String value;
@Override
public String toString() {
return "PrimaryMongoObject{" + "id='" + id + '\'' + ", value='" + value + '\''
+ '}';
}
}
对应的Repository
public interface PrimaryRepository extends MongoRepository<PrimaryMongoObject, String> {
}
继承了 MongoRepository 会默认实现很多基本的增删改查,省了很多自己写dao层的代码。
Secondary和上面的代码类似就不贴出来了。
5、最后测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class MuliDatabaseTest {
@Autowired
private PrimaryRepository primaryRepository;
@Autowired
private SecondaryRepository secondaryRepository;
@Test
public void TestSave() {
System.out.println("************************************************************");
System.out.println("测试开始");
System.out.println("************************************************************");
this.primaryRepository
.save(new PrimaryMongoObject(null, "第一个库的对象"));
this.secondaryRepository
.save(new SecondaryMongoObject(null, "第二个库的对象"));
List<PrimaryMongoObject> primaries = this.primaryRepository.findAll();
for (PrimaryMongoObject primary : primaries) {
System.out.println(primary.toString());
}
List<SecondaryMongoObject> secondaries = this.secondaryRepository.findAll();
for (SecondaryMongoObject secondary : secondaries) {
System.out.println(secondary.toString());
}
System.out.println("************************************************************");
System.out.println("测试完成");
System.out.println("************************************************************");
}
}
到此,mongodb多数据源的使用已经完成。