mongodb中文手册地址:
https://www.mongodb.org.cn/tutorial/
项目名称:springboot_mongodb
启动mongodb,然后创建一个数据库和集合:
> use mydb #使用这个数据库mydb,没有则自动创建
switched to db mydb
> db #显示当前所在的数据
mydb
> db.createCollection("stu") #创建集合,相当于创建表stu
{ "ok" : 1 }
> db.stu.save({"id":1,"name":"tom","age":88}) #向集合中插入一行数据
WriteResult({ "nInserted" : 1 })
> db.stu.find() #查询 集合中的所有数据
{ "_id" : ObjectId("62ecb249ee5d91af9b348550"), "id" : 1, "name" : "tom", "age" : 88 }
用可视化工具看:
或者这样再插入一条数据:
db.stu.save({“_id”:2,“name”:“bbb”,“age”:33})
结果如下:
先增加这两个数据;
org.springframework.boot
spring-boot-starter-web
2.6.10
org.springframework.boot
spring-boot-starter-data-mongodb
2.6.10
org.projectlombok
lombok
1.18.18
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
application.properties:
我这里是llinux中的docker安转mongodb,mydb为我的数据库名字,没有密码和用户名,
#mongo配置,地址,端口号,数据库名字
spring.data.mongodb.host=192.168.211.111
spring.data.mongodb.port=27017
spring.data.mongodb.database=mydb
有密码连接的:
spring:
data:
mongodb:
uri: mongodb://用户名:密码@服务器IP:端口/数据库名
# 上方为明确指定某个数据的用户进行连接
# 也可以使用admin 数据库中的用户进行连接 统一到admin 数据库进行认证
# admin 用户认证 url 写法: mongodb://账户:密码%40@ip:端口/数据库名?
authSource=admin&authMechanism=SCRAM-SHA-1
创建repository包,service包,controller包,entity包:
package com.fan.springboot_mongodb.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "stu") //类似于@Table标签,用于指明数据库表名/集合名
public class Stu {
@Id
private Long id;
private String name;
private Integer age;
}
_id映射层中如何处理字段
MongoDB 要求所有文档的字段拥有_id 。如果您不提供,驱动程序将分配ObjectId一个生成的值。当您使用 时MappingMongoConverter,某些规则会控制 Java 类中的属性如何映射到该_id字段:
用@Id注释的属性或字段 将会自动 映射到该_id字段。
即我们可以这样认为,属性的id就是对应数据库中的_id,查询的时候传入id,将来查的是_id
此接口继承extends MongoRepository基本接口:
package com.fan.springboot_mongodb.repository;
import com.fan.springboot_mongodb.entity.Stu;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
/*接口继承此接口MongoRepository,第二个参数是id属性的包装类 */
@Repository
public interface StuRepository extends MongoRepository {
Stu findStuById(Long id); //此方法不用实现,mongodb帮我们根据我们的名字去实现方法
//findStuById等方法要按照一定的约束来才可以帮我们实现,查询以findxxxBy等
}
MongoRepository接口定义了基本的一些curd方法:类似于mybatis-plus中的BaseMapper接口
package com.fan.springboot_mongodb.service;
import com.fan.springboot_mongodb.entity.Stu;
public interface StuService {
//定义一个查询方法
Stu findStuById(Long id);
}
实现类:
package com.fan.springboot_mongodb.service.impl;
import com.fan.springboot_mongodb.entity.Stu;
import com.fan.springboot_mongodb.repository.StuRepository;
import com.fan.springboot_mongodb.service.StuService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class StuServiceImpl implements StuService {
//注入dao
@Resource
private StuRepository stuRepository;
@Override
public Stu findStuById(Long id) {
Stu stu = stuRepository.findStuById(id);
return stu;
}
}
package com.fan.springboot_mongodb.controller;
import com.fan.springboot_mongodb.entity.Stu;
import com.fan.springboot_mongodb.service.StuService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class StuController {
//注入service
@Resource
private StuService stuService;
@GetMapping("/findStuById/{id}")
public Stu findStuById(@PathVariable Long id){
Stu stuById = stuService.findStuById(id);
return stuById;
}
}
此时数据库数据如下:
测试:
发现id=1查不出来,从这里看出来我们的id进了数据库会被传值给_id主键;
controller:
package com.fan.springboot_mongodb.controller;
import com.fan.springboot_mongodb.entity.Stu;
import com.fan.springboot_mongodb.service.StuService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
public class StuController {
//注入service
@Resource
private StuService stuService;
@GetMapping("/findStuById/{id}")
public Stu findStuById(@PathVariable Long id){
Stu stuById = stuService.findStuById(id);
return stuById;
}
//增加
@PostMapping("/saveStu")
public void saveStu(@RequestBody Stu stu){
stuService.saveStu(stu);
}
//删除
@DeleteMapping("/deleteStuById/{id}")
public void deleteStuById(@PathVariable Long id){
stuService.deleteStuById(id);
}
//修改
@PutMapping("/updateStu")
public void updateStu(@RequestBody Stu stu){
stuService.updateStu(stu);
}
}
service:
package com.fan.springboot_mongodb.service;
import com.fan.springboot_mongodb.entity.Stu;
public interface StuService {
//定义一个查询方法
Stu findStuById(Long id);
void saveStu(Stu stu);
void deleteStuById(Long id);
void updateStu(Stu stu);
}
实现类:
package com.fan.springboot_mongodb.service.impl;
import com.fan.springboot_mongodb.entity.Stu;
import com.fan.springboot_mongodb.repository.StuRepository;
import com.fan.springboot_mongodb.service.StuService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class StuServiceImpl implements StuService {
//注入dao
@Resource
private StuRepository stuRepository;
@Override
public Stu findStuById(Long id) {
Stu stu = stuRepository.findStuById(id);
return stu;
}
@Override
public void saveStu(Stu stu) {
stuRepository.save(stu);//MongonRepository底层封装了save方法
}
@Override
public void deleteStuById(Long id) {
stuRepository.deleteById(id);//deleteById是底层封装好的
}
@Override
public void updateStu(Stu stu) {
stuRepository.save(stu);//当stu中包含数据库中有的id的时候,save是更新
}
}
dao层:
package com.fan.springboot_mongodb.repository;
import com.fan.springboot_mongodb.entity.Stu;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
/*接口继承此接口MongoRepository,第二个参数是id属性的包装类 */
@Repository
public interface StuRepository extends MongoRepository {
Stu findStuById(Long id);
}
测试:
删除:
修改:
查: