SpringBoot整合MongoDB(一)

SpringBoot整合MongoDB

此文章建立在Mongodb数据库已安装完成情况下。若服务器(linux系统/redhat)没有安装MongoDB,可查看我的另一篇文章 Centos7 使用Yum源安装MongoDB4.2版本数据库(补:密码配置)

本文章仅仅为单数据源配置,多数据源配置我在下一文中会编写。

本文章使用MongoTemplate而非springdatamongodb(个人感觉使用起来更舒适)

一.准备

创建SpringBoot工程,添加吐下依赖 可在创建工程时nosql那栏选择。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
二.文件配置
(1)YML文件配置

个人习惯使用yml格式对Springboot工程进行配置

mongodb连接配置如下:

无密码连接

spring:
  data:
    mongodb:
      uri: mongodb://服务器IP:端口/数据库名

有密码连接

spring:
  data:
    mongodb:
      uri: mongodb://用户名:密码@服务器IP:端口/数据库名
      # 上方为明确指定某个数据的用户进行连接
      # 也可以使用admin 数据库中的用户进行连接  统一到admin 数据库进行认证
      # admin 用户认证 url 写法: mongodb://账户:密码%40@ip:端口/数据库名?authSource=admin&authMechanism=SCRAM-SHA-1

mongodb数据库与mysql不一样 mysql 一个普通用户可以管理多个数据库,但是mongo每一个库都有一个独立的管理用户,连接时需要输入对应用户密码

(2)MongoDB监听配置

此类若不加,那么插入的一行会默认添加一个_class字段来存储实体类类型 如(com.example.demo.entity.Student)

/**
 * @author lei
 * @version 1.0
 * @date 2020/02/16 11:22
 * @desc: 监听芒果 保存数据
 */
@Configuration
public class ApplicationReadyListener implements ApplicationListener<ContextRefreshedEvent> {

  @Autowired
  MongoTemplate oneMongoTemplate;
  
  private static final String TYPEKEY = "_class";

  @Override
  public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
    MongoConverter converter = oneMongoTemplate.getConverter();
    if (converter.getTypeMapper().isTypeKey(TYPEKEY)) {
      ((MappingMongoConverter) converter).setTypeMapper(new DefaultMongoTypeMapper(null));
    }
  }
}
三.pojo实体类,service,controller编写

student 编写以及主键ID注意事项

/**
 * @author : leilei
 * @date : 10:23 2020/2/16
 * @desc :student 实体类
 */
@Data
@Document(collection = "student")  //指定要对应的文档名(表名)
public class Student {

    /*** 自定义mongo主键 加此注解可自定义主键类型以及自定义自增规则
     *  若不加 插入数据数会默认生成 ObjectId 类型的_id 字段
     *  org.springframework.data.annotation.Id 包下
     *  mongo库主键字段还是为_id 。不必细究(本文实体类中为id)
     */
    @Id
    private Long id;
    private String username;
    private LocalDateTime timer;
}

service服务层编写以及注意事项

接口实现类须注入MongoTemplate ,使用MongoTemplate 对Mongo库进行操作

/**
 * @author : leilei
 * @date : 10:29 2020/2/16
 * @desc :
 */
@Service
public class StudentServiceImpl implements IStudentService {

    @Autowired
    private MongoTemplate mongoTemplate;
}
四.MongoTemplate 操作mongo库
(1)新增

接口

int insertStudent(Student student);

实现类

@Override
    public int insertStudent(Student student) {
        student.setTimer(LocalDateTime.now());
        mongoTemplate.insert(student);
        try {
            return 1;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }
(2)修改

此文根据Id修改 ,如需其他条件 修改Query 查询条件即可

接口

int updateStudent(Student student);

实现类

需注意 Query 以及update 在org.springframework.data.mongodb.core.query 包下

    @Override
    public int updateStudent(Student student) {
    	//通过query根据id查询出对应对象,通过update对象进行修改
        Query query = new Query(Criteria.where("_id").is(student.getId()));
        Update update = new Update().set("username", student.getUsername());
        try {
            mongoTemplate.updateFirst(query, update, Student.class);
            return 1;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }
(3)删除

此文根据id删除,如需其他删除条件,修改对应Query对象即可

接口

int removeStudent(Long id);

实现类

    @Override
    public int removeStudent(Long id) {
        Query query=new Query(Criteria.where("_id").is(id));
        try {
            mongoTemplate.remove(query,Student.class);
            return 1;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }

(4)查询一个

我这里查询条件统一为实体类,取字段即可

查询一个精确匹配

根据id/其他(更换query查询条件) -------

接口

Student findOne(Student student);

实现类

    @Override
    public Student findOne(Student student) {
        Query query = new Query(Criteria.where("_id").is(student.getId()));
        Student one = mongoTemplate.findOne(query, Student.class);
        return one;
    }
(5)查询集合-模糊匹配

查询集合-模糊匹配

根据id/其他(更换query查询条件) -------

我这里查询条件统一为实体类,取字段即可

接口

 List<Student> findlike(Student student);

实现类

注意:Pattern 包路径为 java.util.regex.Pattern;

    @Override
    public List<Student> findlike(Student student) {
        Pattern pattern = Pattern.compile("^.*" + student.getUsername().trim() + ".*$", Pattern.CASE_INSENSITIVE);
        Query query = new Query(Criteria.where("username").regex(pattern));
        List<Student> studentList = mongoTemplate.find(query, Student.class);
        return studentList;
    }
(6)查询集合-精确匹配

查询集合-精确匹配

根据id/其他(更换query查询条件) -------

我这里查询条件统一为实体类,取字段即可

接口

List<Student> findmore(Student student);

实现类

    @Override
    public List<Student> findmore(Student student) {
        Query query = new Query(Criteria.where("username").is(student.getUsername()));
        List<Student> students = mongoTemplate.find(query, Student.class);
        return students;
    }
(7)倒叙排列查询

根据时间倒叙排列查询所有**

接口

 List<Student> findtime(Student student);

实现类

需注意 :Sort的包路径为 import org.springframework.data.domain.Sort;

SpringBoot2.2.X版本与Mongo整合写法有变动 本文SpringBoot版本为2.1.4

    @Override
    public List<Student> findtime(Student student) {
        Query query = new Query();
        query.with(new Sort(Sort.Direction.DESC, "timer"));
        List<Student> students = mongoTemplate.find(query, Student.class);
        return students;
    }
(8)MongoDB分页查询

接口

 List<Student> findtimeByPage(Student student);

实现类

需要注意:skip 和java8 Stream 中用法一致,即跳过多少个 limit 为分页的每页最大条数 3 则每页分3条 5则每页分五条

 @Override
    public List<Student> findtimeByPage(Student student) {
        Query query = new Query();
        query.with(new Sort(Sort.Direction.DESC, "timer"));
        query.skip(0).limit(3);
        List<Student> students = mongoTemplate.find(query, Student.class);
        return students;
    }

项目中可以在进入Controller 中调用一个方法 ,将分页数据存入到query中,后续查询将query作为参数代入查询接口中的方法

我自己的demo

 /** 查询玩家账户信息列表 */
  @RequiresPermissions("game:user:list")
  @PostMapping("/list")
  @ResponseBody
  public TableDataInfo list(User user) {
    Query query = MOngodbstartPage();
    ViewResponse viewResponse = userService.selectUserList(user, query);
    return MongogetDataTable(viewResponse.getLists(), viewResponse.getSize());
  }


 /** 设置请求分页数据 得到query */ 
  protected Query MOngodbstartPage() {
    PageDomain pageDomain = TableSupport.buildPageRequest();
    Integer pageNum = pageDomain.getPageNum();
    Integer pageSize = pageDomain.getPageSize();
    Query query = new Query().skip((pageNum - 1) * pageSize).limit(pageSize);
    return query;
  }
  //后续查询将query代入接口中,如需其他查询条件  就query.方法  这要既有条件,又有分页了
  userService.selectUserList(user, query);
  

项目连接:mongodb
MongoDB的基础使用差不多就是这些了,后续的mongo多数据源以及 Aggregation管道高级查询,将继续更新。。。。。。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章