1. 程式人生 > >Activiti 5.17 與MyBatis資料訪問層關係分析

Activiti 5.17 與MyBatis資料訪問層關係分析

一、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的關係

各種實體管理類面向業務服務提供資料的訪問。