一、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);
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的关系
各种实体管理类面向业务服务提供数据的访问。