项目的DEMO代码:https://github.com/heyu52/-spring-cloud
以下介绍来自百度百科
初识MongoDB
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
特点
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
- 面向集合存储,易存储对象类型的数据。
- 模式自由。
- 支持动态查询。
- 支持完全索引,包含内部对象。
- 支持查询。
- 支持复制和故障恢复。
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 自动处理碎片,以支持云计算层次的扩展性。
- 支持 Golang,RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- 文件存储格式为BSON(一种JSON的扩展)。
- 可通过网络访问。
不适用的场景
- 要求高度事务性的系统。
- 传统的商业智能应用。
- 复杂的跨文档(表)级联查询。
基本概念
- 域(Field):一个列
- 文档(Document):一行数据
- 集合(Collection):一个表
- 数据库(DataBase):一个数据库
安装
我们使用Docker进行安装:https://hub.docker.com/_/mongo
docker pull mongo
运行
实际使用中应该映射一下物理路径
docker run --name mongo -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=admin -d mongo
登录到 MongoDB 容器器中
docker exec -it mongo bash
通过 Shell 连接 MongoDB
mongo -u admin -p admin
查看数据库
db.getName();
创建用户
use mongo
db.createUser( { user: "csdn01", pwd: "csdn01", roles: [ { role: "readWrite", db: "test" } ] } )
创建项目
MongoTemplate方式
创建model
package com.csdn.demo.model;
import java.io.Serializable;
public class User implements Serializable {
private Long id;
private String userName;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
'}';
}
}
创建Repository
package com.csdn.demo.Repository;
import com.csdn.demo.model.User;
public interface UserRepository {
public void saveUser(User user);
public void deleteUserById(Long id);
public long updateUser(User user);
public User findUserByUserName(String userName);
}
创建Impl
package com.csdn.demo.Repository.Impl;
import com.csdn.demo.Repository.UserRepository;
import com.csdn.demo.model.User;
import com.mongodb.client.result.UpdateResult;
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;
@Component
public class UserRepositoryImpl implements UserRepository {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public void saveUser(User user) {
mongoTemplate.save(user);
}
@Override
public User findUserByUserName(String userName) {
Query query = new Query(Criteria.where("userName").is(userName));
User user = mongoTemplate.findOne(query, User.class);
return user;
}
@Override
public long updateUser(User user) {
Query query = new Query(Criteria.where("id").is(user.getId()));
Update update = new Update().set("userName", user.getUserName());
//只更新查询返回结果集的第一条
UpdateResult result = mongoTemplate.updateFirst(query, update, User.class);
//也可以更新查询返回结果集的所有
// mongoTemplate.updateMulti(query,update,UserEntity.class);
//返回影响行数
if (result != null)
return result.getMatchedCount();
else
return 0;
}
@Override
public void deleteUserById(Long id) {
Query query = new Query(Criteria.where("id").is(id));
mongoTemplate.remove(query, User.class);
}
}
创建测试Controller
package com.csdn.demo.web;
import com.csdn.demo.Repository.UserRepository;
import com.csdn.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@Autowired
private UserRepository userRepository;
@RequestMapping("SaveUser")
public String SaveUser() throws Exception {
User user=new User();
user.setId(3l);
user.setUserName("csdn");
userRepository.saveUser(user);
return "创建用户成功";
}
@RequestMapping("deleteUserById")
public String deleteUserById(){
userRepository.deleteUserById(1L);
return "删除用户成功";
}
@RequestMapping("updateUser")
public String updateUser(){
User user=new User();
user.setId(1l);
user.setUserName("csdn001");
userRepository.updateUser(user);
return "更新用户成功";
}
@RequestMapping("findUserByUserName")
public String findUserByUserName(){
User user= userRepository.findUserByUserName("csdn");
return user.toString();
}
}
测试
http://127.0.0.1:8080/SaveUser
http://127.0.0.1:8080/findUserByUserName
登录数据库查看数据
use test
db.user.find();
如果报错"too many users are authenticated",请退出,再次执行登录命令,再执行上面的命令
MongoRepository的使用
定义UserRepository
package com.csdn.demo.Repository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface UserRepository extends MongoRepository<com.csdn.demo.model.User, Long> {
com.csdn.demo.model.User findByUserName(String userName);
Page<com.csdn.demo.model.User> findAll(Pageable pageable);
}
这里要特别注意findByUserName,如果返回行数据存存在多行,程序是会报错的
测试Controller
package com.csdn.demo.web;
import com.csdn.demo.Repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@Autowired
private UserRepository userRepository;
@RequestMapping("SaveUser")
public String SaveUser() throws Exception {
com.csdn.demo.model.User user=new com.csdn.demo.model.User();
user.setId(3l);
user.setUserName("csdn");
userRepository.save(user);
return "创建用户成功";
}
@RequestMapping("deleteUserById")
public String deleteUserById(){
userRepository.deleteById(2L);
return "删除用户成功";
}
@RequestMapping("updateUser")
public String updateUser(){
com.csdn.demo.model.User user=new com.csdn.demo.model.User();
user.setId(1l);
user.setUserName("csdn99");
userRepository.save(user);
return "更新用户成功";
}
@RequestMapping("findByUserName")
public String findUserByUserName(){
com.csdn.demo.model.User user= userRepository.findByUserName("csdn");
return user.toString();
}
@RequestMapping("findAllUser")
public String findAllUser(){
Sort sort = new Sort(Sort.Direction.DESC, "id");
Pageable pageable = PageRequest.of(2, 10, sort);
Page page=userRepository.findAll(pageable);
return page.getContent().toString() ;
}
}
测试
先执行:http://127.0.0.1:8080/updateUser
再执行:http://127.0.0.1:8080/findByUserName
还有,因为我使用了之前的数据,所以model的名字不能变,否则程序无法识别。
其实这个用法,和之前从零学 spring cloud第3-1课:数据库基础之JDBC及从零学 spring cloud第3-6课:数据库基础之JPA没有区别,只是数据库换了,再者,mongodb不能多表查询。