经过上一篇使用, 配置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
| 常见注解 |
描述 |
实例 |
| 标注在实体类上,类似于MyBatis @Table |
@Document(collection = "teacher") |
|
| 主键,不可重复,自带索引,可以在定义的列名上标注,需要自己生成并维护不重复的约束。 如果自己不设置@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
可参考,我其中一篇博客有详细说明:
测试类:
/** * 自定义查询 */ @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);
}
看完恭喜你,又知道了一点点!!!
你知道的越多,不知道的越多!
~感谢志同道合的你阅读, 你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!
来源:oschina
链接:https://my.oschina.net/ithuang/blog/4317086