spring集成mongodb及基础使用

4 篇文章 0 订阅
2 篇文章 0 订阅

一、在spring框架中启用mongo db

spring集成mongodb可以通过java和xml两种方式进行集成,下面是xml方式:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mongo="http://www.springframework.org/schema/data/mongo"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
         http://www.springframework.org/schema/data/mongo
         http://www.springframework.org/schema/data/mongo/spring-mongo.xsd"
        >

        <!--启用repository扫描功能-->
        <mongo:repositories base-package="com.qcsy"/>

        <!--定义用于访问 MongoDB 的 MongoClient 实例-->
        <mongo:mongo-client id="mongoClient" host="${mongo.host}" port="${mongo.port}">
                <mongo:client-options
                        connections-per-host="${mongo.connectionsPerHost}"
                        threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
                        connect-timeout="${mongo.connectTimeout}"
                        max-wait-time="${mongo.maxWaitTime}"
                        socket-keep-alive="${mongo.socketKeepAlive}"
                        socket-timeout="${mongo.socketTimeout}"
                />
        </mongo:mongo-client>
        <!--定义用于连接到数据库的连接工厂-->
        <mongo:db-factory dbname="${mongo.dbname}" mongo-ref="mongoClient"/>

        <!--实际操作 mongodb 的 template,在代码中注入。注意如果此处id不叫mongoTemplate。可能会导致使用Repositry的时候找不到,需要特殊映射-->
        <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
                <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
        </bean>
        
</beans>

配置文件:

#mongo db的配置,如果不启用则不需要配置
mongo.host=localhost
mongo.port=27017
# 数据库名称. 默认是'db'.
mongo.dbname=test
# 每个主机允许的连接数
mongo.connectionsPerHost=10
# 线程队列数,它和上面connectionsPerHost值相乘的结果就是线程队列最大值。如果连接线程排满了队列就会抛出异常
mongo.threadsAllowedToBlockForConnectionMultiplier=5
# 连接超时的毫秒 0是默认值且无限大。
mongo.connectTimeout=1000
# 最大等待连接的线程阻塞时间 默认是120000 ms (2 minutes).
mongo.maxWaitTime=1500
# 保持活动标志,控制是否有套接字保持活动超时 官方默认为true 且不建议禁用
mongo.socketKeepAlive=true
# 用于群集心跳的连接的套接字超时。
mongo.socketTimeout=1500

二、映射模型实体

@Document
public class User {
    @Id
    private String userid;
    @Field("userinfo")
    private String username;
    private String userpassword;
    ......get\set方法........
}

@Document与@Entity类似,表明是一个实体,@Id表明是主键

其他的Spring data mongoDB注解还有:

@Document

把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。@Document(collection="mongodb 对应 collection 名")

@Id

文档的唯一标识,在mongodb中为ObjectId,它是唯一的

@Indexed

声明该字段需要索引,建索引可以大大的提高查询效率。

@CompoundIndex

复合索引的声明,建复合索引可以有效地提高多字段的查询效率。

 

@Field

给映射存储到 mongodb 的字段取别名

 

@Dbref

标识引用其他文档,这个文档有可能在另外的数据库中

 

@Version

标识改属性作为版本控制

 

@Transient

默认情况下所有的私有字段都映射到文档,该注解标识的字段从存储在数据库中的字段列中排除(即该字段不保存到 mongodb)

 

三、使用MongoTemplate访问mongodb

@Autowired
private MongoOperations mongoOperations;

 

在这里,我们将MongoTemplate注入到MongoOperations ,因为MongoTemplate是MongoOperations 实现类,使用接口注入是一个好的做法

/**
 * 保存数据
 */
@Override
public void templateSave() {
    User user=new User();
    user.setUserid("001");
    user.setUsername("测试");
    user.setUserpassword("11");
    mongoOperations.save(user,"user");
}

/**
 * 更新数据
 */
@Override
public void templateUpdate() {
    //where跟的是字段,is相当于等于
    Query query=Query.query(Criteria.where("userid").is("001"));
    mongoOperations.updateFirst(query, Update.update("username","修改"),User.class);
}
/**
 * 查询数据
 * @return
 */
@Override
public User templateQuery() {
    Query query=Query.query(Criteria.where("userid").is("001"));
    return   mongoOperations.find(query,User.class).get(0);
}

 

四、使用MongoDb Repository访问mongodb

  • 与spring data jpa类似,spring data mongodb同样有类似的操作方式,实现一个接口继承MongoRepository<T,id>:
public interface MongoDemoRepository extends MongoRepository<User,String> {

 User findFirstByUsername(String username); 
}

 

通过继承接口,spring data会自动实现基本的crud方法,同时,还支持通过方法的形式扩展自己想要的方法,例如通过以下关键词扩展(图片在网上找的):

自定义查询方法,格式为“find/get/readBy+字段名+方法后缀”,方法传进的参数即字段的值。

支持的部分常用方法后缀有:

img

img

 

 

  • 除此之外,与spring data jpa 类似,它也支持@Query的方式自定义指定。但它不是指定的sql而是一个json .
@Query("{'userpassid':'qq','username':?0}") 
List<User> findUsername(String username);

 

  • 它同样可以通过接口的方式和spring data jpa 类似实现mongotemplate与repository混合方法。此处不做介绍

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud集成MongoDB可以通过使用Spring Data MongoDB实现。Spring Data MongoDB是一个用于简化和简化与MongoDB交互的框架,它提供了一套简单的API,可以轻松地进行数据库操作。 首先,需要在pom.xml文件中添加相关的依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> ``` 然后,在Spring Boot的主类上添加`@EnableMongoRepositories`注解,以启用MongoDB的支持: ```java @EnableMongoRepositories(basePackages = "com.example.repository") @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 其中,`com.example.repository`是存放MongoDB相关的repository接口的包路径。 接下来,可以创建一个实体类来映射MongoDB中的集合: ```java @Document(collection = "users") public class User { @Id private String id; private String name; private int age; // getters and setters } ``` 在这个例子中,我们创建了一个名为"users"的集合,并在User类中定义了id、name和age字段。 然后,可以创建一个继承自`MongoRepository`的接口来定义对于User集合的操作: ```java @Repository public interface UserRepository extends MongoRepository<User, String> { List<User> findByAge(int age); } ``` 在这个例子中,我们定义了一个`findByAge`方法,用于根据年龄查询用户。 最后,可以在其他组件中通过依赖注入的方式使用UserRepository来进行数据库操作: ```java @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> findByAge(int age) { return userRepository.findByAge(age); } } ``` 通过上述步骤,就可以很方便地使用Spring Cloud集成MongoDB进行数据库操作了。当然,除了上述的基本操作外,Spring Data MongoDB还提供了更多高级的功能,如聚合查询、分页查询等,可以根据具体需求进行扩展使用

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值