使用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功能,我们发现可以轻松地创建服务器。

广告
将在 10 秒后关闭
bannerAds