Activiti 5.17 與MyBatis資料訪問層關係分析
阿新 • • 發佈:2019-01-05
一、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的關係
各種實體管理類面向業務服務提供資料的訪問。