
jchanghong.database.DBHelper.kt Maven / Gradle / Ivy
package jchanghong.database
import cn.hutool.core.util.ClassUtil
import cn.hutool.db.DbUtil
import com.baomidou.mybatisplus.autoconfigure.SpringBootVFS
import com.baomidou.mybatisplus.core.MybatisConfiguration
import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean
import jchanghong.autoconfig.db.mybatis.MybatisPlusConfig
import jchanghong.io.IOHelper
import org.apache.ibatis.plugin.Interceptor
import org.apache.ibatis.session.ExecutorType
import org.apache.ibatis.session.SqlSessionFactory
import org.mybatis.spring.SqlSessionTemplate
import org.mybatis.spring.mapper.MapperScannerConfigurer
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import javax.sql.DataSource
fun main() {
val array = ClassUtil.scanPackageBySuper("jchanghong.autoconfig.db.mybatis", Interceptor::class.java)
.map { it.newInstance() as? Interceptor }.toTypedArray()
val db = DbUtil.use()
val sqlSessionTemplate: SqlSessionTemplate? = null;
val list = sqlSessionTemplate!!.selectList("")
// sqlSessionTemplate.
}
object DBHelper {
private val interceptPackages = "jchanghong.autoconfig.db.mybatis"
private val logger: Logger = LoggerFactory.getLogger(this::class.java)
// datasource to mapper 集合
private val mybatisTemplateMap = HashMap()
private val mybatisFatoryMap = HashMap()
const val DRIVER_CLASS_ORACLE = "oracle.jdbc.driver.OracleDriver"
const val DRIVER_CLASS_POSTGRES = "org.postgresql.Driver"
/** 包名可以为null scan mapper*/
@JvmOverloads
fun getMybatisSqlSessionTemplate(
dataSource: DataSource, mapperInterfacePackage: String? = null,
mapperXMLLocations: String? = null, executorType: ExecutorType = ExecutorType.SIMPLE
): SqlSessionTemplate {
val key = dataSource::class.qualifiedName.toString() + dataSource.toString()
val sqlSessionTemplate = mybatisTemplateMap[key]
if (sqlSessionTemplate != null) return sqlSessionTemplate
val template = SqlSessionTemplate(
getMybatisSqlSessionFactory(dataSource, mapperInterfacePackage, mapperXMLLocations),
executorType
)
mybatisTemplateMap[key] = template
return template
}
/** 包名可以为null scan mapper*/
@JvmOverloads
fun getMybatisSqlSessionFactory(
dataSource: DataSource, mapperInterfacePackage: String? = null,
mapperXMLLocations: String? = null
): SqlSessionFactory {
val key = dataSource::class.qualifiedName.toString() + dataSource.toString()
val sessionFactory = mybatisFatoryMap[key]
if (sessionFactory != null) return sessionFactory
logger.info("开始建立mybatisSqlSessionFactory")
// TODO 使用 MybatisSqlSessionFactoryBean 而不是 SqlSessionFactoryBean
val factory = MybatisSqlSessionFactoryBean()
val configuration = MybatisConfiguration()
factory.configuration = configuration
factory.setDataSource(dataSource)
factory.vfs = SpringBootVFS::class.java
val list = ClassUtil.scanPackageBySuper(interceptPackages, Interceptor::class.java)
.mapNotNull { it.newInstance() as? Interceptor }
factory.setPlugins(*list.toTypedArray()
,MybatisPlusConfig.paginationInterceptor())
// if (StringUtils.hasLength(typeAliasesPackage)) {
// factory.setTypeAliasesPackage(typeAliasesPackage)
// }
factory.setTypeHandlersPackage(interceptPackages)
if (!mapperXMLLocations.isNullOrBlank()) {
IOHelper.resolveMapperLocations(mapperXMLLocations)?.let {
factory.setMapperLocations(*it)
}
}
// TODO 此处必为非 NULL
val globalConfig = GlobalConfigUtils.defaults()
// TODO 注入填充器
// globalConfig.metaObjectHandler = null
// TODO 注入主键生成器
// globalConfig.dbConfig.keyGenerator = null
// TODO 注入sql注入器
// globalConfig.sqlInjector = null
// TODO 注入ID生成器
// globalConfig.identifierGenerator = null
// TODO 设置 GlobalConfig 到 MybatisSqlSessionFactoryBean
factory.setGlobalConfig(globalConfig)
if (!mapperInterfacePackage.isNullOrBlank()) {
configuration.mapperRegistry.addMappers(mapperInterfacePackage)
}
val sqlSessionFactory = factory.getObject()
mybatisFatoryMap[key] = sqlSessionFactory!!
logger.info("建立 mybatisSqlSessionFactory完成 $dataSource")
return sqlSessionFactory
}
@JvmOverloads
fun getMybatisMapper(
type: Class,
dataSource: DataSource,
executorType: ExecutorType = ExecutorType.SIMPLE
): T {
val sessionTemplate = getMybatisSqlSessionTemplate(dataSource, executorType = executorType)
sessionTemplate.configuration.mapperRegistry
.addMapper(type)
return sessionTemplate.getMapper(type)
}
fun newMapperScannerConfigurer(basePackage: String, SqlSessionFactoryBeanName: String): MapperScannerConfigurer {
val configurer = MapperScannerConfigurer()
configurer.setBasePackage(basePackage)
configurer.setSqlSessionFactoryBeanName(SqlSessionFactoryBeanName)
return configurer
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy