mongodb开发项目总结(java实现crud)

引言

最近简单看了看mongodb,在这里汇总一下我在使用mongodb开发项目的流程;

环境:

  • java8
  • springboot
  • Spring-boot-start-data-mongodb

下面我就简单写个用户相关的curd;

创建数据库、集合和文档

开发项目前肯定要先创建对应的数据库和表以及对应数据,mongodb对应的就是数据库、集合和文档;

因为mongodb是nosql,相对于关系型数据库少了很多规则,一般我使用mysql时喜欢直接用navicat创建数据库和表;而mongodb我感觉直接使用指令创建也很简单,下面是我的创建流程:

创建数据库demo:

use demo

创建集合user(隐式创建)+ 新增一条文档

db.user.insert({
    username: "xxxx",
    age: NumberInt(18),
    gender: NumberInt(0),
    profile: "我是个大帅哥",
    status: NumberInt(0),
    createTime: new Date(),
    updateTime: new Date()
})

这样就创建了一个user集合,并在该集合内新增了一条数据;

当然也可以显式创建:

db.createCollection("集合名")

都可以,我感觉第一种更好些,因为创建集合时也顺便把集合所需的字段也确定了;(因为mongodb是nosql,所以同一个集合中的数据没有过多要求,虽然确定了字段,但是如果后期新增其他字段是不会出错的,为了保证统一还是需要开发人员自行规范,靠自己约束)


操作如下:

在这里插入图片描述

可以通过navicat连接一下mongodb,查看我们的数据库:

在这里插入图片描述

创建好了数据库,接下来就要开始通过java进行mongodb的操作了;

注:这里profile写错了,写成了prifile,后面代码已经修改,这里知道就行!

初始化项目

springboot项目创建就不多说了,操作mongodb需要引入以下依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

然后在配置文件添加连接配置:

spring:
  application:
    name: user-demo
  data:
    mongodb:
      port: 27017 # 端口号
      database: user # 数据库名
      host: 你的mongodb主机地址
server:
  port: 8080
logging:
  level:
    org.springframework.data.mongodb.core: debug # 控制台显示mongodb日志

然后可以启动项目查看是否能连接成功:

image-20221021114657996

这样就表示连接mongodb连接成功了;

集合实体

使用mysql时一个表对应一个实体,这里也是一样,所以我们需要创建一个User实体类:

model层User实体:

image-20221021120500614

新东西就是几个注解,简单知道是干什么的就可以了;

下面是repository/mapper层;

Repository

使用过jpa的对于Repository应该比较熟悉,使用mybaits其实就是mapper,都是一个意思;

其实spring提供的mongo操作和jpa非常相似,几乎一摸一样;

创建一个UserRepository,继承接口MongoRepository:

import com.yang.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends MongoRepository<User, String> {

}

下面就是service和controller层了,到这就和使用mysql没有什么区别了,这里就不写了;

数据库操作

spring提供的mongo操作和jpa非常非常像,学过jpa的可以直接上手的;

下面我写几个基本的crud操作演示一下:

新增

新增一个用户:

controller:

@PostMapping("/add")
public String addUser(@RequestBody User user) {
    userService.addUser(user);
    return "新增成功";
}

service:

@Override
public void addUser(User user) {
  user.setCreateTime(new Date());
  user.setUpdateUpdate(new Date());
	userRepository.insert(user);
}

这个insert方法就是自带的,直接用就行;

执行日志和结果:

在这里插入图片描述

日志:

image-20221021124320627

一般新增操作也就这个最常用了;

删除

删除操作一般会有通过id删除、通过名称等条件删除;这里演示两个接口:通过id删除和通过用户名删除

通过id删除

和新增一样,直接调用默认提供的deleteById方法即可

Controller

@PostMapping("/delete/{id}")
public String deleteUserById(@PathVariable String id) {
    userService.deleteUserById(id);
    return "删除成功";
}

Service

@Override
public void deleteUserById(String id) {
    userRepository.deleteById(id); // 直接调用默认提供的方法
}

执行结果和日志:
在这里插入图片描述

image-20221021130705076

通过username删除

因为通过username删除这属于我们个人定制的需求,所以默认是不会提供对应方法等;熟悉jpa的朋友,应该知道可以在Repository中通过遵循规则的方法名进行定制的查询操作,这里也是类似,比如这里想通过username删除,那么方法名就是deleteUserByUsername():

这就是一些自定义规则:

在这里插入图片描述

继续写:

在这里插入图片描述

可以看到有很多条件,这些条件都和我们前面定义的User实体有关系;

在这里插入图片描述

我们设置为username,就会发现除了username,下面还可以继续通过after、and、between等继续设置条件,非常方便神奇;

只要我们把这个方法名写对了,那么该方法就是我们要的功能,所以一定要按照规则来;

我们这个方法名就是deleteUserByUsername():

Repository

import com.yang.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends MongoRepository<User, String> {

    void deleteUserByUsername(String username);

}

然后和前面一样,在service调用,controller再调用service就行了;就不演示了;

其实会了通过方法名自定义规则,很多操作都可以完成了,下面再有类似的就不细说了;

测试接口:

在这里插入图片描述

image-20221021164702836

修改

修改这里再说一个新东西,我们除了可以通过对应Repository操作数据库,也可以通过一个已经注入的对象进行操作:MongoTemplate

因为在Repository中并未提供相应更新操作,可以重新保存数据实现更新,但是实际上并不是更新操作,所以我们可以通过注入该对象进行操作;
在这里插入图片描述

更新操作:

import com.yang.model.User;
import com.yang.service.UserService;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;

@Service("userService")
public class UserServiceImpl implements UserService {

    @Resource
    private MongoTemplate mongoTemplate;
  
  	@Override
		public void updateUserAgeByName(String username, Integer age) {
        // 设置更新对象
        // 通过Criteria.where("字段名").is(字段值).and().where().is()...设置更新对象
        Query query = Query.query(Criteria.where("username").is(username));
        // 设置更新字段
        Update update = new Update();
        // 局部更新,相当于$set,可以查看set源码调用:
        // this.addMultiFieldOperation("$set", key, value);
        update.set("age", age); // 更新年龄
        mongoTemplate.updateFirst(query, update, User.class);
    }
}

这里主要了解的是:Query和Update两个对象,分别是设置更新对象和设置更新字段,其余就可以自己个人定制了;

controller调用就不写了,直接看结果和日志:

在这里插入图片描述

image-20221021175005351

所以更新操作还是使用mongoTemplate比较方便,并且mongodb的一些函数它也有对应实现,可以方便调用;

查询

查询其实很多复杂查询可以通过遵循方法名定制化查询:

在这里插入图片描述

这就不过多演示了,已经在删除详细说过了;

这里演示一下常用的分页查询:

分页无非需要两个基本参数:page页码和pageSize当页显示条数;

Repository默认提供的findAll方法可以轻松实现分页:

service

@Override
public Page<User> findUserByPage(Integer page, Integer pageSize) {
  	// 查询时实际page是从0开始的,需要-1
    Page<User> userPage = userRepository.findAll(PageRequest.of(page - 1, pageSize)); 
    return userPage;

使用PageRequest对page和pageSize封装,返回的Page对象中有常用的pageList和total总条数,可以自己点进去看看;

controller

@GetMapping("/list/{page}/{pageSize}")
public List<User> findUserByPage(@PathVariable Integer page, @PathVariable Integer pageSize) {
    Page<User> userPage = userService.findUserByPage(page, pageSize);
    return userPage.getContent(); // getContent()是获取List集合,getTotalElements()是获取总条数
}

结果和日志:
在这里插入图片描述
第二页显示三条数据;

image-20221021213237511

可以看到实际执行的就是一个find一个count;

分页查询如果想加条件就在Repository中加一个条件对应方法即可,参数为条件和Pageable对象即可:

比如由年龄分页查询(Repository中写方法):

Page<User> getUserByAge(Integer age, Pageable pageable);

然后就是在service中调用即可,都一样;


其余复杂点的查询也是在Repository自定义即可,这里不过多演示;

总结

通过spring操作monogdb大致就是这些了,并不难,可以试着模仿写几个crud接口调用一下就明白了,

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YXXYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值