首先是安装mongodb,本次使用Docker来安装,这样能快速部署mongodb。
1) 在CentOS7.6上根据Docker官网安装Docker,然后部署mongodb环境。
# docker pull mongo // 刚开始的时候以为是mongodb,后来看了下是mongo
# docker run --name my-mongo -p 27017:27017 -v /mydata/mongodata:/data/db -d mongo // 这里没有添加auth验证,如果为了安全考虑可以加上--auth.
# docker exec -it my-mongo mongo bash // 可以直接进入mongo容器中。
上述是简单的mongodb的简单配置。
2) 需要测试下是否配置成功,刚开始没有测试,直接在springboot里配置测试,发现一直报如下错误。然后使用可视化工具Robo 3T测试了下连接,连接不上,应该是网段的问题。不知道是不是mongodb不支持跨网段访问。然后在同网段测试就可以正常连接了。
13:32:59.615 [cluster-ClusterId{value='60752d0b30efac24106e453c', description='null'}-xx.xxx.xxx.xxx:27017] INFO org.mongodb.driver.cluster - Exception in monitor thread while connecting to server xx.xxx.xxx.xxx:27017
com.mongodb.MongoSocketReadException: Exception receiving message
at com.mongodb.internal.connection.InternalStreamConnection.translateReadException(InternalStreamConnection.java:637)
at com.mongodb.internal.connection.InternalStreamConnection.receiveMessageWithAdditionalTimeout(InternalStreamConnection.java:516)
at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:356)
at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:280)
at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:83)
at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:33)
at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:107)
at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:62)
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:144)
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:188)
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:144)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:109)
at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:131)
at com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:648)
at com.mongodb.internal.connection.InternalStreamConnection.receiveMessageWithAdditionalTimeout(InternalStreamConnection.java:513)
3) SpringBoot环境配置及测试。
首先是pom.xml依赖。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 这个用来测试直接连接mongodb -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.1.2</version>
</dependency>
</dependencies>
配置文件application.yml文件:
server:
port: 8081
spring:
data:
mongodb:
host: xx.xxx.xxx.xxx
port: 27017
database: dbtest1
对于数据库操作来说,可以先定义数据结构,然后定义数据库操作,再次就是外部Controller接口,算是Controller -> Service --(Dao)--> Bean
Bean:
@Data
public class FirmwareSups {
@Id
private String id;
private String fixId;
private String version;
private String name;
private String category;
// 下面部分一般不需要,添加了@Data就可以了,这里是为了测试方便,把setter和getter都写了出来
public FirmwareSups(String id, String fixId, String version, String name, String category) {
this.id = id;
this.fixId = fixId;
this.version = version;
this.name = name;
this.category = category;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFixId() {
return fixId;
}
public void setFixId(String fixId) {
this.fixId = fixId;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public List<String> getMachineTypes() {
return machineTypes;
}
public void setMachineTypes(List<String> machineTypes) {
this.machineTypes = machineTypes;
}
public List<Component> getComponents() {
return components;
}
public void setComponents(List<Component> components) {
this.components = components;
}
private List<String> machineTypes = new ArrayList<>();
private List<Component> components = new ArrayList<>();
}
Service接口:
public interface FirmwareSupsService {
public String saveSups(FirmwareSups sups);
public String removeSups(FirmwareSups sups);
public List<FirmwareSups> findAll();
public FirmwareSups getSupsById(String id);
public String updateSups(FirmwareSups sups);
public String deleteSupsById(String id);
}
ServiceImpI实现:
@Service
public class FirmwareSupsServiceImpI implements FirmwareSupsService {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public String saveSups(FirmwareSups sups) {
mongoTemplate.save(sups);
return "Save successfully";
}
@Override
public String removeSups(FirmwareSups sups) {
mongoTemplate.remove(sups);
return "Remove Successfully";
}
@Override
public List<FirmwareSups> findAll() {
return mongoTemplate.findAll(FirmwareSups.class);
}
@Override
public FirmwareSups getSupsById(String id) {
Query query = new Query(Criteria.where("_id").is(id));
return mongoTemplate.findOne(query, FirmwareSups.class);
}
@Override
public String updateSups(FirmwareSups sups) {
Query query = new Query(Criteria.where("_id").is(sups.getId()));
Update update = new Update().set("fixid", sups.getFixId());
return "Update Successfully";
}
@Override
public String deleteSupsById(String id) {
FirmwareSups sups = getSupsById(id);
removeSups(sups);
return "Delete successfully";
}
}
这里使用了MongoTemplate,其实也可以使用MongoRepository, 如下:
public interface FirmwareSupsService extends MongoRepository<FirmwareSups, String> {
}
Controller层:
@RestController
public class FirmwareSupsController {
@Autowired
private FirmwareSupsService firmwareSupsService;
@RequestMapping("/find")
public List<FirmwareSups> find() {
return firmwareSupsService.findAll();
}
@RequestMapping("/delete")
public String delete(String id) {
firmwareSupsService.deleteSupsById(id);
return "Delete Successfully";
}
}
DemoApplication:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
//testMongoDB(); // 直接连接测试
}
public static void testMongoDB() {
MongoClient client = MongoClients.create("mongodb://xx.xxx.xxx.xxx:27017");
MongoDatabase database = client.getDatabase("dbtest1");
MongoCollection<Document> userCollection = database.getCollection("user");
userCollection.find().forEach(document -> {
System.out.println(document.toJson());
});
client.close();
}
}
测试用例:
@SpringBootTest
public class TestSupsService {
@Autowired
FirmwareSupsServiceImpI firmwareSupsServiceImpI;
@Test
public void testSaveSups() {
FirmwareSups sups = new FirmwareSups("lnvgy_fw_hdd", "lnvgy_fw_hdd","3.1", "HDD", "Hard Disk");
sups.getMachineTypes().add("7Y54");
sups.getMachineTypes().add("7Y99");
Component component1 = new Component("Softv1", "3.2.2", "10");
Component component2 = new Component("Softv2", "3.3.2", "10");
sups.getComponents().add(component1);
sups.getComponents().add(component2);
firmwareSupsServiceImpI.saveSups(sups);
}
}
测试结果: