SpringBoot中整合MongoDB使用

SpringBoot中整合MongoDB

Spring Data MongoDB

1.创建普通maven项目

在这里插入图片描述

2.写入name, groupId等信息

在这里插入图片描述

3.准备环境

添加依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
</parent>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
       <dependency>
        <groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>    
    

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

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

4.配置连接参数

在 resources 中创建 application.properties 文件

# application.properties
# 配置数据库连接
#格式: mongodb://账号:密码@ip:端口/数据库?认证数据库
#简写
spring.data.mongodb.uri=mongodb://localhost:27017/mongotest

# 配置MongoTemplate的执行日志

logging.level.org.springframework.data.mongodb.core=debug

5.创建实体类(例)

//domain

@AllArgsConstructor
@NoArgsConstructor
@Setter@Getter@ToString
@Document("users") //设置文档所在的集合
public class User {
    @Id //文档的id使用ObjectId类型来封装,并且贴上@Id注解
    private ObjectId _id;
    
    private Long id;
    private String name;
    private Integer age;
}

6.MongoRepository

该接口对MongoDB数据的常用操作进行了封装,我们只需要写个接口去继承该接口就能直接拥有的CRUD等基本操作,再学习下JPA的方法命名规范,可以毫不费力的完成各种复杂的高级操作

/**
 * 自定义一个接口继承MongoRepository,
 * 泛型1:domain类型
 * 泛型2:文档主键类型
 * 贴上@Repository注解,底层会创建出动态代理对象,交给Spring管理
 */

@Repository
public interface UserMongoRepository extends MongoRepository<User,objectId> {
    //使用 SpringData 命名规范做高级查询
    List<User> findByName(String name);
}

7.Spring Data方法命名规范

关键字例子JPQL
AndfindByNameAndAge(String name, Integer age)where name = ? and age = ?
OrfindByNameOrAge(String name, Integer age)where name = ? or age = ?
IsfindByName(String name)where name = ?
BetweenfindByAgeBetween(Integer min, Integer max)where age between ? and ?
LessThanfindByAgeLessThan(Integer age)where age < ?
LessThanEqualfindByAgeLessThanEqual(Integer age)where age <= ?
GreaterThanfindByAgeGreaterThan(Integer age)where age > ?
GreaterThanEqualfindByAgeGreaterThanEqual(Integer age)where age >= ?
After等同于GreaterThan
Before等同于LessThan
IsNullfindByNameIsNull()where name is null
IsNotNullfindByNameIsNotNull()where name is not null
LikefindByNameLike(String name)where name like ?
NotLikefindByNameNotLike(String name)where name not like ?
StartingWithfindByNameStartingWith(String name)where name like ‘?%’
EndingWithfindByNameEndingWith(String name)where name like ‘%?’
ContainingfindByNameContaining(String name)where name like ‘%?%’
OrderByXx[desc]findByIdOrderByXx[Desc] (Long id)where id = ? order by Xx [desc]
NotfindByNameNot(String name)where name != ?
InfindByIdIn(List<Long> ids)where id in ( … )
NotInfindByIdNotIn(List<Long> ids)where id not in ( … )
TruefindByXxTrue()where Xx = true
FalsefindByXxFalse()where Xx = false
IgnoreCasefindByNameIgnoreCase(String name)where name = ? (忽略大小写)

8.主类(例)

@SpringBootApplication
public class App {}

9.测试类(实例代码)

@Autowired
private UserMongoRepository repository;

//插入/更新一个文档
@Test
public void testSaveOrUpdate() throws Exception {
    User user = User(null, 5L, "王富贵", 20);
    // 主键为 null 则新增, 不为 null 则为更新
    repository.save(user);
}

//删除一个文档
@Test
public void testDelete() throws Exception {
    reponitory.deleteById("Siring类型的 id");
}

//查询一个文档
@Test
public void testGet() throws Exception {
    Optional<User> optional = repository.findById("Siring类型的 id").orElse(null);
}

//查询所有文档
@Test
public void testList() throws Exception {
    List<User> users = repository.fingAll();
    //三种输出list集合的方法
    //1
    list.forEach(System.out::println);
    //2
    list.forEach(user->System.out.println(user));
    //3
    for (User user : users) {
        System.out.println(user);
    }
}

MongoTemplate

该对象有SpringBoot完成了自动配置,存入Spring容器中,我们直接注入就可以使用了,依靠该对象能完成任何的MongoDB操作,一般和MongoRepository分工合作,多数用于复杂的高级查询以及底层操作

//注入MongoTemplate
@Autowired
private MongoTemplate template;

1.条件限定

Query对象用于封装查询条件,配合Criteria一起使用,来完成各种条件的描述

//一个Criteria对象可以理解为是一个限定条件
Criteria.where(String key).is(Object val); //设置一个等值条件
Criteria.orOperator(Criteria ...); //设置一组或的逻辑条件

//模糊查询(了解)
Criteria.where(String key).regex(String regex); //使用正则表达式匹配查询

注意:Criteria对象可以由其静态方法和构造器获取
Criteria封装了所有对条件的描述,常见的有以下方法
lt / lte / gt / gte / ne / ...

最后通过Query对象的addCriteria把条件封装到Query对象中\

Query对象.addCriteria(Criteria criteria); //添加查询条件
Query对象.skip(start).limit(pageSize); //分页查询

2.API方法

//根据条件查询集合中的文档
List<T> mongoTemplate.find(Query query, Class<T> type, String collectionName);

3.实例代码(以users表为例)

@Autowired
private MongoTemplate mongoTemplate

// 分页查询文档,显示第2页,每页显示3个,按照id升序排列
@Test
public void testQuery1() throws Exception {
    // 创建查询对象
    Query query = new Query();
    // 设置分页信息
    query.skip(3).limit(3);
    // 设置排序规则
    query.with(new Sort(Sort.Direction.ASC,"id"));
    
    List<User> list = mongoTemplate.find(query, User.class, "users");
    list.forEach(System.err::println);
}


// 查询所有name为王富贵的文档
@Test
public void testQuery2() throws Exception {
    // 构建限制条件 {"name": "王富贵"}
    Criteria criteria = Criteria.where("name").is("bunny");
    // 创建查询对象
    Query query = new Query();
    // 添加限制条件
    query.addCriteria(criteria);

    List<User> list = mongoTemplate.find(query, User.class, "users");
    list.forEach(System.err::println);
}


// 查询所有name为王富贵或者age<30的文档
@Test
public void testQuery3() throws Exception {
    // 构建限制条件 { "$or": [{"name": "王富贵"}, {"age": {"$lt": 30}}] }
    Criteria criteria = new Criteria().orOperator(
        Criteria.where("name").is("王富贵"),
        Criteria.where("age").lt(30)
    );
    // 创建查询对象
    Query query = new Query();
    // 添加限制条件
    query.addCriteria(criteria);

    List<User> list = mongoTemplate.find(query, User.class, "users");
    list.forEach(System.err::println);
}


// 查询所有name含有wang并且30<=age<=32的文档
@Test
public void testQuery4() throws Exception {
    // 构建限制条件 { "$and" : [{"name": {"$regex": ".*wang.*"} }, {"age": {"$gte": 30, "$lte": 32 } }] }
    Criteria criteria = new Criteria().andOperator(
        Criteria.where("name").regex(".*wang.*"),
        Criteria.where("age").gte(30).lte(32)
    );
    // 创建查询对象
    Query query = new Query();
    // 添加限制条件
    query.addCriteria(criteria);

    List<User> list = mongoTemplate.find(query, User.class, "users");
    list.forEach(System.err::println);
}

如有错误请各位大神指导, 叩谢了

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值