深淺boot2.0第八章mongoDB

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=&note=&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&note=李四的日記&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);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章