SpringBoot中操作MongoDB数据库(使用MongoTemplate和Jpa方式)

1.声明

当前的内容用于本人学习和操作当前的SpringBoot对MongoDB数据库的操作,该操作分为使用MongoTemplate和Jpa两种方式

当前内容借鉴:Spring Data MongoDB

2.pom依赖

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.5.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>springboot-jpa-mongodb</groupId>
	<artifactId>springboot-jpa-mongodb</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>springboot-jpa-mongodb</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-mongodb</artifactId>
		</dependency>
	</dependencies>
</project>

主要使用spring-boot-starter-data-mongodb

3.使用MongoTemplate方式操作数据库

配置文件mongodb.properties中的内容:

mongodb.url=mongodb://localhost
mongodb.database=database

1.首先创建配置类MongoDBConfig

/**
 * @description 当前MongoDB的配置类
 * @author hy
 * @date 2020-04-05
 */
@PropertySource(value = { "mongodb.properties" })
@Configuration
public class MongoDBConfig {

	@Value("${mongodb.url}")
	private String mongoUrl;

	@Value("${mongodb.database}")
	private String mongoDateBase;

	public @Bean MongoTemplate mongoTemplate() {
		return new MongoTemplate(new SimpleMongoClientDbFactory(MongoClients.create(mongoUrl), mongoDateBase));
	}

}

2.创建实体类Person

public class Person {

	private String id;
	private String name;
	private int age;
}

3.创建controller来实现各种操作

@RestController
public class PersonController {
	@Autowired
	MongoTemplate mongoTemplate;

	// 分页查询
	@RequestMapping("/findPersonPage")
	public Object findPersonPage(Integer currentPageNo, Integer pageSize) {
		Query limit = new Query().skip((currentPageNo - 1) * pageSize).limit(pageSize);
		List<Person> findPerson = mongoTemplate.find(limit, Person.class);
		return findPerson;
	}

	// 查询所有的数据
	@RequestMapping("/findAll")
	public Object findAll() {
		List<Person> findPerson = mongoTemplate.findAll(Person.class);
		return findPerson;
	}

	// 修改数据
	@RequestMapping("updatePersonByName")
	public ResponseEntity<?> updatePersonByName(String name, Integer age) {
		UpdateResult updateResult = mongoTemplate.updateFirst(Query.query(Criteria.where("name").is(name)),
				Update.update("age", age), Person.class);
		long modifiedCount = updateResult.getModifiedCount();
		/* mongoTemplate.updateMulti(query, update, entityClass) */
		return ResponseEntity.ok("修改成功,修改数量:" + modifiedCount);
	}

	// 增加数据
	@RequestMapping("/insertPerson")
	public ResponseEntity<?> insertPerson(Person person) {
		Person insert = mongoTemplate.insert(person);
		return ResponseEntity.ok("添加成功,添加后的用户id为:" + insert.getId());
	}

	// 删除数据
	@RequestMapping("/deletePersonById/{id}")
	public ResponseEntity<?> deletePersonById(@PathVariable("id") String id) {
		Person findAndRemove = mongoTemplate.findAndRemove(Query.query(Criteria.where("id").is(id)), Person.class);
		return ResponseEntity.ok("删除成功,删除的数据为:" + findAndRemove);
	}

}

4.创建入口类

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MongoDBApplication {
	public static void main(String[] args) {
		SpringApplication.run(MongoDBApplication.class, args);
	}
}

6.测试成功,这里就不显示结果了

4.使用Jpa方式(Spring data方式操作)

1.还是配置MongoDBConfig和前面3中保持一致

2.创建实体类

@Document
public class PersonJpa {

	@Id
	private String id;
	private String name;
	private Integer age;
}

这里需要使用@Document方式,这里默认创建的collection就是PersonJpa,可以指定,需要指定@Id

3.创建dao层

@Repository
public interface PersonJpaDao extends MongoRepository<PersonJpa, String> {
	PersonJpa findByName(String name);//自定义查询方法查询单个数据
}

4.创建controller层

@RestController
public class PersonJpaController {
	@Autowired
	PersonJpaDao personJpaDao;

	// 分页查询
	@RequestMapping("/findPersonPage")
	public Object findPersonPage(Integer currentPageNo, Integer pageSize) {
		/*
		 * Query limit = new Query().skip((currentPageNo - 1) *
		 * pageSize).limit(pageSize);
		 */
		/* ExampleMatcher matcher=new */
		Page<PersonJpa> findPerson = personJpaDao.findAll(PageRequest.of(currentPageNo, pageSize));
		// List<Person> findPerson = mongoTemplate.find(limit, Person.class);
		return findPerson;
	}

	// 查询所有的数据
	@RequestMapping("/findAll")
	public Object findAll() {
		List<PersonJpa> findPerson = personJpaDao.findAll();
		return findPerson;
	}

	// 修改数据
	@RequestMapping("updatePersonByName")
	public ResponseEntity<?> updatePersonByName(PersonJpa personJpa) {
		/*
		 * UpdateResult updateResult =
		 * mongoTemplate.updateFirst(Query.query(Criteria.where("name").is(name)),
		 * Update.update("age", age), Person.class);
		 */
		Example<PersonJpa> of = Example.of(personJpa,UntypedExampleMatcher.matchingAny());
		Optional<PersonJpa> findOne = personJpaDao.findOne(of);
		PersonJpa findByName = personJpaDao.findByName(personJpa.getName());// 使用这个方式也可以实现
		PersonJpa update = findOne.get();
		if (update != null) {
			update.setAge(personJpa.getAge());
			personJpaDao.save(update);
			return ResponseEntity.ok("修改成功,修改数量:1");
		}
		return ResponseEntity.ok("修改失败,当前的 【" + personJpa.getName() + "】 不存在!");

	}

	// 增加数据
	@RequestMapping("/insertPerson")
	public ResponseEntity<?> insertPerson(PersonJpa personJpa) {
		PersonJpa save = personJpaDao.save(personJpa);
		return ResponseEntity.ok("添加成功,添加后的用户id为:" + save.getId());
	}

	// 删除数据
	@RequestMapping("/deletePersonById/{id}")
	public ResponseEntity<?> deletePersonById(@PathVariable("id") String id) {
		Optional<PersonJpa> findById = personJpaDao.findById(id);
		PersonJpa personJpa = findById.get();
		if (personJpa != null) {
			personJpaDao.delete(personJpa);
			/* personJpaDao.deleteAll(entities); */
			return ResponseEntity.ok("删除成功,删除的数据为:" + personJpa);
		}

		return ResponseEntity.ok("删除成功,当前需要删除的id不存在:" + id);
	}

}

5.创建入口类

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableMongoRepositories(basePackageClasses = { PersonJpaDao.class }) // springdata的使用
public class MongoDBApplication {
	public static void main(String[] args) {
		SpringApplication.run(MongoDBApplication.class, args);
	}
}

6.测试,结果这里不显示(是成功的)

5.总结

1.使用MongoTemplate,其中的Query和Criteria以及Update这个对数据库操作粒度更加细致

2.使用当前的Jpa方式操作,需要让dao层继承MongoRepository或者其他的Reposity实现接口,还需要让实体类定义为@Document并且必须指定@Id,最后还要开启@EnableMongoRepositories,才能操作成功

以上纯属个人见解,如有问题请联系本人!

发布了242 篇原创文章 · 获赞 44 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_45492007/article/details/105340765