IDEA版: MongDB整合Spring data

烈酒焚心 提交于 2020-08-05 16:13:28

经过上一篇使用, 配置IDEA的Mongdb写的代码是比较多的, 是最原始编码, 这篇提供更为方便快捷的代码整合方式,

小伙伴们,开始喽~~

 

一.搭建环境

  • 步骤一:更换Pom.xml中依赖坐标

<dependencies>
    <!--mongodb
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.4.3</version>
    </dependency>-->
    <!--测试-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

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

 

 

  • 步骤二:编写yml文件

spring:
  data:
    mongodb:
      uri:  mongodb://root:root@localhost:27017/demo

 

 

二. 定义JavaBean

常见注解

描述

实例

@Document

标注在实体类上,类似于MyBatis @Table

@Document(collection = "teacher")

@Id

主键,不可重复,自带索引,可以在定义的列名上标注,需要自己生成并维护不重复的约束。

如果自己不设置@Id主键,mongo会自动生成一个唯一主键,并且插入时效率远高于自己设置主键。

 

@Field

代表一个字段,可以不加,不加的话默认以参数名为列名

 

@Transient

被该注解标注的,将不会被录入到数据库中。

 

@Indexed

声明该字段需要加索引,加索引后以该字段为条件检索将大大提高速度。

唯一索引的话是@Indexed(unique = true)。

 

 

@Data
@Document(collection = "teacher")
public class Teacher {
    @Id
    private String id;
    @Field("username")
    private String username;
    private String password;
    private Integer age;
}

 

 

三. 编写Repository

Spring Data Mongodb提供一套快捷操作mongodb的方法。创建Dao,继承MongoRepository,并指定实体类型和主键类型。

 

public interface TeacherRepository extends MongoRepository<Teacher,String> { }

 

 

四. 启动类

@ComponentScan 可以手动加载指定位置处的类

@SpringBootApplication
@ComponentScan(basePackages = "com.czxy.xuecheng.dao")
public class MgTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(MgTestApplication.class,args);
    }
}

 

 

五.测试类

 

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MgTestApplication.class)
public class TestRepository {
    @Resource
    private TeacherRepository teacherRepository;  
}

 

 

六.整合代码实现

1.功能:查询所有

/**
 * 查询所有
 */
@Test
public void testfindall() {
    //查询所有
    List<Teacher> list = teacherRepository.findAll();
    for (Teacher teacher : list) {
        System.out.println(teacher);
    }
}

 

 

2.排序查询

/**
 * 排序查询
 */
@Test
public void testorder() {
    //排序
    //List<Teacher> list = teacherRepository.findAll(Sort.by("password"));
    List<Teacher> list = teacherRepository.findAll(Sort.by(Sort.Order.desc("password")));

    for (Teacher teacher : list) {
        System.out.println(teacher);
    }
}

 

 

3.分页查询

/**
 * 分页查询
 */
@Test
public void test2() {
    //分页
    int page = 1;  //从0开始
    int size = 2;
    Page<Teacher> teacherPage = teacherRepository.findAll(PageRequest.of(page, size));

    //处理分页数据
    //1.获得分页内容
    List<Teacher> list = teacherPage.getContent();
    //2.获得总记录数
    long total = teacherPage.getTotalElements();
    System.out.println("总条数:" + total);
    for (Teacher teacher : list) {
        System.out.println(teacher);
    }
}

 

 

4.分页查询JDK8 forEach

/**
 * 分页jdk8 forEach
 */
@Test
public void test2_1() {
    //分页
    int page = 1;  //从0开始
    int size = 2;
    Page<Teacher> teacherPage = teacherRepository.findAll(PageRequest.of(page, size));

    //遍历数据
    //jdk8提供forEach(使用箭头函数进行遍历)
    teacherPage.forEach(teacher -> System.out.println(teacher));
    //打印简化版
    teacherPage.forEach(System.out::println);
}

 

 

5.添加

/**
 * 添加
 */
@Test
public void testinsert() {
    Teacher teacher = new Teacher();
    teacher.setUsername("a");
    teacher.setAge(20);
    //插入数据
    teacherRepository.insert(teacher);
}

 

知识小锦囊:

  • 关于Optional:
    • Optional是jdk1.8引入的类型,Optional是一个容器对象,它包括了我们需要的对象
    • 使用isPresent方法判断所包含对象是否为空,isPresent方法返回false则表示Optional包含对象为空,否则可以使用get()取出对象进行操作。
  • Optional的优点是:
    • 1、提醒你非空判断。
    • 2、将对象非空检测标准化。

 

6.根据id查询数据

/**
 * 根据id查询
 */
@Test
public void test4() {
    Optional<Teacher> optional = teacherRepository.findById("5ee87e059f226749580a039f");
    //Optional 用于统一规范空指针异常处理
    if (optional.isPresent()) {  //teacher! =null
        Teacher teacher = optional.get();
        System.out.println(teacher);
    } else {
        System.out.println("没有数据");
    }

}

 

 

7.更新数据

/**
 * 更新采用save方法,
 * - 如果数据存在,将发生更新操作
 * - 如果数据不存在,将发生添加操作
 */
@Test
public void testUpdate() {
    //更新操作
    //1.查询
    Optional<Teacher> optional = teacherRepository.findById("5ee87e059f226749580a039f");
    if (optional.isPresent()) {
        //2.修改数据
        Teacher teacher = optional.get();
        teacher.setUsername("哈哈");
        //3.更新
        teacherRepository.save(teacher);
    }

}

 

 

 

8.删除数据

/**
 * 删除
 */
@Test
public void testdelete() {
    teacherRepository.deleteById("5ee87e059f226749580a039f");
}

 

 

 

9.自定义查询

需要注意: 有关于调用Repository的方法命名是有一定规则的,不可随意命名,否则报错

spring Data mongodb提供自定义方法的规则,如下:

按照findByXXX,findByXXXAndYYY、countByXXXAndYYY等规则定义方法,实现查询操作。

主要包括三种拼接:

前缀: findBy , countBy

查询条件以及关键字(Or, Like,And): 例子: UsernameLikeAndAge , UsernameLike

 

可参考,我其中一篇博客有详细说明:

https://my.oschina.net/ithuang/blog/4313727

测试类:

/**
 * 自定义查询
 */
@Test
public void testzidingyi() {
    Teacher teacher = teacherRepository.findByUsername("aaa");
    System.out.println(teacher);

    //根据名称模糊查询
    List<Teacher> list = teacherRepository.findByUsernameLike("aaa");
    System.out.println(list);


    //根据名称和年龄查询
    List<Teacher> list3 = teacherRepository.findByUsernameLikeAndAge("aaa", 18);
    System.out.println(list3);

    //根据名称和年龄,分页查询
    PageRequest pageRequest = PageRequest.of(0, 1);
    Page<Teacher> page = teacherRepository.findByUsernameLikeAndAge("a", 18, pageRequest);
    List<Teacher> list4 = page.get().collect(Collectors.toList());
    System.out.println(list4);


}

 

TeacherRepository:

public interface TeacherRepository extends MongoRepository<Teacher,String> {

    /**
     * 根据名字查询
     * @param username
     * @return
     */
    Teacher findByUsername(String username);
    //根据名称模糊查询
    List<Teacher> findByUsernameLike(String username);
    //根据名称和年龄查询
    List<Teacher> findByUsernameLikeAndAge(String username, int age);
    //根据名称和年龄,分页查询
    Page<Teacher> findByUsernameLikeAndAge(String username, int age, PageRequest pageRequest);



}

 

 

 

 

看完恭喜你,又知道了一点点!!!

你知道的越多,不知道的越多! 

~感谢志同道合的你阅读,  你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!