MongoDB--Spring Data MongoDB详细的操作手册(增删改查)
关注我,可以获取最新知识、经典面试题以及微服务技术分享
在NoSQL
盛行的时代,App很大可能会涉及到MongoDB数据库的使用,而也必须学会在Spring boot
使用Spring Data
连接MongoDB
进行数据增删改查操作,如下为详细的操作手册。
1. 依赖
直接导入spring-data-mongodb
包或者使用Spring Boot starter
<dependencies> <!-- other dependency elements omitted --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>2.2.0.RELEASE</version> </dependency> </dependencies> <!--spring 框架使用最新的 --> <spring.framework.version>5.2.0.RELEASE</spring.framework.version> <!--用一即可--> <!--使用Spring Boot starter--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
2. 属性文件application.properties
#mongodb连接地址,集群用“;”隔开 spring.mongo.mongoDatabaseAddress=10.110.112.165:27092;10.110.112.166:27092 #mongo数据名 spring.mongo.dbname=mongodb #mongo用户 spring.mongo.username=mongodbopr #mongo密码 spring.mongo.password=123456 #mongo最大连接数 spring.mongo.connectionsPerHost=50
3. mongodb 配置
注册Mongo
实例配置:
@Configuration public class MongodbConfig { public static final String COMMA = ";"; public static final String COLON = ":"; @Value("${spring.mongo.mongoDatabaseAddress}") private String mongoDatabaseAddress; @Value("${spring.mongo.username}") private String username; @Value("${spring.mongo.dbname}") private String dbname; @Value("${spring.mongo.password}") private String password; @Value("${spring.mongo.connectionsPerHost}") private String connectionsPerHost; /** * 获取mongodb的地址 * * @return */ private List<ServerAddress> getMongoDbAddress() { List<ServerAddress> serverAddrList = new ArrayList<ServerAddress>(); //如果有多个服务器的话 if (this.mongoDatabaseAddress.indexOf(COMMA) > 0) { String[] addressArrays = mongoDatabaseAddress.split(COMMA); String[] hostPort; for (String address : addressArrays) { hostPort = address.split(COLON); ServerAddress serverAdress = new ServerAddress(hostPort[0], Integer.valueOf(hostPort[1])); serverAddrList.add(serverAdress); } } else { String[] hostPort = mongoDatabaseAddress.split(COLON); ServerAddress serverAdress = new ServerAddress(hostPort[0], Integer.valueOf(hostPort[1])); serverAddrList.add(serverAdress); } return serverAddrList; } /** * 设置连接参数 */ private MongoClientOptions getMongoClientOptions() { MongoClientOptions.Builder builder = MongoClientOptions.builder(); // todo 添加其他参数配置 //最大连接数 builder.connectionsPerHost(Integer.valueOf(connectionsPerHost)); MongoClientOptions options = builder.readPreference(ReadPreference.nearest()).build(); return options; } /** * * @return */ @Bean public MongoClient mongoClient() { //使用数据库名、用户名密码登录 MongoCredential credential = MongoCredential.createCredential(username, dbname, password.toCharArray()); //创建Mongo客户端 return new MongoClient(getMongoDbAddress(), credential, getMongoClientOptions()); } /** * 注册mongodb操作类 * @param mongoClient * @return */ @Bean @ConditionalOnClass(MongoClient.class) public MongoTemplate mongoTemplate(MongoClient mongoClient) { MongoTemplate mongoTemplate = new MongoTemplate(new SimpleMongoDbFactory(mongoClient, dbname)); return mongoTemplate; } }
4. mongodb操作
使用MongoTemplate
类进行增删改查
@Service public class MongodbService { @Autowired private MongoTemplate mongoTemplate; /** * 新增文档 * * @param userDTO * @return */ public UserDTO insert(UserDTO userDTO) { //insert方法并不提供级联类的保存,所以级联类需要先自己先保存 return mongoTemplate.insert(userDTO); } public UserDTO save(UserDTO userDTO) { Sort sort = new Sort(Sort.Direction.DESC, "name"); userDTO = mongoTemplate.findOne(Query.query(Criteria.where("")).with(sort), UserDTO.class); return mongoTemplate.save(userDTO); } /** * 删除文档 * NOTE:remove方法不支持级联删除所以要单独删除子数据 * @param name */ public void remove(String name) { //根据名字查询数据并删除 UserDTO userDTO = mongoTemplate.findOne(Query.query(Criteria.where("name").is(name)), UserDTO.class); //remove方法不支持级联删除所以要单独删除子数据 List<AddressDTO> addressList = userDTO.getAddressList(); for (AddressDTO addressDTO : addressList) { mongoTemplate.remove(addressDTO); } //删除主数据 mongoTemplate.remove(userDTO); } /** * 更新文档 * @param userDTO */ public void update(UserDTO userDTO) { mongoTemplate.updateFirst(Query.query(Criteria.where("name").is(userDTO.getName())), Update.update("age", userDTO.getAge()), UserDTO.class); } /** * 查询文档 * @param name */ public void find(String name) { Sort sort = new Sort(Sort.Direction.DESC, "name"); List<UserDTO> userDTOS = mongoTemplate.find(Query.query(Criteria.where("name").is(name)), UserDTO.class); //基于sort排序使用findOne查询最新一条记录 UserDTO userDTO = mongoTemplate.findOne(Query.query(Criteria.where("name").is(name)).with(sort), UserDTO.class); //模糊查询 List<UserDTO> userDTOList = mongoTemplate.find(Query.query(Criteria.where("name").is(name).regex(name)).with(sort), UserDTO.class); //分页查询 Pageable pageable = PageRequest.of(3, 20, sort); List<UserDTO> userDTOPageableList = mongoTemplate.find(Query.query(Criteria.where("name").is(name)).with(pageable), UserDTO.class); //总数 long conut = mongoTemplate.count(Query.query(Criteria.where("name").is(name)), UserDTO.class); Page<UserDTO> page = new PageImpl(userDTOPageableList, pageable, conut); } }
NOTE:
在开发中,如果从任何MongoDB
操作返回的com.mongodb.WriteResult
包含错误,则可以方便地记录或引发异常。 通常,在开发过程中很容易忘记执行此操作,然后最终得到一个看似运行成功的App,但实际上该数据库操作发生异常,没执行成功。 可以将MongoTemplate
的WriteResultChecking
属性设置为以下值之一:
EXCEPTION
:引发Exception
NONE
:不执行任何操作,默认值
对于更高级的情况,可以将每个操作设置不同的WriteConcern
值(用于删除,更新,插入和保存操作),则可以在MongoTemplate
上配置WriteConcernResolver
的策略接口。 由于MongoTemplate
用于持久化POJO
,因此WriteConcernResolver
允许您创建一个策略,该策略可以将特定的POJO
类映射到WriteConcern
值。
WriteConcernResolver
接口:
public interface WriteConcernResolver { WriteConcern resolve(MongoAction action); }
自定义WriteConcernResolver
接口,实现不同WriteConcern
策略:
private class MyAppWriteConcernResolver implements WriteConcernResolver { public WriteConcern resolve(MongoAction action) { if (action.getEntityClass().getSimpleName().contains("UserDTO")) { return WriteConcern.NONE; } else if (action.getEntityClass().getSimpleName().contains("Metadata")) { return WriteConcern.JOURNAL_SAFE; } return action.getDefaultWriteConcern(); } }
5. 常用的类以及方法解析
5.1 MongoClient、ServerAddress、MongoCredential以及MongoClientOptions
基于ServerAddress
单机或者Replica Set
在使用MongoClient
连接mongodb
数据库注册mongo
实例,在注册示例中可能要使得MongoCredential
账号密码验证以及使用MongoClientOptions
配置mongodb
其他的参数。
MongoClient
常用的构造器方法:
public MongoClient(String host){} public MongoClient(MongoClientURI uri){} public MongoClient(String host, MongoClientOptions options) {} public MongoClient(ServerAddress addr, MongoCredential credential, MongoClientOptions options){} public MongoClient(List<ServerAddress> seeds, MongoCredential credential, MongoClientOptions options){}
5.2 MongoTemplate
使用MongoTemplate
结合Sort
、Criteria
、Query
、Update
以及分页Pageable
类灵活地进行对mongodb
数据库进行增删改查。
query
方法:
//根据查询条件查询 public <T> List<T> find(Query query, Class<T> entityClass){} //根据查询条件查询返回一条记录 public <T> <T>findOne(Query query, Class<T> entityClass){} //查询该collection所有记录 public <T> List<T> findAll(Class<T> entityClass){}
insert
方法:
//新增一条记录 public <T> T insert(T objectToSave){} //在collectionName中新增一条记录 public <T> T insert(T objectToSave, String collectionName) {} // public <T> T save(T objectToSave){}
remove
方法:
//根据Object删除 public DeleteResult remove(Object object) {} //根据查询条件进行删除 public DeleteResult remove(Query query, Class<?> entityClass){}
update
方法:
// public UpdateResult upsert(Query query, Update update, Class<?> entityClass) {} //更新查询出来的第一条记录 public UpdateResult updateFirst(Query query, Update update, String collectionName) {}
5.3 Sort
Sort
查询排序类。Sort
类常用方法:
//构造方法创建一个排序。direction为排序方向的枚举类型,properties为排序字段数组 Sort(Sort.Direction direction, String... properties) //多个排序条件链接 and(Sort sort) //返回升序排列对象 ascending() //返回降序排列对象 descending()
5.4 Criteria
Criteria
查询条件类,类似于SQL的where,常用方法:
//声明定义查询条件,且为静态方法 where(String key) //与操作 and(String key) //正则表达式,即可为模糊查询 regex(String re) //包含 in(Object... o) //大于 gt(Object o) //大于等于 gte(Object o) //等于 is(Object o) //小于 lt(Object o) //小于等于 lte(Object o) //非 not() //创建与操作 andOperator(Criteria... criteria)
5.5 Query
Query
查询对象,具有查询的全部信息,其中包括筛选条件、排序、返回数量等。常用的方法:
//定义查询对象,静态方法 query(CriteriaDefinition criteriaDefinition) //在本次查询添加一个CriteriaDefinition查询条件 addCriteria(CriteriaDefinition criteriaDefinition) //添加一个Sort排序对象 with(Sort sort) //添加一个Pageable分页对象、通常情况下,分页和排序一起使用。 with(Pageable pageable)
6.常用注解
注解 | 解析 |
---|---|
@Id | 用于标记id字段,没有标记此字段的实体也会自动生成id字段,但是我们无法通过实体来获取id。id建议使用ObjectId类型来创建 |
@Document | 用于标记此实体类是mongodb集合映射类 |
@DBRef | 用于指定与其他集合的级联关系,但是需要注意的是并不会自动创建级联集合 |
@Indexed | 用于标记为某一字段创建索引 |
@CompoundIndex | 用于创建复合索引 |
@TextIndexed: | 用于标记为某一字段创建全文索引 |
@Language | 指定documen语言 |
@Transient: | 被该注解标注的,将不会被录入到数据库中。只作为普通的javaBean属性 |
@Field: | 用于指定某一个字段映射到数据库中的名称 |
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spring Security 实战干货:使用 JWT 认证访问接口
1. 前言 欢迎阅读Spring Security 实战干货系列。之前我讲解了如何编写一个自己的 Jwt 生成器以及如何在用户认证通过后返回 Json Web Token 。今天我们来看看如何在请求中使用 Jwt 访问鉴权。DEMO 获取方法在文末。 2. 常用的 Http 认证方式 我们要在 Http 请求中使用 Jwt 我们就必须了解 常见的 Http 认证方式。 2.1 HTTP Basic Authentication HTTP Basic Authentication 又叫基础认证,它简单地使用 Base64 算法对用户名、密码进行加密,并将加密后的信息放在请求头 Header 中,本质上还是明文传输用户名、密码,并不安全,所以最好在 Https 环境下使用。其认证流程如下: 客户端发起 GET 请求 服务端响应返回 401 Unauthorized, www-Authenticate 指定认证算法,realm 指定安全域。然后客户端一般会弹窗提示输入用户名称和密码,输入用户名密码后放入 Header 再次请求,服务端认证成功后以 200 状态码响应客户端。 2.2 HTTP...
- 下一篇
如何用云渲染撑起《我和我的祖国》?京东云用了近千台服务器
国庆期间,新中国成立70周年献礼片《我和我的祖国》热映,成为国民话题。影片中,开国大典、香港回归、北京奥运会等国人刻骨铭心的难忘瞬间和感人场景唤起了观众对过往光辉岁月的回忆,更唤醒了每一位国人的爱国热情。近期,更是有网络大神用51单片机的蜂鸣器功能谱了一首《我和我的祖国》,引爆程序猿们的朋友圈。在程序员的世界,除了关注电影中故事的精彩、画面的温情,更多的会看其背后的众多黑科技,尤其是电影的后期制作环节。正是云渲染将图像、视频信号等设计要素真正“赋予灵魂”。 云原生技术让云渲染成为大势所趋 在早几年前,所有CG用户还停留在使用传统渲染农场阶段,上传任务、接收渲染文件只能局限在线下,而云计算的出现给了渲染农场新的活力。近年来,在高品质影视作品制作中,云计算已经成为不可或缺的技术支撑。对于后期来说,一部影片一秒钟24帧,普通渲染一帧需要半个小时,如果只靠特效公司自身的渲染设备,电影的渲染往往需要数万小时,可能花费几年的时间。 而云渲染可以把任务分割成若干部分,由集群中的各个节点同时渲染,大大减少渲染耗时,还能根据需要来安排渲染的顺序、监控渲染的进度。物理机100台需要10个小时的渲染作业,在...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果