Spring-MongoDB属于Spring Data项目的一个子项目,是专门针对Java Spring开发人员对MongoDB的一个封装,使用方法,代码风格都和之前写Spring代码保持一致;Spring Boot是Spring社区最近比较热的一个快速代码构建项目,自动处理依赖,快速启动项目,"just run",实际上Spring社区希望大家现在开始任何Spring Application都从Spring boot开始。
目前共享单车比较流行,我们就用共享单车作为例子,使用Bike数据模型进行Cosmos DB MongoDB接口的的存储,访问。
Spring-MongoDB访问Cosmos DB
1. 打开你的Java开发IDE,你可以使用Spring STS(基于Eclipse免费),或者IntelliJ IDEA,本例中使用IDEA,选择新项目,Spring Initializer ,选择使用的JDK,然后下一步:
2. 出现Spring Boot基础maven配置页面,输入项目包名称,描述,类型等信息:
3. 选择需要支持的模型,我们选择NoSQL,然后选择"MongoDB":
4. 输入项目名称,点击完成,完成项目设置
5. 首先我们需要构建数据模型,我们这个例子使用目前流行的共享单车作为例子,我们定义单车的设备号,车辆型号,目前位置的经纬度,更新时间等信息:
public class Bike { @Id private String deviceID; private String bikeType; private String city; private String country; private Double latitude; private Double longitude; private Date updateDate; public Bike() {} public Bike(String deviceID, String bikeType, String city, String country) { this.deviceID = deviceID; this.bikeType = bikeType; this.city = city; this.country = country; } @Override public String toString() { return String.format( "Bike[id=%s, generation=%s, city=%s, latitude=%f, longitude=%f, updated=%s]", deviceID, bikeType, city, latitude, longitude, updateDate.toString()); }
当然后面还会有一大堆的Getter和Setter方法,非常简单,在此就不占用篇幅了。
6. 然后我们来定义Bike Repository的搜索接口,Spring-MongoDB最为方便的地方就是你只需要定义接口,然后具体的方法会被auto wired,我们定义两个搜索方法,一个是按照设备号来搜索自行车,一个是按照城市来搜索自行车:
import org.springframework.data.mongodb.repository.MongoRepository; public interface BikeRepo extends MongoRepository<Bike, String> { public List<Bike> findByDeviceID(String deviceID); public List<Bike> findByCity(String city); }
7. 定义Cosmos DB的连接,运维Cosmos DB我们在创建配置的时候使用的是MongoDB接口,也就说连接Cosmos DB可以使用你以前的MongoDB程序而不用做任何修改,直接使用MongoDB的连接即可,使用我们在上一节创建CosmosDB之后得到的你的Java连接串替换以下代码中的连接串:
@Configuration public class MongoDBConfig { public @Bean MongoClient mongoClient() { return new MongoClient(new MongoClientURI("mongodb://mycosmos:PASSWORD@mycosmos.documents.azure.cn:10255/?ssl=true&replicaSet=globaldb")); } public @Bean MongoTemplate mongoTemplate() { return new MongoTemplate(mongoClient(), "bike"); } }
8. 最后,我们来实现使用Spring Boot和Spring MongoDB来访问CosmosDB的代码,我们首先定义两个测试数据bike1和bike2,插入数据进行保存,然后搜索所有数据,接着测试两个搜索:使用通过deviceID进行搜索,最后测试使用city进行搜索:
@SpringBootApplication public class DemoApplication implements CommandLineRunner{ @Autowired private BikeRepo repository; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Override public void run(String... args) throws Exception { repository.deleteAll(); Bike bike1= new Bike("bj001", "Gen2", "beijing", "China"); bike1.setLatitude(23.34); bike1.setLongitude(24.76); bike1.setUpdateDate(new Date()); Bike bike2= new Bike("sh001", "Gen3", "Shanghai", "China"); bike2.setLatitude(26.34); bike2.setLongitude(27.76); bike2.setUpdateDate(new Date()); //deploy new bicycles repository.save(bike1); repository.save(bike2); //find all bikes as demo System.out.println("Bicycles found with findAll():"); System.out.println("-------------------------------"); for (Bike bike : repository.findAll()) { System.out.println(bike); } System.out.println(); //find Bike by deviceID String deviceID = "sh001"; System.out.println("Found bikes with deviceID:" + deviceID); System.out.println("-------------------------------"); for (Bike bike : repository.findByDeviceID(deviceID)) { System.out.println(bike); } System.out.println(); //find Bike by city String city = "beijing"; System.out.println("Found bikes by city:" + city); System.out.println("-------------------------------"); for (Bike bike : repository.findByCity(city)) { System.out.println(bike); } System.out.println(); } }
8. 运行程序进行测试可以看到,使用标准的MongoDB接口,数据正确保存到了CosmosDB,并通过全部搜索,条件搜索都可以查询数据:
9.最后我们登录到管理界面,点击"数据资源管理器",选择Documents,可以看到我们刚才使用Spring插入的两条数据:
10. 最为方便的地方是Cosmos DB在图形化界面上直接提供了MongoDB shell和Mongo Query功能,方便于大家直接查询或者调试,例子如下:
使用Cosmos DB图形化的Mongo Query查询:
使用Cosmos DB图形化的Mongo Shell(预览阶段支持部分功能):
通过本示例可以看到,使用Cosmos DB的MongoDB模型数据服务:
- 和MongoDB完全兼容,不用修改程序
- PAAS服务,免维护,提供99.99%可用性
- 自定义吞吐量,吞吐量和数据存储大小不限
- 可定义的一致性级别
- 使用partition key的分区支持
下一节介绍Cosmos DB的全球分布特性以及数据访问。