javascript
Springboot中mongodb的使用
mongodb是最早熱門非關系數據庫的之一,使用也比較普遍,一般會用做離線數據分析來使用,放到內網的居多。由于很多公司使用了云服務,服務器默認都開放了外網地址,導致前一陣子大批 MongoDB 因配置漏洞被攻擊,數據被刪,引起了人們的注意,感興趣的可以看看這篇文章:場屠戮MongoDB的盛宴反思:超33000個數據庫遭遇入侵勒索,同時也說明了很多公司生產中大量使用mongodb。
mongodb簡介
MongoDB(來自于英文單詞“Humongous”,中文含義為“龐大”)是可以應用于各種規模的企業、各個行業以及各類應用程序的開源數據庫。基于分布式文件存儲的數據庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB是一個高性能,開源,無模式的文檔型數據庫,是當前NoSql數據庫中比較熱門的一種。
MongoDB是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。他支持的數據結構非常松散,是類似json的bjson格式,因此可以存儲比較復雜的數據類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。
傳統的關系數據庫一般由數據庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由數據庫(database)、集合(collection)、文檔對象(document)三個層次組成。MongoDB對于關系型數據庫里的表,但是集合中沒有列、行和關系概念,這體現了模式自由的特點。
MongoDB中的一條記錄就是一個文檔,是一個數據結構,由字段和值對組成。MongoDB文檔與JSON對象類似。字段的值有可能包括其它文檔、數組以及文檔數組。MongoDB支持OS X、Linux及Windows等操作系統,并提供了Python,PHP,Ruby,Java及C++語言的驅動程序,社區中也提供了對Erlang及.NET等平臺的驅動程序。
MongoDB的適合對大量或者無固定格式的數據進行存儲,比如:日志、緩存等。對事物支持較弱,不適用復雜的多文檔(多表)的級聯查詢。文中演示mongodb版本為3.4。
?
mongodb的增刪改查
Spring Boot對各種流行的數據源都進行了封裝,當然也包括了mongodb,下面給大家介紹如何在spring boot中使用mongodb:
1、pom包配置
pom包里面添加spring-boot-starter-data-mongodb包引用
<dependencies><dependency> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency> </dependencies>2、在application.properties中添加配置
spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test多個IP集群可以采用以下配置:
spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database3、創建數據實體
public class UserEntity implements Serializable {private static final long serialVersionUID = -3258839839160856613L;private Long id;private String userName;private String passWord;//getter、setter省略 }4、創建實體dao的增刪改查操作
dao層實現了UserEntity對象的增刪改查
@Component public class UserDaoImpl implements UserDao {@Autowiredprivate MongoTemplate mongoTemplate;/*** 創建對象* @param user*/@Overridepublic void saveUser(UserEntity user) {mongoTemplate.save(user);}/*** 根據用戶名查詢對象* @param userName* @return*/@Overridepublic UserEntity findUserByUserName(String userName) {Query query=new Query(Criteria.where("userName").is(userName));UserEntity user = mongoTemplate.findOne(query , UserEntity.class);return user;}/*** 更新對象* @param user*/@Overridepublic void updateUser(UserEntity user) {Query query=new Query(Criteria.where("id").is(user.getId()));Update update= new Update().set("userName", user.getUserName()).set("passWord", user.getPassWord());//更新查詢返回結果集的第一條mongoTemplate.updateFirst(query,update,UserEntity.class);//更新查詢返回結果集的所有// mongoTemplate.updateMulti(query,update,UserEntity.class);}/*** 刪除對象* @param id*/@Overridepublic void deleteUserById(Long id) {Query query=new Query(Criteria.where("id").is(id));mongoTemplate.remove(query,UserEntity.class);} }5、開發對應的測試方法
@RunWith(SpringRunner.class) @SpringBootTest public class UserDaoTest {@Autowiredprivate UserDao userDao;@Testpublic void testSaveUser() throws Exception {UserEntity user=new UserEntity();user.setId(2l);user.setUserName("小明");user.setPassWord("fffooo123");userDao.saveUser(user);}@Testpublic void findUserByUserName(){UserEntity user= userDao.findUserByUserName("小明");System.out.println("user is "+user);}@Testpublic void updateUser(){UserEntity user=new UserEntity();user.setId(2l);user.setUserName("天空");user.setPassWord("fffxxxx");userDao.updateUser(user);}@Testpublic void deleteUserById(){userDao.deleteUserById(1l);}}6、查看驗證結果
可以使用工具mongoVUE工具來連接后直接圖形化展示查看,也可以登錄服務器用命令來查看
1.登錄mongos
bin/mongo -host localhost -port 20000
2、切換到test庫
use test
3、查詢userEntity集合數據
db.userEntity.find()
根據3查詢的結果來觀察測試用例的執行是否正確。
到此springboot對應mongodb的增刪改查功能已經全部實現。
?
多數據源mongodb的使用
在多mongodb數據源的情況下,我們換種更優雅的方式來實現
1、pom包配置
添加lombok和spring-boot-autoconfigure包引用
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>RELEASE</version> </dependency>-
Lombok - 是一個可以通過簡單的注解形式來幫助我們簡化消除一些必須有但顯得很臃腫的Java代碼的工具,通過使用對應的注解,可以在編譯源碼的時候生成對應的方法。簡單試了以下這個工具還挺好玩的,加上注解我們就不用手動寫 getter\setter、構建方式類似的代碼了。
-
spring-boot-autoconfigure - 就是spring boot的自動化配置
2、配置文件使用YAML的形式添加兩條數據源,如下:
mongodb:primary:host: 192.168.9.60port: 20000database: testsecondary:host: 192.168.9.60port: 20000database: test13、配置兩個庫的數據源
封裝讀取以mongodb開頭的兩個配置文件
@Data @ConfigurationProperties(prefix = "mongodb") public class MultipleMongoProperties {private MongoProperties primary = new MongoProperties();private MongoProperties secondary = new MongoProperties(); }配置不同包路徑下使用不同的數據源
第一個庫的封裝
@Configuration @EnableMongoRepositories(basePackages = "com.neo.model.repository.primary",mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE) public class PrimaryMongoConfig {protected static final String MONGO_TEMPLATE = "primaryMongoTemplate"; }第二個庫的封裝
@Configuration @EnableMongoRepositories(basePackages = "com.neo.model.repository.secondary",mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE) public class SecondaryMongoConfig {protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate"; }讀取對應的配置信息并且構造對應的MongoTemplate
@Configuration public class MultipleMongoConfig {@Autowiredprivate MultipleMongoProperties mongoProperties;@Primary@Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)public MongoTemplate primaryMongoTemplate() throws Exception {return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));}@Bean@Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)public MongoTemplate secondaryMongoTemplate() throws Exception {return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));}@Bean@Primarypublic MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),mongo.getDatabase());}@Beanpublic MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),mongo.getDatabase());} }兩個庫的配置信息已經完成。
4、創建兩個庫分別對應的對象和Repository
借助lombok來構建對象
@Data @AllArgsConstructor @NoArgsConstructor @Document(collection = "first_mongo") public class PrimaryMongoObject {@Idprivate String id;private String value;@Overridepublic String toString() {return "PrimaryMongoObject{" + "id='" + id + '\'' + ", value='" + value + '\''+ '}';} }對應的Repository
public interface PrimaryRepository extends MongoRepository<PrimaryMongoObject, String> { }繼承了 MongoRepository 會默認實現很多基本的增刪改查,省了很多自己寫dao層的代碼
Secondary和上面的代碼類似就不貼出來了
5、最后測試
@RunWith(SpringRunner.class) @SpringBootTest public class MuliDatabaseTest {@Autowiredprivate PrimaryRepository primaryRepository;@Autowiredprivate SecondaryRepository secondaryRepository;@Testpublic void TestSave() {System.out.println("************************************************************");System.out.println("測試開始");System.out.println("************************************************************");this.primaryRepository.save(new PrimaryMongoObject(null, "第一個庫的對象"));this.secondaryRepository.save(new SecondaryMongoObject(null, "第二個庫的對象"));List<PrimaryMongoObject> primaries = this.primaryRepository.findAll();for (PrimaryMongoObject primary : primaries) {System.out.println(primary.toString());}List<SecondaryMongoObject> secondaries = this.secondaryRepository.findAll();for (SecondaryMongoObject secondary : secondaries) {System.out.println(secondary.toString());}System.out.println("************************************************************");System.out.println("測試完成");System.out.println("************************************************************");}}到此,mongodb多數據源的使用已經完成。
示例代碼
-------------
作者:純潔的微笑
出處:http://www.ityouknow.com/
版權歸作者所有,轉載請注明出處
總結
以上是生活随笔為你收集整理的Springboot中mongodb的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Google BigTable到底解决什
- 下一篇: SpringCloud配置中心高可用搭建