- NoSQL(Not Only SQL),即反SQL運動或者是不僅僅SQL,指的是非關系型的資料庫,是一項全新的資料庫革命運動,是一種全新的思維注入
- NoSQL優點
- 資料庫高并發讀寫
- 海量資料高效率存盤和訪問
- 資料庫高擴展性和高可用性
- NoSQL缺點
- 資料庫事務一致性需求
- 資料庫的寫實時性和讀實時性需求
- 復雜的SQL查詢,特別是奪標關聯查詢的需求
- MongoDB概述
- 由C++語言撰寫,是一個基于分布式檔案存盤的開源資料庫系統;在高負載的情況下,添加更多的節點,可以保證服務器性能
- MongoDB旨在為WEB應用提供可擴展的高性能資料存盤解決方案;將資料存盤為一個檔案,資料結構由鍵值對組成,MongoDB檔案類似于JSON物件欄位值可以包含其他問你當、陣列及檔案陣列
- MongoDB特點
- MongoDB是一個面向檔案存盤的資料庫,操作起來比較簡單和容易
- MongoDB記錄總可以設定任何屬性的索引
- 可以通過本地后者網路創建資料鏡像,這使得MongoDB有更強的擴展性
- 如果負載的增減(需要跟多的存盤空間和更強的處理能力),它可以分布在計算機網路中的其他節點上,這就是所謂的分片
- MongoDB支持豐富的查詢運算式,查詢指令使用JSON形式的標記,可輕易查詢檔案中內嵌的物件和陣列
- MongoDB使用update()命令可以實作替換完成的檔案(資料)或者一些指定的資料欄位
- MongoDB中的Map/reduce主要是用來對資料進行批量處理和聚合操作
- Map和Reduce
- Map函式呼叫emit(key, value)便利集合中所有的記錄,將key域value傳給Reduce函式進行處理
- Map和Reduce函式是使用JavaScript撰寫的,把那個可以通過db.runCommand或mapreduce命令來執行MapReduce操作
- GridFS是MongoDB中的一個內置功能,可以用于存放大量的小檔案
- MongoDB允許在服務端執行腳本,可以用JavaScript撰寫某個函式,直接在服務端執行,也可以把函式的定義存盤在服務端,下次直接呼叫即可
- MongoDB支持跟中編程語言:
RUBY、PYTHON、JAVA、C++、PHP、C# - 安裝簡單
- MongoDB語法:略
- SpringBoot整合MongoDB
- 集成簡介:spring-data-mongodb提供了MongoTemplate和MongoRepository兩種方式訪問MongoDB;MongoTemplate操作靈活,MongoRepository操作簡單,不夠靈活
- 添加相關依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
- 添加配置
spring.data.mongodb.uri=mongodb://Your IP:27017/your database
- 創建與集合對應的物體類
@Data
@Document("User") // 表示操作的是your database下的User集合
public class User {
@Id
private String id;
private String name;
private Integer age;
}
- 測驗MongoTemplate訪問MongoDB(CRUD)
@SpringBootTest
public class MongoDBTest {
@Autowired
private MongoTemplate mongoTemplate;
/** 新增 */
@Test
public void insert() {
User user = new User();
user.setName("xiansen");
user.setAge(18);
User u = mongoTemplate.insert(user);
System.out.println("user = " + u);
}
/** 查詢所有記錄 */
@Test
public void findAll() {
List<User> all = mongoTemplate.findAll(User.class);
System.out.println("all = " + all);
}
/** ID查詢 */
@Test
public void findById() {
User u = mongoTemplate.findById("rge8vcuxdfsfdfsdf", User.class);
System.out.println("u = " + u);
}
/** 條件查詢 */
@Test
public void findUserList() {
Query query = new Query(Criteria.where("name").is("xiansen").and("age").is(18));
List<User> users = mongoTemplate.find(query, User.class);
System.out.println("users = " + users);
}
/** 模糊查詢 */
@Test
public void findUserListByLike() {
String name = "xian";
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); // 大小寫敏感
Query query = new Query(Criteria.where("name").regex(pattern)); // 使用正則運算式實作模糊查詢
List<User> users = mongoTemplate.find(query, User.class);
System.out.println("users = " + users);
}
/** 分頁查詢 */
@Test
public void findPageUserList() {
int current = 1;
int limit = 3;
String name = "xian";
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); // 大小寫敏感
Query query = new Query(Criteria.where("name").regex(pattern));
// 查詢的記錄數
Long count = mongoTemplate.count(query, User.class);
System.out.println("count = " + count);
// 分頁查詢
List<User> users = mongoTemplate.find(query.skip((current-1)*limit).limit(limit), User.class);
System.out.println("users = " + users);
}
/** 修改 */
@Test
public void updateUser() {
User u = mongoTemplate.findById("ds98h98sdhds6gt7u", User.class);
u.setName("hello");
u.setAge(20);
Query query = new Query(Criteria.where("_id").is(u.getId()));
Update update = new Update();
update.set("name", u.getName());
update.set("age", u.getAge());
UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
long modifiedCount = upsert.getModifiedCount(); // 影響的行數
System.out.println("modifiedCount = " + modifiedCount);
}
/** 洗掉 */
@Test
public void deleteUser() {
Query query = new Query(Criteria.where("_id").is("ds98h98sdhds6gt7u"));
DeleteResult remove = mongoTemplate.remove(query, User.class);
long deletedCount = remove.getDeletedCount(); // 影響的行數
System.out.println("deletedCount = " + deletedCount);
}
}
- 相比于MongoTemplate,MongoRepository實作CRUD操作,還需要創建一個繼承MongoRepository介面的介面,如
@Repository
public interface UserRepository extends MongoRepository<User, String> {}
- 測驗MongoRepository訪問MongoDB(CRUD)
@SpringBootTest
public class MongoDBTest {
@Autowired
private UserRepository userRepository;
/** 新增 */
@Test
public void insert() {
User user = new User();
user.setName("xiansen");
user.setAge(18);
User u = userRepository.save(user);
System.out.println("user = " + u);
}
/** 查詢所有記錄 */
@Test
public void findAll() {
List<User> all = userRepository.findAll();
System.out.println("all = " + all);
}
/** ID查詢 */
@Test
public void findById() {
User u = userRepository.findById("rge8vcuxdfsfdfsdf").get();
System.out.println("u = " + u);
}
/** 條件查詢 */
@Test
public void findUserList() {
User user = new User();
user.setName("xiansen");
user.setAge(18);
Example<User> userExample = Example.of(user);
List<User> users = userRepository.findAll(userExample);
System.out.println("users = " + users);
}
/** 模糊查詢 */
@Test
public void findUserListByLike() {
User user = new User();
user.setName("xian");
user.setAge(18);
ExampleMatcher matcher = ExampleMatcher.matching()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) // 表示模糊查詢
.withIgnoreCase(true); // 忽略大小寫
Example<User> userExample = Example.of(user, matcher);
List<User> users = userRepository.findAll(userExample);
System.out.println("users = " + users);
}
/** 分頁查詢 */
@Test
public void findPageUserList() {
// 分頁設定引數
Pageable pageable = PageRequest.of(0, 3);// 0表示第一頁
User user = new User();
user.setName("xiansen");
user.setAge(18);
Example<User> userExample = Example.of(user);
Page<User> page = userRepository.findAll(userExample, pageable);
System.out.println("page = " + page);
}
/** 修改 */
@Test
public void updateUser() {
User u = userRepository.findById("ds98h98sdhds6gt7u").get();
u.setName("hello");
u.setAge(20);
User user = userRepository.save(u);
System.out.println("user = " + user);
}
/** 洗掉 */
@Test
public void deleteUser() {
userRepository.deleteById("ds98h98sdhds6gt7u");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500526.html
標籤:其他
上一篇:多執行緒簡介
