Activiti 5.17 与MyBatis数据访问层关系分析


一、Activiti 与 MyBatis 的关系


Activiti 5.17 使用 MyBatis 作为数据库访问层。

MyBatis自己有一个 DefaultSqlSessionFactory ,通过这个 DefaultSqlSessionFactory 对外提供数据库的连接和数据库的操作。

Activiti 本身也提供了一个 DbSqlSessionFactory ,并封装了 MyBatis 的 DefaultSqlSessionFactory 。


Activiti 5.17 与MyBatis数据访问层关系分析_第1张图片


二、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 5.17 与MyBatis数据访问层关系分析_第2张图片


四、Activiti实体管理类与Session的关系


各种实体管理类面向业务服务提供数据的访问。


Activiti 5.17 与MyBatis数据访问层关系分析_第3张图片



你可能感兴趣的:(Activiti,bpmn)