Mybatis的初始化

Mybatis

最近接了一个需求,就是要把上传的Excel中的数据导入到数据库的某张表中。咋看这是一个比较简单的需求,但是这张表有可能在A、B、C等等数据库上,这个是通过配置来获取的。由于该系统的其他的业务运行时只需要A数据库,只有解析Excel数据的时候会涉及到其他的数据库,所以在application中只配置A数据库,其他数据库只在需要的时候创建连接。

代码如下:

 

由于数据库的不确定性,所以我不能在项目对每个excel对应的表都创建一个mapper.xml。于是便想通过sqlSession结合mybatis、反射技术去实现,接着便入了一个大坑。

刚开始看到这串代码的感觉如获至宝,心里想着把sqlSession创建出来然后把sqlStatement传进去不就完美解决这个事情了嘛,当然现实是非常残酷的。

 

Mybatis初始化流程(spring-boot)

应用程序初始化的时候首先扫描到MybatisAutoConfiguration此类。

通过类名上面condition注解,初始化DataSource,sqlSession和mybatiProperties信息。

在实例化sqlSeesionFactory的时候,把application里面关于mapper的配置都加载到了其中。接着调用SqlSessionFactoryBean.getObject方法去真正的创建出一个SqlSessionFactory出来。

该方法的作用有初始化mapper.xml中的别名信息。typeAlias即类型别名,我们在使用mybatis时经常会设置并使用这一功能,如在编写XML映射SQL语句中的parameterType,resultType属性时,我们会直接使用String,而不是java.lang.String,帮助我们完成这一简化过程的就是TypeAliasRegistry类。

当然最最重要的是xmlConfigBuilder.parse这段代码。这里会对Configuration类里面的属性进行创建。涉及到mybatis的配置(例如延迟加载、缓存、主键信息等等),运行环境、数据库、事务管理器,objectFactory,ObjectWrapperFactory,ProxyFactory,mapper.xml信息。MappedStatement信息(这个十分重要,执行SQL就是从这个对象中获取到要执行的SQL语句)。 把Configuration创建好之后便调用DefaultSqlSessionFactory的构造方法,实例化一个SqlSessionFactory对象 出来,并且创建一个临时的SqlSesion对象来测试创建出来的SqlSessionFactory对象是否有效。

验证通过后mybatis的创建便完成了。

我的这个之所以不能通过sqlSession结合mybatis、反射技术去实现。就是因为我在excel上传的时候,读到待插入的数据库信息后,无法去创建一个Configuration对象(有可能做到对里面的mapper,DataSource等信息做到修改和添加,就算能够做到也面临着需要加载的东西过重的问题),便导致了这个思路的无疾而终。

最终方案:在Excel上传的时候初始化SqlSessionFactoty(静态map中存在则不创建),然后采用原生的JDBC调用方式去对数据库进行增删改查。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值