一、前提背景
实习的公司在做一个商业BI,甩给我一个需求,需要我支持mybatis语句输入。由于不敢大改前人的代码,只能自己在网上寻找解决方法。
一开始找到的是abel533大佬的SqlMapper工具Mybatis_Utils: Mybatis相关工具类 - Gitee.com
但是它固定了返回类是一个List<T>,和源代码获取ResultSet类相差甚远,然后我就根据网上的方法和gpt自己摸索出来。
二、mybatis的解析和运行原理
- 创建SqlSessionFactory
- 通过SqlSessionFactory创建SqlSession
- 通过sqlsession执行数据库操作
- 调用session.commit()提交事务
- 调用session.close()关闭会话
由于我的目的是转换成正常sql语句再接入到源代码里面执行,所以只需要进行到第二步创建sqlSession即可。
原本Mybatis 读取XML配置文件后会将内容放在一个Configuration类中,Configuration类会存在整个Mybatis生命周期,以便重复读取。SqlSessionFactoryBuilder会读取Configuration类中信息创建SqlSessionFactory。
但是我现在没有固定的XML文件,并且需要连接多个数据源,后端能获取到的就是jdbc连接。
查询资料后,发现只要能先获取jdbc连接的connection,就可以获取url、driverName、ClientInfo构造PoolDataSource连接池,再构造Environment -> Configuration,最后构造SqlSessionFactory。
再看abel533的SqlMapper工具解析
接下来就是SqlSessionFacto