LeetCode 5644. 得到子序列的最少操作次數(最長上升子序DP nlogn)
阿新 • • 發佈:2021-01-09
Spring Data MongoDB
相關依賴:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</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> </dependencies>
配置檔案application.yml
spring:
data:
mongodb:
host: 192.168.1.43
port: 27017
username: root
password: root
authentication-database: admin
database: test
啟動springboot專案:
註解描述實體型別
Id註解,是springdata提供的一個公共註解,用來描述實體型別中的主鍵屬性.
在springdata-mongodb環境中,如果實體型別的屬性命名為id或_id時,且這個屬性就是主鍵屬性時,可以省略Id註解.
只有主鍵型別為String或ObjectId型別時,MongoDB才能自動生成,其他型別的主鍵必須手工賦值。
@Document("user")//對應哪一個集合 @Data@EqualsAndHashCode public class User implements Serializable { @Id private Long id; /** * field註解,用來描述型別的屬性和集合中的欄位的對映關係 */ @Field("name") private String username; private String password; private String email; private List<String> courses; }
新增資料
@Autowired
private MongoTemplate mongoTemplate;
@Test
void contextLoads() {
User user = new User();
user.setId(100L);
user.setUsername("wj");
user.setPassword("wj");
user.setEmail("[email protected]");
user.setCourses(Arrays.asList("spring","dubbo"));
mongoTemplate.insert(user);
}
當我們的實體類什麼springdata註解都沒有加上時,也是可以插入成功的:
@Data
@EqualsAndHashCode
public class Item {
private String code;
private Integer num;
private Double price;
}
@Test
public void testInsert(){
Item item = new Item();
item.setCode("123");
item.setNum(11);
item.setPrice(22.5);
mongoTemplate.insert(item);
}
儲存資料save
save方法:如果存在該條資料則直接覆蓋原資料(判斷主鍵是否相同),不存在則新增。
public void testSave(){
User user = new User();
user.setUsername("aaa");
user.setId(101L);
user.setCourses(Arrays.asList("spring","dubbo"));
mongoTemplate.save(user);
User user2 = new User();
user2.setUsername("wj2");
user2.setId(100L);
mongoTemplate.save(user2);
}
更新資料
更新單一資料
updateFirst方法的三個引數:
- query:匹配條件
- update:更新內容
- Class:通過型別來找對應的集合
@Test
public void testUpdate(){
Query query = new Query();
query.addCriteria(Criteria.where("name").is("wj2"));
Update update = new Update();
update.set("name","wj3");
update.set("email","[email protected]");
UpdateResult updateResult = mongoTemplate.updateFirst(query, update, User.class);
System.out.println(updateResult.getMatchedCount());//匹配行數
System.out.println(updateResult.getModifiedCount());//修改行數
}
更新多資料
@Test
public void testUpdateMulti(){
Query query = new Query();
query.addCriteria(Criteria.where("_id").lte(200));
Update update = Update.update("password","123456");
mongoTemplate.updateMulti(query,update,User.class);
}
更新或新增
更新,如果更新資料不存在,則新增
@Test
public void testUpset(){
Query query = new Query();
query.addCriteria(Criteria.where("name").is("zhangsan"));
Update update = Update.update("password", "123");
mongoTemplate.upsert(query,update,User.class);
}
發現使用upset插入的資料,類的型別丟失,所以不建議使用upset。
刪除
根據條件刪除
@Test
public void testDelete(){
Query query = new Query();
query.addCriteria(Criteria.where("name").is("zhangsan"));
mongoTemplate.remove(query,User.class);
}
根據主鍵刪除
根據java物件刪除資料,Spring Data MongoDB找到這個物件對應的集合,使用主鍵作為條件刪除。
@Test
public void testDeleteByObj(){
User user = new User();
user.setId(100L);
user.setUsername("哈哈哈");
mongoTemplate.remove(user);
}
查詢資料
查詢全部資料
@Test
public void testFind(){
List<User> users = mongoTemplate.findAll(User.class);
users.forEach(System.out::println);
}
單資料查詢
有兩種:findOne和findById
@Test
public void findOne(){
Query query = new Query();
query.addCriteria(Criteria.where("name").is("wj3"));
User one = mongoTemplate.findOne(query, User.class);
System.out.println(one);
User user = mongoTemplate.findById(101L, User.class);
System.out.println(user);
}
條件查詢
@Test
public void testQuery(){
Query query = new Query();
query.addCriteria(
//範圍查詢
Criteria.where("_id").lt(103L).gte(100L)
);
List<User> users = mongoTemplate.find(query, User.class);
users.forEach(System.out::println);
}
正則查詢:不需要寫正則的起始和結束標記
@Test
public void testQuery(){
Query query = new Query();
query.addCriteria(
Criteria.where("name").regex("wj")
);
List<User> users = mongoTemplate.find(query, User.class);
users.forEach(System.out::println);
}
複合多條件查詢
查詢密碼中包含5且主鍵小於103的User
@Test
public void find(){
Query query = new Query();
Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("password").regex("5"),Criteria.where("_id").lt(103L));
query.addCriteria(criteria);
List<User> users = mongoTemplate.find(query, User.class);
users.forEach(System.out::println);
}
查詢密碼中包含5或主鍵小於103的User
@Test
public void find(){
Query query = new Query();
Criteria criteria = new Criteria(); criteria.orOperator(Criteria.where("password").regex("5"),Criteria.where("_id").lt(103L));
query.addCriteria(criteria);
List<User> users = mongoTemplate.find(query, User.class);
users.forEach(System.out::println);
}
排序
@Test
public void order(){
Query query = new Query();
//主鍵降序排列
query.with(Sort.by(Sort.Direction.DESC,"_id"));
List<User> users = mongoTemplate.find(query, User.class);
users.forEach(System.out::println);
}
分頁
頁碼從0開始
@Test
public void page(){
Query query = new Query();
query.with(PageRequest.of(1,2));
List<User> users = mongoTemplate.find(query, User.class);
users.forEach(System.out::println);
}
排序再分頁
@Test
public void page(){
Query query = new Query();
query.with(PageRequest.of(1,2,Sort.by(Sort.Direction.DESC,"_id")));
List<User> users = mongoTemplate.find(query, User.class);
users.forEach(System.out::println);
}
聚合
@Test
public void agg(){
GroupOperation count = Aggregation.group().count().as("count");
TypedAggregation<User> aggregation = TypedAggregation.newAggregation(User.class, count);
AggregationResults<Map> result = mongoTemplate.aggregate(aggregation, Map.class);
Map map = result.getUniqueMappedResult();
System.out.println(map);
}