一、Activiti 与 MyBatis 的关系
Activiti 5.17 使用 MyBatis 作为数据库访问层。
MyBatis自己有一个 DefaultSqlSessionFactory ,通过这个 DefaultSqlSessionFactory 对外提供数据库的连接和数据库的操作。
Activiti 本身也提供了一个 DbSqlSessionFactory ,并封装了 MyBatis 的 DefaultSqlSessionFactory 。
二、MyBatis的初始化
1、首先、Activiti 读取MyBatis的配置文件 org/activiti/db/mapping/mappings.xml
2、然后,构造MyBatis的上下文环境 environment
3、创建附加的数据库属性 propertis
4、构造 xmlConfigBuilder
5、最后,创建 Mybatis的 sqlSessionFactory .
InputStream inputStream = classLoader.getResourceAsStream("org/activiti/db/mapping/mappings.xml");
Environment environment = new Environment("default", transactionFactory, dataSource);
Reader reader = new InputStreamReader(inputStream);
Properties properties = new Properties();
properties.put("prefix", databaseTablePrefix);
if(databaseType != null) {
properties.put("limitBefore" , DbSqlSessionFactory.databaseSpecificLimitBeforeStatements.get(databaseType));
properties.put("limitAfter" , DbSqlSessionFactory.databaseSpecificLimitAfterStatements.get(databaseType));
properties.put("limitBetween" , DbSqlSessionFactory.databaseSpecificLimitBetweenStatements.get(databaseType));
properties.put("limitOuterJoinBetween" , DbSqlSessionFactory.databaseOuterJoinLimitBetweenStatements.get(databaseType));
properties.put("orderBy" , DbSqlSessionFactory.databaseSpecificOrderByStatements.get(databaseType));
properties.put("limitBeforeNativeQuery" , ObjectUtils.toString(DbSqlSessionFactory.databaseSpecificLimitBeforeNativeQueryStatements.get(databaseType)));
}
XMLConfigBuilder parser = new XMLConfigBuilder(reader,"", properties);
Configuration configuration = parser.getConfiguration();
configuration.setEnvironment(environment);
configuration.getTypeHandlerRegistry().register(VariableType.class, JdbcType.VARCHAR, new IbatisVariableTypeHandler());
configuration = parser.parse();
sqlSessionFactory = new DefaultSqlSessionFactory(configuration);
6、将MyBatis的sqlSessionFactory 赋给 Activiti 的dbSqlSessionFactory:
protected void initSessionFactories() {
if (sessionFactories==null) {
sessionFactories = new HashMap<Class<?>, SessionFactory>();
dbSqlSessionFactory = new DbSqlSessionFactory();
dbSqlSessionFactory.setDatabaseType(databaseType);
dbSqlSessionFactory.setIdGenerator(idGenerator);
dbSqlSessionFactory.setSqlSessionFactory(sqlSessionFactory);
dbSqlSessionFactory.setDbIdentityUsed(isDbIdentityUsed);
dbSqlSessionFactory.setDbHistoryUsed(isDbHistoryUsed);
dbSqlSessionFactory.setDatabaseTablePrefix(databaseTablePrefix);
dbSqlSessionFactory.setDatabaseSchema(databaseSchema);
addSessionFactory(dbSqlSessionFactory);
...
}
这些初始化的入口在 ProcessEngineConfigurationImpl 的 buildProcessEngine() 方法中的 init() 中开始。
三、Session的关系
MyBatis 通过 SessionFactory 获得 Session;
Activiti自己实现了一个 DbSqlSession,封装并依赖 MyBatis 的 session 完成对数据的操作。
四、Activiti实体管理类与Session的关系
各种实体管理类面向业务服务提供数据的访问。