MongoDB–Spring Data MongoDB详细操作(增删改查)
<p>github:https://github.com/Ccww-lx/Sp...</p><p> 在<code>NoSQL</code>盛行的时代,App很大可能会涉及到MongoDB数据库的使用,而也必须学会在<code>Spring boot</code>使用<code>Spring Data</code>连接<code>MongoDB</code>进行数据增删改查操作,如下为详细的操作手册。</p>
<h1 id="item-1">依赖</h1>
<p>直接导入<code>spring-data-mongodb</code>包或者使用<code>Spring Boot starter</code></p>
<div class="cnblogs_code">
<pre><dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version><span style="color: rgba(128, 0, 128, 1)">2.2</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>.RELEASE</version>
</dependency>
</dependencies>
<!--spring 框架使用最新的 -->
<spring.framework.version><span style="color: rgba(128, 0, 128, 1)">5.2</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>.RELEASE</spring.framework.version>
<!--用一即可-->
<!--使用Spring Boot starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency></pre>
</div>
<p> </p>
<h1 id="item-2">属性文件application.properties</h1>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">#mongodb连接地址,集群用“;”隔开
spring.mongo.mongoDatabaseAddress</span>=<span style="color: rgba(128, 0, 128, 1)">10.110</span>.<span style="color: rgba(128, 0, 128, 1)">112.165</span>:<span style="color: rgba(128, 0, 128, 1)">27092</span>;<span style="color: rgba(128, 0, 128, 1)">10.110</span>.<span style="color: rgba(128, 0, 128, 1)">112.166</span>:<span style="color: rgba(128, 0, 128, 1)">27092</span><span style="color: rgba(0, 0, 0, 1)">
#mongo数据名
spring.mongo.dbname</span>=<span style="color: rgba(0, 0, 0, 1)">mongodb
#mongo用户
spring.mongo.username</span>=<span style="color: rgba(0, 0, 0, 1)">mongodbopr
#mongo密码
spring.mongo.password</span>=<span style="color: rgba(128, 0, 128, 1)">123456</span><span style="color: rgba(0, 0, 0, 1)">
#mongo最大连接数
spring.mongo.connectionsPerHost</span>=<span style="color: rgba(128, 0, 128, 1)">50</span></pre>
</div>
<h1 id="item-3">mongoDB 配置</h1>
<p>注册<code>Mongo</code>实例配置:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@Configuration
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MongodbConfig {
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> final String COMMA = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">;</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> final String COLON = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
@Value(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${spring.mongo.mongoDatabaseAddress}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String mongoDatabaseAddress;
@Value(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${spring.mongo.username}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String username;
@Value(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${spring.mongo.dbname}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String dbname;
@Value(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${spring.mongo.password}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String password;
@Value(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${spring.mongo.connectionsPerHost}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String connectionsPerHost;
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 获取mongodb的地址
*
* @return
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> List<ServerAddress><span style="color: rgba(0, 0, 0, 1)"> getMongoDbAddress() {
List</span><ServerAddress> serverAddrList = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList<ServerAddress><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果有多个服务器的话</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.mongoDatabaseAddress.indexOf(COMMA) > <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">) {
String[] addressArrays </span>=<span style="color: rgba(0, 0, 0, 1)"> mongoDatabaseAddress.split(COMMA);
String[] hostPort;
</span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (String address : addressArrays) {
hostPort </span>=<span style="color: rgba(0, 0, 0, 1)"> address.split(COLON);
ServerAddress serverAdress </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> ServerAddress(hostPort[<span style="color: rgba(128, 0, 128, 1)">0</span>], Integer.valueOf(hostPort[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">]));
serverAddrList.add(serverAdress);
}
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
String[] hostPort </span>=<span style="color: rgba(0, 0, 0, 1)"> mongoDatabaseAddress.split(COLON);
ServerAddress serverAdress </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> ServerAddress(hostPort[<span style="color: rgba(128, 0, 128, 1)">0</span>], Integer.valueOf(hostPort[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">]));
serverAddrList.add(serverAdress);
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> serverAddrList;
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 设置连接参数
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> MongoClientOptions getMongoClientOptions() {
MongoClientOptions.Builder builder </span>=<span style="color: rgba(0, 0, 0, 1)"> MongoClientOptions.builder();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> todo 添加其他参数配置
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">最大连接数</span>
<span style="color: rgba(0, 0, 0, 1)"> builder.connectionsPerHost(Integer.valueOf(connectionsPerHost));
MongoClientOptions options </span>=<span style="color: rgba(0, 0, 0, 1)"> builder.readPreference(ReadPreference.nearest()).build();
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> options;
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
*
* @return
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@Bean
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MongoClient mongoClient() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">使用数据库名、用户名密码登录</span>
MongoCredential credential =<span style="color: rgba(0, 0, 0, 1)"> MongoCredential.createCredential(username, dbname, password.toCharArray());
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建Mongo客户端</span>
<span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MongoClient(getMongoDbAddress(), credential, getMongoClientOptions());
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 注册mongodb操作类
* @param mongoClient
* @return
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@Bean
@ConditionalOnClass(MongoClient.</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MongoTemplate mongoTemplate(MongoClient mongoClient) {
MongoTemplate mongoTemplate </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> MongoTemplate(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> SimpleMongoDbFactory(mongoClient, dbname));
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mongoTemplate;
}
}</span></pre>
</div>
<h1 id="item-4">mongoDB操作</h1>
<p>使用<code>MongoTemplate</code>类进行增删改查</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@Service
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MongodbService {
@Autowired
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> MongoTemplate mongoTemplate;
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 新增文档
*
* @param userDTO
* @return
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> UserDTO insert(UserDTO userDTO) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">insert方法并不提供级联类的保存,所以级联类需要先自己先保存</span>
<span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.insert(userDTO);
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> UserDTO save(UserDTO userDTO) {
Sort sort </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Sort(Sort.Direction.DESC, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
userDTO </span>= mongoTemplate.findOne(Query.query(Criteria.<span style="color: rgba(0, 0, 255, 1)">where</span>(<span style="color: rgba(128, 0, 0, 1)">""</span>)).with(sort), UserDTO.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.save(userDTO);
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 删除文档
* NOTE:remove方法不支持级联删除所以要单独删除子数据
* @param name
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> remove(String name) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据名字查询数据并删除</span>
UserDTO userDTO = mongoTemplate.findOne(Query.query(Criteria.<span style="color: rgba(0, 0, 255, 1)">where</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>).<span style="color: rgba(0, 0, 255, 1)">is</span>(name)), UserDTO.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">remove方法不支持级联删除所以要单独删除子数据</span>
List<AddressDTO> addressList =<span style="color: rgba(0, 0, 0, 1)"> userDTO.getAddressList();
</span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (AddressDTO addressDTO : addressList) {
mongoTemplate.remove(addressDTO);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">删除主数据</span>
<span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.remove(userDTO);
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 更新文档
* @param userDTO
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> update(UserDTO userDTO) {
mongoTemplate.updateFirst(Query.query(Criteria.</span><span style="color: rgba(0, 0, 255, 1)">where</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>).<span style="color: rgba(0, 0, 255, 1)">is</span>(userDTO.getName())), Update.update(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">age</span><span style="color: rgba(128, 0, 0, 1)">"</span>, userDTO.getAge()), UserDTO.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 查询文档
* @param name
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> find(String name) {
Sort sort </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Sort(Sort.Direction.DESC, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
List</span><UserDTO> userDTOS = mongoTemplate.find(Query.query(Criteria.<span style="color: rgba(0, 0, 255, 1)">where</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>).<span style="color: rgba(0, 0, 255, 1)">is</span>(name)), UserDTO.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">基于sort排序使用findOne查询最新一条记录</span>
UserDTO userDTO = mongoTemplate.findOne(Query.query(Criteria.<span style="color: rgba(0, 0, 255, 1)">where</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>).<span style="color: rgba(0, 0, 255, 1)">is</span>(name)).with(sort), UserDTO.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">模糊查询</span>
List<UserDTO> userDTOList = mongoTemplate.find(Query.query(Criteria.<span style="color: rgba(0, 0, 255, 1)">where</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>).<span style="color: rgba(0, 0, 255, 1)">is</span>(name).regex(name)).with(sort), UserDTO.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">分页查询</span>
Pageable pageable = PageRequest.of(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">20</span><span style="color: rgba(0, 0, 0, 1)">, sort);
List</span><UserDTO> userDTOPageableList = mongoTemplate.find(Query.query(Criteria.<span style="color: rgba(0, 0, 255, 1)">where</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>).<span style="color: rgba(0, 0, 255, 1)">is</span>(name)).with(pageable), UserDTO.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">总数</span>
<span style="color: rgba(0, 0, 255, 1)">long</span> conut = mongoTemplate.count(Query.query(Criteria.<span style="color: rgba(0, 0, 255, 1)">where</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>).<span style="color: rgba(0, 0, 255, 1)">is</span>(name)), UserDTO.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
Page</span><UserDTO> page = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> PageImpl(userDTOPageableList, pageable, conut);
}
}</span></pre>
</div>
<p>NOTE:<br> 在开发中,如果从任何<code>MongoDB</code>操作返回的<code>com.mongodb.WriteResult</code>包含错误,则可以方便地记录或引发异常。 通常,在开发过程中很容易忘记执行此操作,然后最终得到一个看似运行成功的App,但实际上该数据库操作发生异常,没执行成功。 可以将<code>MongoTemplate</code>的<code>WriteResultChecking</code>属性设置为以下值之一:</p>
<ul>
<li><code>EXCEPTION</code>:引发<code>Exception</code></li>
<li><code>NONE</code>:不执行任何操作,默认值</li>
</ul>
<p> 对于更高级的情况,可以将每个操作设置不同的<code>WriteConcern</code>值(用于删除,更新,插入和保存操作),则可以在<code>MongoTemplate</code>上配置<code>WriteConcernResolver</code>的策略接口。 由于<code>MongoTemplate</code>用于持久化<code>POJO</code>,因此<code>WriteConcernResolver</code>允许您创建一个策略,该策略可以将特定的<code>POJO</code>类映射到<code>WriteConcern</code>值。</p>
<p><code>WriteConcernResolver</code>接口:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> WriteConcernResolver {
WriteConcern resolve(MongoAction action);
}</span></pre>
</div>
<p>自定义<code>WriteConcernResolver</code>接口,实现不同<code>WriteConcern</code>策略:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MyAppWriteConcernResolver implements WriteConcernResolver {
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> WriteConcern resolve(MongoAction action) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (action.getEntityClass().getSimpleName().contains(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">UserDTO</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> WriteConcern.NONE;
} </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (action.getEntityClass().getSimpleName().contains(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Metadata</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> WriteConcern.JOURNAL_SAFE;
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> action.getDefaultWriteConcern();
}
}</span></pre>
</div>
<h1 id="item-5"> 常用的类以及方法解析</h1>
<h3 id="item-5-1">5.1 MongoClient、ServerAddress、MongoCredential以及MongoClientOptions</h3>
<p> 基于<code>ServerAddress</code>单机或者<code>Replica Set</code>在使用<code>MongoClient</code>连接<code>mongodb</code>数据库注册<code>mongo</code>实例,在注册示例中可能要使得<code>MongoCredential</code>账号密码验证以及使用<code>MongoClientOptions</code>配置<code>mongodb</code>其他的参数。</p>
<p><code>MongoClient</code>常用的构造器方法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MongoClient(String host){}
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MongoClient(MongoClientURI uri){}
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MongoClient(String host, MongoClientOptions options) {}
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MongoClient(ServerAddress addr, MongoCredential credential, MongoClientOptions options){}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> MongoClient(List<ServerAddress> seeds, MongoCredential credential, MongoClientOptions options){}</pre>
</div>
<h3 id="item-5-2">5.2 MongoTemplate</h3>
<p>使用<code>MongoTemplate</code>结合<code>Sort</code>、<code>Criteria</code>、<code>Query</code>、<code>Update</code>以及分页<code>Pageable</code>类灵活地进行对<code>mongodb</code>数据库进行增删改查。</p>
<p><code>query</code>方法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据查询条件查询</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <T> List<T> find(Query query, Class<T><span style="color: rgba(0, 0, 0, 1)"> entityClass){}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据查询条件查询返回一条记录</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <T> <T>findOne(Query query, Class<T><span style="color: rgba(0, 0, 0, 1)"> entityClass){}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">查询该collection所有记录</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <T> List<T> findAll(Class<T> entityClass){}</pre>
</div>
<p><code>insert</code>方法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">新增一条记录</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <T><span style="color: rgba(0, 0, 0, 1)"> T insert(T objectToSave){}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在collectionName中新增一条记录</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <T><span style="color: rgba(0, 0, 0, 1)"> T insert(T objectToSave, String collectionName) {}
</span><span style="color: rgba(0, 128, 0, 1)">//
</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <T> T save(T objectToSave){}</pre>
</div>
<p><code>remove</code>方法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据Object删除</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> DeleteResult remove(Object <span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)">) {}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据查询条件进行删除</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> DeleteResult remove(Query query, Class<?> entityClass){}</pre>
</div>
<p><code>update</code>方法:</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 128, 0, 1)">//
</span> <span style="color: rgba(0, 0, 255, 1)">public</span> UpdateResult upsert(Query query, Update update, Class<?><span style="color: rgba(0, 0, 0, 1)"> entityClass) {}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">更新查询出来的第一条记录</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> UpdateResult updateFirst(Query query, Update update, String collectionName) {}</pre>
</div>
<h3 id="item-5-3">5.3 Sort</h3>
<p><code>Sort</code>查询排序类。<code>Sort</code>类常用方法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">构造方法创建一个排序。direction为排序方向的枚举类型,properties为排序字段数组</span>
<span style="color: rgba(0, 0, 0, 1)">Sort(Sort.Direction direction, String... properties)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">多个排序条件链接</span>
<span style="color: rgba(0, 0, 0, 1)">and(Sort sort)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回升序排列对象</span>
<span style="color: rgba(0, 0, 0, 1)">ascending()
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回降序排列对象</span>
descending()</pre>
</div>
<h3 id="item-5-4">5.4 Criteria</h3>
<p><code>Criteria</code>查询条件类,类似于SQL的where,常用方法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">声明定义查询条件,且为静态方法</span>
<span style="color: rgba(0, 0, 255, 1)">where</span><span style="color: rgba(0, 0, 0, 1)">(String key)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">与操作</span>
<span style="color: rgba(0, 0, 0, 1)">and(String key)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">正则表达式,即可为模糊查询</span>
<span style="color: rgba(0, 0, 0, 1)">regex(String re)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">包含</span>
<span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)">(Object... o)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">大于</span>
<span style="color: rgba(0, 0, 0, 1)">gt(Object o)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">大于等于</span>
<span style="color: rgba(0, 0, 0, 1)">gte(Object o)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">等于</span>
<span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)">(Object o)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">小于</span>
<span style="color: rgba(0, 0, 0, 1)">lt(Object o)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">小于等于</span>
<span style="color: rgba(0, 0, 0, 1)">lte(Object o)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">非</span>
<span style="color: rgba(0, 0, 0, 1)">not()
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建与操作</span>
andOperator(Criteria... criteria) </pre>
</div>
<h3 id="item-5-5">5.5 Query</h3>
<p><code>Query</code>查询对象,具有查询的全部信息,其中包括筛选条件、排序、返回数量等。常用的方法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义查询对象,静态方法</span>
<span style="color: rgba(0, 0, 0, 1)">query(CriteriaDefinition criteriaDefinition)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在本次查询添加一个CriteriaDefinition查询条件</span>
<span style="color: rgba(0, 0, 0, 1)">addCriteria(CriteriaDefinition criteriaDefinition)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加一个Sort排序对象</span>
<span style="color: rgba(0, 0, 0, 1)">with(Sort sort)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加一个Pageable分页对象、通常情况下,分页和排序一起使用。</span>
with(Pageable pageable)</pre>
</div>
<p> </p>
<p>详细接口信息可查看【MogoDB API官方文档】</p>
<h1 id="item-6">常用注解</h1>
<p> </p>
<table>
<thead>
<tr><th align="left">注解</th><th align="left">解析</th></tr>
</thead>
<tbody>
<tr>
<td align="left">@Id</td>
<td align="left">用于标记id字段,没有标记此字段的实体也会自动生成id字段,但是我们无法通过实体来获取id。id建议使用ObjectId类型来创建</td>
</tr>
<tr>
<td align="left">@Document</td>
<td align="left">用于标记此实体类是mongodb集合映射类</td>
</tr>
<tr>
<td align="left">@DBRef</td>
<td align="left">用于指定与其他集合的级联关系,但是需要注意的是并不会自动创建级联集合</td>
</tr>
<tr>
<td align="left">@Indexed</td>
<td align="left">用于标记为某一字段创建索引</td>
</tr>
<tr>
<td align="left">@CompoundIndex</td>
<td align="left">用于创建复合索引</td>
</tr>
<tr>
<td align="left">@TextIndexed:</td>
<td align="left">用于标记为某一字段创建全文索引</td>
</tr>
<tr>
<td align="left">@Language</td>
<td align="left">指定documen语言</td>
</tr>
<tr>
<td align="left">@Transient:</td>
<td align="left">被该注解标注的,将不会被录入到数据库中。只作为普通的javaBean属性</td>
</tr>
<tr>
<td align="left">@Field:</td>
<td align="left">用于指定某一个字段映射到数据库中的名称<br><br></td>
</tr>
</tbody>
</table>
<p>
<input id="articleAuthor" type="hidden" value="Ccww">
<input id="articleSource" type="hidden" value="https://segmentfault.com/a/1190000020618248"></p><br><br>
来源:https://www.cnblogs.com/21-Gram/p/12014944.html
頁:
[1]