功能說明
使用json檔案對mongo資料進行初始化,檔案保存目錄為 resources/mongo/,
json檔案規則及dao檔案規則
規則可根據實際需求更改代碼
1、配置json檔案在resources/mongo目錄 檔案需以_insert.json(Insert.json) 或 _update.json(Update.json)結尾
2、檔案命名格式如 新增檔案:test_action_insert.json,則對應的dao檔案名為 TestActionDao(TestActionRepository) ,dao檔案需繼承MongoRepository
3、更新邏輯:_insert.json:表中不存在資料則新增 _update.json:表中存在資料則更新,不存在則新增,資料根據id判斷 _update.json檔案資料最好設定主鍵
kotlin代碼:
這里放的是kotlin代碼,java的話與kotlin類似,可以照著樣子用java寫一遍
邏輯:一個json檔案對應一個dao,根據名稱來進行匹配,json檔案后綴名決定此json是更新或者新增,新增則需要判斷表中是否存在資料,
@Configuration
@ConditionalOnClass(value = [MongoRepository::class])
class InitMongoConfig {
/**
* 配置初始化mongo
*
* @param objectMapper ObjectMapper 序列化工具
* @param map Map<String, MongoRepository<*, *>>? 所有繼承MongoRepository的類
* @return AbstractRepositoryPopulatorFactoryBean? AbstractRepositoryPopulatorFactoryBean
*/
@Bean
fun repositoryPopulator(objectMapper: ObjectMapper, map: Map<String, MongoRepository<*, *>>?)
: AbstractRepositoryPopulatorFactoryBean {
// 沒有類
if (map == null) {
return Jackson2RepositoryPopulatorFactoryBean()
}
// 獲取所有mongo json檔案名
val paths = getMongoFilePath()
if (paths.isEmpty()) {
return Jackson2RepositoryPopulatorFactoryBean()
}
// 去除key后綴 testDao -> test
val repositories = removeSuffix(map)
// 所有需要更新的資源檔案
val resources = getClassPathResource(paths, repositories)
if (resources.isNotEmpty()) {
val factory = CustomJackson2RepositoryPopulatorFactoryBean()
factory.setMapper(objectMapper)
factory.setResources(resources.toTypedArray())
return factory
}
return Jackson2RepositoryPopulatorFactoryBean()
}
/**
* 獲取resources/mongo/ 下所有的json檔案名
* 可根據實際情況更改目錄規則
*
* @return List<String> json檔案名
*/
private fun getMongoFilePath(): List<String> {
val classPathResource = ClassPathResource("mongo")
if (!classPathResource.exists()) {
return Collections.emptyList()
}
val listFiles = classPathResource.file.listFiles()
return listFiles?.map {
if (it.name.contains(".json")) {
it.name
} else {
""
}
} ?: Collections.emptyList()
}
/**
* 去除后綴
* key: testDao -> test
*
* @param map Map<String, MongoRepository<*, *>> 所有繼承MongoRepository的map
* @return Map<String, MongoRepository<*, *>> key去除后綴的map
*/
private fun removeSuffix(map: Map<String, MongoRepository<*, *>>): Map<String, MongoRepository<*, *>> {
val repositories = mutableMapOf<String, MongoRepository<*, *>>()
// 去除repository的后綴名
map.forEach { (key, value) ->
val mapsKey = key.replace("Dao", "").replace("Repository", "")
repositories[mapsKey] = value
}
return repositories
}
/**
* 獲取所有需要更新的資源
* 1、資源檔案有對應的dao類
* 2、需要更新
*
* @param paths List<String>
* @param repositories Map<String, MongoRepository<*, *>>
* @return List<ClassPathResource>
*/
private fun getClassPathResource(paths: List<String>, repositories: Map<String, MongoRepository<*, *>>)
: List<ClassPathResource> {
// 所有需要更新的資源檔案
val resources = arrayListOf<ClassPathResource>()
// 檢查是否符合條件
paths.forEach {
// 下劃線轉駝峰 test_inset.json -> testInsert.json
val name = BeanUtils.lineToHump(it)
// 初始化新增檔案,為inset.json的檔案,若表中沒有資料則更新
if (name.endsWith("Insert.json")) {
val bean = repositories[name.replace("Insert.json", "")]
if (bean != null && bean.count() < 1) {
resources.add(ClassPathResource(String.format("mongo/%s", it)))
}
// 初始化更新檔案,為update.json的檔案,若表中有資料則更新,沒有則是新增
} else if (name.endsWith("Update.json")) {
val bean = repositories[name.replace("Update.json", "")]
if (bean != null) {
resources.add(ClassPathResource(String.format("mongo/%s", it)))
}
}
}
return resources
}
/**
* CustomJackson2ResourceReader
*/
class CustomJackson2ResourceReader : ResourceReader {
private val resourceReader: Jackson2ResourceReader = Jackson2ResourceReader()
override fun readFrom(resource: Resource, classLoader: ClassLoader?): Any {
val result: Any
result = try {
resourceReader.readFrom(resource, classLoader)
} catch (e: IOException) {
logger.warn("Can't read from resource", e)
return Collections.EMPTY_LIST
}
return result
}
companion object {
private val logger = LoggerFactory.getLogger(CustomJackson2ResourceReader::class.java)
}
}
/**
* CustomJackson2RepositoryPopulatorFactoryBean
*/
class CustomJackson2RepositoryPopulatorFactoryBean : Jackson2RepositoryPopulatorFactoryBean() {
override fun getResourceReader(): ResourceReader {
return CustomJackson2ResourceReader()
}
}
}
json檔案
user_insert.json
[
{
"_class": "com.test.pojo.po.UserPO",
"id": "132132123",
"name": "小明",
"age": "18"
}
]
必須指定 “_class” 物體類,id在新增時可不指定,指定之后框架會判斷這條記錄為更新操作,雖然會新增一條記錄,但是會影響@CreatedDate等標簽的使用
userPO
@Document("user")
data class UserPO(
/**
* 主鍵
*/
@Id
val id: Long,
/**
* 應用id
*/
val name: String,
/**
* 年齡
*/
val age: Int
}
UserDAO
interface UserDao : MongoRepository<UserPO, Long>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/378233.html
標籤:其他
