使用SpringBoot来连接MongoDB
我在公司有机会使用MongoDB和SpringBoot,并为了学习而创建了简单的演示代码。
我们公司主要的服务器没有使用框架,所以我创建了这个资料用于与公司内部使用框架的代码进行比较。
希望这个代码可以传达出在SpringBoot中处理MongoDB的感觉。
首先,这是在应用程序启动时调用的Application类。
@SpringBootApplication
@EnableMongoRepositories
class MyApplication @Autowired constructor(val groceryItemsDao: GroceryItemsDao, val usersDao: UsersDao): CommandLineRunner {
companion object {
@JvmStatic
fun main(args: Array<String>) {
runApplication<MyApplication>(*args)
}
}
override fun run(vararg args: String?) {
groceryItemsDao.insertItem(GroceryItem("Whole Wheat Biscuit", "Whole Wheat Biscuit", 5, "snacks"))
usersDao.insertUser(User("Suzuki"))
}
}
Spring Boot内置了DI功能,您可以声明以下类似的接口,并自动注入实现了该接口的类。
- interfaceで使いたい関数を宣言する
interface GroceryItemsDao {
fun findItemByName(name: String): GroceryItem?
fun insertItem(groceryItem: GroceryItem)
}
interface UsersDao {
fun insertUser(user: User)
}
- 上のinterfaceを実装したクラスがフレームワーク側で自動的にinsertされる
@Component
class GroceryItemsDaoImpl @Autowired constructor(
@Qualifier("myGroceryListTemplate")
val template: MongoTemplate,
): GroceryItemsDao {
private val model = GroceryItem::class.java
override fun findItemByName(name: String): GroceryItem? {
val query = Query(Criteria.where(GroceryItem.KEY.NAME).`is`(name))
return template.find(query, model).first()
}
override fun insertItem(groceryItem: GroceryItem) {
try {
template.insert(groceryItem)
} catch (me: MongoException) {
println("Unable to insert due to an error: $me")
}
}
}
@Component
class UsersDaoImpl @Autowired constructor(@Qualifier("userTemplate") val template: MongoTemplate): UsersDao {
private val model = User::class.java
override fun insertUser(user: User) {
template.insert(user)
}
}
本次我们将GroceryItemsDao和UsersDao分别作为属于不同数据库集合的Dao。
我们将创建一个名为Config的类以实现连接到多个数据库的功能。
@Configuration
class MongoConfig( @Value("\${spring.data.mongodb.uri}") private val connectionString: String) {
@Bean
fun mongoClient(): MongoClient {
val connectionString = ConnectionString(connectionString)
val settings = MongoClientSettings.builder().applyConnectionString(connectionString)
.serverApi(ServerApi.builder().version(ServerApiVersion.V1).build()).build()
return MongoClients.create(settings)
}
@Bean
fun userTemplate(): MongoTemplate {
return MongoTemplate(mongoClient(), "user")
}
@Bean
fun myGroceryListTemplate(): MongoTemplate {
return MongoTemplate(mongoClient(), "grocery")
}
}
spring.data.mongodb.uri=mongodb+srv://admin:☓☓☓☓☓☓☓☓@cluster0.☓☓☓☓☓☓.mongodb.net/?retryWrites=true&w=majority
spring.autoconfigure.exclude= org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration
userTemplate()提供用于操作”user”数据库的Template,myGroceryListTemplate()提供用于操作”grocery”数据库的Template。Dao是针对哪个集合的Model类中记录的。
@Document("groceryItem")
data class GroceryItem(
val title: String,
val name: String,
val quantity: Int,
val category: String?,
@Id
val id: ObjectId = ObjectId()
) {
object KEY {
val ID = GroceryItem::id.name
val TITLE = GroceryItem::title.name
val NAME = GroceryItem::name.name
val QUANTITY = GroceryItem::quantity.name
val CATEGORY = GroceryItem::category.name
}
}
@Document("user")
data class User(
val name: String,
@Id
val id: ObjectId = ObjectId(),
) {
object KEY {
val ID = User::id.name
val NAME = User::name.name
}
}
创建RestAPI时,请参照以下内容进行描述和创建。
@RestController
@RequestMapping("/user")
class UserController @Autowired constructor(val usersDao: UsersDao) {
@PostMapping("/insert")
fun insertUser(@RequestBody user: User) {
usersDao.insertUser(user)
}
}
通过使用注解和DI功能,我们发现可以轻松地创建服务器。