mongoDB介紹
-
redis 每秒10萬次的以上的操作
-
10萬數量List,先取出然後在篩選。可以通過Lua腳本完善。
-
經常需要統計,分析和查詢的數據。對於 Redis就不便捷了。
-
用MongoDB,對於統計,按條件查詢,和 分析數據。
-
MongoDB 一個最接近關係數據庫的NoSQL
-
c++語言編寫,
-
基於分佈式 文件存儲的 開源數據庫 系統。負載高,可添加更多的節點
-
爲 Web應用 提供 可擴展的 高性能數據 存儲解決方案
-
將數據存儲 爲 一個文檔,數據結構 由 鍵值 對組成
-
類似於JSON數據集
-
文檔,數組,文檔數組
{ "id":1, "user_name":"張三", "roles":[ { "id":1, "role_name":"高級工程師" }, { } ] }
引入POM
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
配置MongoDB
#服務器地址
spring.data.mongodb.host=192.168.11.131
#用戶名
spring.data.mongodb.username=spring
#密碼
spring.data.mongodb.password=123456
#端口
spring.data.mongodb.port=27017
#數據庫名稱
spring.data.mongodb.database=springboot
#無需關注的配置
#簽名 策略 網格 jpa 默認uri
#用於簽名的MongoDB數據庫
spring.data.mongodb.authentication-database=
#使用字段名策略
spring.data.mongodb.field-naming-strategy=
#網格文件 數據庫名稱
spring.data.mongodb.grid-fs-database=
#是否啓用 MongoDB關於JPA規範的編程
spring.data.mongodb.repositories.type=auto
#默認URI
spring.data.mongodb.uri=mongodb://localhost/test
spring:
data:
mongodb:
host: localhost
port: 27017
uri: mongodb://localhost/test
database: test
authentication-database: test
grid-fs-database: test
username: abc
password: abc
repositories:
enabled: true
field-naming-strategy: abc
spring boot 自動配置類
Bean類型 | 描述 |
---|---|
MongoClient | mongodb客戶端 |
MongoProperties | 自動配置屬性 |
MongoDataAutoConfiguration | 自動配置類 |
SimpleMongoDbFactory | 簡單工廠,生成會話。spring.data.mongodb.grid-fs-database=配置爲GridFsMongoDbFactory |
MongoTemplate | 模板 |
MappingMongoConverter | 類型轉換器 |
MongoMappingContext | Java實體的映射內容配置 |
CustomConversions | 自定義類型轉換器 |
MongoRepositoriesAutoConfiguration | 倉庫的自動配置 |
GeoJsonConfiguration | 關於地理位置Json配置 |
使用 MongoTemplate
pojo
// 標識爲MongoDB文檔
@Document
public class User implements Serializable {
private static final long serialVersionUID = -7895435231819517614L;
// MongoDB文檔編號,主鍵
@Id
private Long id;
// 在MongoDB中使用user_name保存屬性
@Field("user_name") //mongodb數據規範 下劃線分隔
private String userName = null;
private String note = null;
// 角色列表
private List<Role> roles = null;
//如果只想 其引用 @DBRef標註,而不是具體的角色信息
}
@Document
public class Role implements Serializable {
private static final long serialVersionUID = -6843667995895038741L;
private Long id;
@Field("role_name")
private String roleName = null;
private String note = null;
}
//把角色 當做 一個 文檔。
//如果你只是在User中使用,那麼你可以不使用@Document
action
@Controller
@RequestMapping("/user")
public class UserController {
// 後面會給出其操作的方法
@Autowired
private UserService userService = null;
// 跳轉到測試頁面
@RequestMapping("/page")
public String page() {
return "user";
}
/**
* 保存(新增或者更新)用戶
* @param user -- 用戶
* @return 用戶信息
*/
@RequestMapping("/save")
@ResponseBody
public User saveUser(@RequestBody User user) {
userService.saveUser(user);
return user;
}
/***
* 獲取用戶
* @param id -- 用戶主鍵
* @return 用戶信息
*/
@RequestMapping("/get")
@ResponseBody
public User getUser(Long id) {
User user = userService.getUser(id);
return user;
}
/**
* 查詢用戶
* @param userName --用戶名稱
* @param note -- 備註
* @param skip -- 跳過用戶個數
* @param limit -- 限制返回用戶個數
* @return
*/
@RequestMapping("/find")
@ResponseBody
public List<User> addUser(String userName, String note, Integer skip, Integer limit) {
List<User> userList = userService.findUser(userName, note, skip, limit);
return userList;
}
/**
* 更新用戶部分屬性
* @param id —— 用戶編號
* @param userName —— 用戶名稱
* @param note —— 備註
* @return 更新結果
*/
@RequestMapping("/update")
@ResponseBody
public UpdateResult updateUser(Long id, String userName, String note) {
return userService.updateUser(id, userName, note);
}
/**
* 刪除用戶
* @param id -- 用戶主鍵
* @return 刪除結果
*/
@RequestMapping("/delete")
@ResponseBody
public DeleteResult deleteUser(Long id) {
return userService.deleteUser(id);
}
// 注入接口
@Autowired
private UserRepository userRepository = null;
// 執行查詢
@RequestMapping("/byName")
@ResponseBody
public List<User> findByUserName(String userName) {
return userRepository.findByUserNameLike(userName);
}
// 執行查詢
@RequestMapping("/findOr")
@ResponseBody
public User findUserByIdOrUserName(Long id, String userName) {
return userRepository.findUserByIdOrUserName(id, userName);
}
}
service
public interface UserService {
public void saveUser(User user);
public DeleteResult deleteUser(Long id);
public List<User> findUser(String userName, String note, int skip, int limit);
public UpdateResult updateUser(Long id, String userName, String note);
public User getUser(Long id);
}
@Service
public class UserServiceImpl implements UserService {
// 注入MongoTemplate對象
@Autowired
private MongoTemplate mongoTmpl = null;
@Override
public User getUser(Long id) {
return mongoTmpl.findById(id, User.class);
// 如果只需要獲取第一個也可以採用如下查詢方法
// Criteria criteriaId = Criteria.where("id").is(id);
// Query queryId = Query.query(criteriaId);
// return mongoTmpl.findOne(queryId, User.class);
}
@Override //regex 模糊查詢,limit 最多返回多少條。 skip代表跳過多少條記錄。
public List<User> findUser(String userName, String note, int skip, int limit) {
// 將用戶名稱和備註設置爲模糊查詢準則
Criteria criteria = Criteria.where("user_name").regex(userName).and("note").regex(note);
// 構建查詢條件,並設置分頁跳過前skip個,至多返回limit個
Query query = Query.query(criteria).limit(limit).skip(skip);
// 執行
List<User> userList = mongoTmpl.find(query, User.class);
return userList;
}
@Override //如果Id已經存在,就是更新對象
public void saveUser(User user) {
// 使用名稱爲user文檔保存用戶信息
mongoTmpl.save(user, "user");
// 如果文檔採用類名首字符小寫,則可以這樣保存
// mongoTmpl.save(user);
}
@Override
public DeleteResult deleteUser(Long id) {
// 構建id相等的條件
Criteria criteriaId = Criteria.where("id").is(id);
// 查詢對象
Query queryId = Query.query(criteriaId);
// 刪除用戶
DeleteResult result = mongoTmpl.remove(queryId, User.class);
//DeleteResult有 deletedCount 刪除條數
return result;
}
@Override
public UpdateResult updateUser(Long id, String userName, String note) {
// 確定要更新的對象
Criteria criteriaId = Criteria.where("id").is(id);
Query query = Query.query(criteriaId);
// 定義更新對象,後續可變化的字符串代表排除在外的屬性
Update update = Update.update("user_name", userName);
update.set("note", note);
// 更新單個對象
UpdateResult result = mongoTmpl.updateFirst(query, update, User.class);
// 更新多個對象
// UpdateResult result2 = mongoTmpl.updateMulti(query, update, User.class);
//matchedCount modifiedCount upsertedId如果存在因爲更新而插入文檔的情況,會插入文檔的信息
return result;
}
}
- Criteria 構建準則
測試
http://localhost:8080/user/save
{
"userName":"張三2",
"note":"我的日記2",
"id":101
}
http://localhost:8080/user/save
http://localhost:8080/user/find?userName=張¬e=我&skip=0&limit=10
跳過0個,最多返回10個
[
{
"id": 100,
"userName": "張三",
"note": "我的日記",
"roles": null
},
{
"id": 101,
"userName": "張三2",
"note": "我的日記2",
"roles": null
}
]
http://localhost:8080/user/update?id=100¬e=李四的日記&userName=李四
{
"matchedCount": 1,
"modifiedCount": 1,
"upsertedId": null
}
id不存在的時候:
{
"matchedCount": 0,
"modifiedCount": 0,
"upsertedId": null
}
http://localhost:8080/user/delete?id=100
{
"deletedCount": 0
}
jpa
- MongoRepository
dao
@Repository
// 擴展MongoRepository接口
public interface UserRepository extends MongoRepository<User, Long> {
/**
* 符合JPA規範命名方法,則不需要再實現該方法也可用,
* 意在對滿足條件的文檔按照用戶名稱進行模糊查詢
* @param userName -- 用戶名稱
* @return 滿足條件的用戶信息
*/
List<User> findByUserNameLike(String userName);
/**
* 根據編號或者用戶名查找用戶
* @param id -- 編號
* @param userName -- 用戶名
* @return 用戶信息
*/
User findUserByIdOrUserName(Long id, String userName);
}
指定掃描包
@SpringBootApplication(scanBasePackages = "com.springboot.chapter8")
//指定掃描的包,用於掃描繼承了MongoRepository的接口
@EnableMongoRepositories(basePackages="com.springboot.chapter8.repository", repositoryImplementationPostfix ="Stuff")
public class Chapter8Application {
public static void main(String[] args) {
SpringApplication.run(Chapter8Application.class, args);
}
}
action
// 注入接口
@Autowired
private UserRepository userRepository = null;
// 執行查詢
@RequestMapping("/byName")
@ResponseBody
public List<User> findByUserName(String userName) {
return userRepository.findByUserNameLike(userName);
}
// 執行查詢
@RequestMapping("/findOr")
@ResponseBody
public User findUserByIdOrUserName(Long id, String userName) {
return userRepository.findUserByIdOrUserName(id, userName);
}