spring-boot-learning-MongoDB

NoSQL可以极大提高互联网系统的性能,但是它有一些致命的缺陷,其中最为严重的就是计算功能卡分有限,例如,在一个10 万数据量的List 中,我只需要满足特定条件的元素在Red is 中,使用集合或者列表,你只有先把元素取出,然后才能通过条件筛选一个个得到你想要的数据,这显然存在比较大的问题

 

Reids中,对于那些需要缓存而且经常需要统计、分析和查询的数据, 显然就不是那么便捷。

这就需要MongoDB来实现了,需要统计、按条件查询和分析的数据,它提供了支持,它可以说是一个最接近于关系数据库的NoSQL 。

 

MongoDB的特点:将数据存储为一个文档,数据结构由键值( key-value )对组成。

这里的Mongo DB 文档类似于JSON 数据集,所以很容易转化成为Java POJO 对象或者JavaScript 对
象,这些字段值还可以包含其他文档、数组及文档数组

 spring-boot-learning-MongoDB

 

 

 

需要加入mongoDB-starter依赖

<!--加入mongodb依赖-->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
            <version>2.3.2.RELEASE</version>
        </dependency>

如果用到json的操作,还可以引入阿里巴巴的fastjson的开发包 

 

springboot为我们自动创建的mongoDB的Bean:

spring-boot-learning-MongoDB

 

 

 spring-boot-learning-MongoDB

 

 

 

 

向配置文件加入mongodb配置

 

 

编写一个和mongodb文档对应要存储的实体类:

@Document
public class User implements Serializable {

   private String id;
   private String name;
   private Integer age;
   private Integer grade;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getGrade() {
        return grade;
    }

    public void setGrade(Integer grade) {
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=‘" + id + ‘\‘‘ +
                ", name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ", grade=" + grade +
                ‘}‘;
    }
}

可能使用的注解包括以下内容

@Id - 文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器
  (确保同一秒内产生的Id不会冲突)构成。 @Document
- 把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。
      @Document(collection=“mongodb”) mongodb对应表 @DBRef - 声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能,当你在本实例中修改了DERef对象
    里面的值时,单独保存本实例并不能保存DERef引用的对象,
    它要另外保存,如下面例子的Person和Account。 @Indexed
- 声明该字段需要索引,建索引可以大大的提高查询效率。 @CompoundIndex - 复合索引的声明,建复合索引可以有效地提高多字段的查询效率。 @GeoSpatialIndexed - 声明该字段为地理信息的索引。 @Transient - 映射忽略的字段,该字段不会保存到mongodb。 @PersistenceConstructor - 声明构造函数,作用是把从数据库取出的数据实例化为对象。

 注意:因为数据库的规范采用下划线分隔,二java一般采用驼峰式命名,所以可以使用@Field进行设置

指定该属性在mongodb里面使用的保存名字 

 

插入一条记录:

cotroller:

  @Autowired
    UserService service;


    //http://localhost:8988/insert?id=110&name=quan&age=222&grade=223
    @RequestMapping("/insert")
    public User insertUser(User user){
//        User user = new User();
//        user.setAge(23);
//
//        user.setGrade(98);
//        user.setName("quqquq");
        service.insertUser(user);
        return user;
    }

 

UserService接口:

public interface UserService {
    public void insertUser(User user);

UserServiceImpl接口:

注意:这里需要标注@Service和定义扫描的包,spring才会将它自动装配进来

MongoTemplate不需要自己创建,只需要在配置文件中配置和mongo‘db相关内容就行

@Service
public class UserServiceImpl implements UserService{
    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public void insertUser(User user) {
        mongoTemplate.insert(user);
    }

spring-boot-learning-MongoDB

 

 

注意:mongoTemplate.save(user) 也是可以进行mongodb的存储的。

save和insert的区别:

若增加的数据的主键已经存在,insert会抛出一个主键重复的异常。不会保存数据

而save会直接对已经存在的数据进行修改。

 

 

删除:

    public DeleteResult deleteUser(String id);
    /**
     * 1使用主键构建出一个准则,
     * 2使用MongoTemplate的remove方法进行删除操作
     * 3返回一个DeleteResult对象,记录此次操作记录。
     *      属性deletedCount代表删除文档的条数
     * @param id
     * @return
     */

 

    @Override
    public DeleteResult deleteUser(String id) {
        Criteria criteria = Criteria.where("id").is(id);
        Query query = Query.query(criteria);
        DeleteResult result =mongoTemplate.remove(query,User.class);
        return result;
    }

注意:使用remove方法的时候,需要指定文档对应的实体类的class

    @RequestMapping("/delUser/{id}")
    public DeleteResult delUser(@PathVariable("id") String id){
        return service.deleteUser(id);
    }

 

spring-boot-learning-MongoDB

 

 

 

更新:

    /**
     * 1通过构建Query对象确认更新什么内容,这里使用主键确认对应的文档
     * 2定义一个更新对象,定义的时候同时设置了对username的更新
     * 3通过更新对象的set方法设置相关内容的更新
     * 4使用MongoTemplate执行更新。
     *      注意:有两个更新方法,updateFirst(只执行第一个确定对象) updateMulti(执行所有确定对象)
     * 5更新方法的返回值:
     *      "matchedCount": Query对象匹配的文档数
     *     "modifiedCount": 被更新的文档数
     *     "upsertedId": 如果存在更新而插入文档的情况返回插入文档的信息
     * @param user
     * @return
     */

 

这里只给出实现类的方法:

    @Override
    public UpdateResult upUser(User user) {
        Criteria criteria = Criteria.where("id").is(user.getId());
        Query query = Query.query(criteria);
        //定义更新对象,随便更新name;
        Update update = Update.update("name",user.getName());
        update.set("age",user.getAge());
        update.set("grade",user.getGrade());

        UpdateResult updateResult = mongoTemplate.updateFirst(query,update,User.class);
        return updateResult;
    }

 

一开始:

spring-boot-learning-MongoDB

 

 请求之后:

spring-boot-learning-MongoDB

 

 结果:

spring-boot-learning-MongoDB

 

spring-boot-learning-MongoDB

上一篇:linux(腾讯云服务器)上安装mysql数据库


下一篇:sql server 窗口函数学习