入口
InputStream inputStream = Resources . getResourceAsStream ( "mybatis-config.xml" ) ;
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ( ) . build ( inputStream) ;
build方法
public SqlSessionFactory build ( InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder ( inputStream, environment, properties) ;
return build ( parser. parse ( ) ) ;
} catch ( Exception e) {
throw ExceptionFactory . wrapException ( "Error building SqlSession." , e) ;
} finally {
ErrorContext . instance ( ) . reset ( ) ;
try {
inputStream. close ( ) ;
} catch ( IOException e) {
}
}
}
public SqlSessionFactory build ( Configuration config) {
return new DefaultSqlSessionFactory ( config) ;
}
parse方法
public Configuration parse ( ) {
if ( parsed) {
throw new BuilderException ( "Each XMLConfigBuilder can only be used once." ) ;
}
parsed = true ;
parseConfiguration ( parser. evalNode ( "/configuration" ) ) ;
return configuration;
}
parseConfiguration方法
private void parseConfiguration ( XNode root) {
try {
propertiesElement ( root. evalNode ( "properties" ) ) ;
Properties settings = settingsAsProperties ( root. evalNode ( "settings" ) ) ;
loadCustomVfs ( settings) ;
loadCustomLogImpl ( settings) ;
typeAliasesElement ( root. evalNode ( "typeAliases" ) ) ;
pluginElement ( root. evalNode ( "plugins" ) ) ;
objectFactoryElement ( root. evalNode ( "objectFactory" ) ) ;
objectWrapperFactoryElement ( root. evalNode ( "objectWrapperFactory" ) ) ;
reflectorFactoryElement ( root. evalNode ( "reflectorFactory" ) ) ;
settingsElement ( settings) ;
environmentsElement ( root. evalNode ( "environments" ) ) ;
databaseIdProviderElement ( root. evalNode ( "databaseIdProvider" ) ) ;
typeHandlerElement ( root. evalNode ( "typeHandlers" ) ) ;
mapperElement ( root. evalNode ( "mappers" ) ) ;
} catch ( Exception e) {
throw new BuilderException ( "Error parsing SQL Mapper Configuration. Cause: " + e, e) ;
}
}
Properties标签
private Properties settingsAsProperties ( XNode context) {
if ( context == null ) {
return new Properties ( ) ;
}
Properties props = context. getChildrenAsProperties ( ) ;
MetaClass metaConfig = MetaClass . forClass ( Configuration . class , localReflectorFactory) ;
for ( Object key : props. keySet ( ) ) {
if ( ! metaConfig. hasSetter ( String . valueOf ( key) ) ) {
throw new BuilderException ( "The setting " + key + " is not known. Make sure you spelled it correctly (case sensitive)." ) ;
}
}
return props;
}
typeAliases标签
private void typeAliasesElement ( XNode parent) {
if ( parent != null ) {
for ( XNode child : parent. getChildren ( ) ) {
if ( "package" . equals ( child. getName ( ) ) ) {
String typeAliasPackage = child. getStringAttribute ( "name" ) ;
configuration. getTypeAliasRegistry ( ) . registerAliases ( typeAliasPackage) ;
} else {
String alias = child. getStringAttribute ( "alias" ) ;
String type = child. getStringAttribute ( "type" ) ;
try {
Class < ? > clazz = Resources . classForName ( type) ;
if ( alias == null ) {
typeAliasRegistry. registerAlias ( clazz) ;
} else {
typeAliasRegistry. registerAlias ( alias, clazz) ;
}
} catch ( ClassNotFoundException e) {
throw new BuilderException ( "Error registering typeAlias for '" + alias + "'. Cause: " + e, e) ;
}
}
}
}
}
plugin标签
private void pluginElement ( XNode parent) throws Exception {
if ( parent != null ) {
for ( XNode child : parent. getChildren ( ) ) {
String interceptor = child. getStringAttribute ( "interceptor" ) ;
Properties properties = child. getChildrenAsProperties ( ) ;
Interceptor interceptorInstance = ( Interceptor ) resolveClass ( interceptor) . newInstance ( ) ;
interceptorInstance. setProperties ( properties) ;
configuration. addInterceptor ( interceptorInstance) ;
}
}
}
objectFactory标签
private void objectFactoryElement ( XNode context) throws Exception {
if ( context != null ) {
String type = context. getStringAttribute ( "type" ) ;
Properties properties = context. getChildrenAsProperties ( ) ;
ObjectFactory factory = ( ObjectFactory ) resolveClass ( type) . newInstance ( ) ;
factory. setProperties ( properties) ;
configuration. setObjectFactory ( factory) ;
}
}
environments标签
private void environmentsElement ( XNode context) throws Exception {
if ( context != null ) {
if ( environment == null ) {
environment = context. getStringAttribute ( "default" ) ;
}
for ( XNode child : context. getChildren ( ) ) {
String id = child. getStringAttribute ( "id" ) ;
if ( isSpecifiedEnvironment ( id) ) {
TransactionFactory txFactory = transactionManagerElement ( child. evalNode ( "transactionManager" ) ) ;
DataSourceFactory dsFactory = dataSourceElement ( child. evalNode ( "dataSource" ) ) ;
DataSource dataSource = dsFactory. getDataSource ( ) ;
Environment. Builder environmentBuilder = new Environment. Builder ( id)
. transactionFactory ( txFactory)
. dataSource ( dataSource) ;
configuration. setEnvironment ( environmentBuilder. build ( ) ) ;
}
}
}
}
private void databaseIdProviderElement ( XNode context) throws Exception {
DatabaseIdProvider databaseIdProvider = null ;
if ( context != null ) {
String type = context. getStringAttribute ( "type" ) ;
if ( "VENDOR" . equals ( type) ) {
type = "DB_VENDOR" ;
}
Properties properties = context. getChildrenAsProperties ( ) ;
databaseIdProvider = ( DatabaseIdProvider ) resolveClass ( type) . newInstance ( ) ;
databaseIdProvider. setProperties ( properties) ;
}
Environment environment = configuration. getEnvironment ( ) ;
if ( environment != null && databaseIdProvider != null ) {
String databaseId = databaseIdProvider. getDatabaseId ( environment. getDataSource ( ) ) ;
configuration. setDatabaseId ( databaseId) ;
}
}
private TransactionFactory transactionManagerElement ( XNode context) throws Exception {
if ( context != null ) {
String type = context. getStringAttribute ( "type" ) ;
Properties props = context. getChildrenAsProperties ( ) ;
TransactionFactory factory = ( TransactionFactory ) resolveClass ( type) . newInstance ( ) ;
factory. setProperties ( props) ;
return factory;
}
throw new BuilderException ( "Environment declaration requires a TransactionFactory." ) ;
}
private DataSourceFactory dataSourceElement ( XNode context) throws Exception {
if ( context != null ) {
String type = context. getStringAttribute ( "type" ) ;
Properties props = context. getChildrenAsProperties ( ) ;
DataSourceFactory factory = ( DataSourceFactory ) resolveClass ( type) . newInstance ( ) ;
factory. setProperties ( props) ;
return factory;
}
throw new BuilderException ( "Environment declaration requires a DataSourceFactory." ) ;
}
typeHandlers标签
private void typeHandlerElement ( XNode parent) {
if ( parent != null ) {
for ( XNode child : parent. getChildren ( ) ) {
if ( "package" . equals ( child. getName ( ) ) ) {
String typeHandlerPackage = child. getStringAttribute ( "name" ) ;
typeHandlerRegistry. register ( typeHandlerPackage) ;
} else {
String javaTypeName = child. getStringAttribute ( "javaType" ) ;
String jdbcTypeName = child. getStringAttribute ( "jdbcType" ) ;
String handlerTypeName = child. getStringAttribute ( "handler" ) ;
Class < ? > javaTypeClass = resolveClass ( javaTypeName) ;
JdbcType jdbcType = resolveJdbcType ( jdbcTypeName) ;
Class < ? > typeHandlerClass = resolveClass ( handlerTypeName) ;
if ( javaTypeClass != null ) {
if ( jdbcType == null ) {
typeHandlerRegistry. register ( javaTypeClass, typeHandlerClass) ;
} else {
typeHandlerRegistry. register ( javaTypeClass, jdbcType, typeHandlerClass) ;
}
} else {
typeHandlerRegistry. register ( typeHandlerClass) ;
}
}
}
}
}
mappers标签
private void mapperElement ( XNode parent) throws Exception {
if ( parent != null ) {
for ( XNode child : parent. getChildren ( ) ) {
if ( "package" . equals ( child. getName ( ) ) ) {
String mapperPackage = child. getStringAttribute ( "name" ) ;
configuration. addMappers ( mapperPackage) ;
} else {
String resource = child. getStringAttribute ( "resource" ) ;
String url = child. getStringAttribute ( "url" ) ;
String mapperClass = child. getStringAttribute ( "class" ) ;
if ( resource != null && url == null && mapperClass == null ) {
ErrorContext . instance ( ) . resource ( resource) ;
InputStream inputStream = Resources . getResourceAsStream ( resource) ;
XMLMapperBuilder mapperParser = new XMLMapperBuilder ( inputStream, configuration, resource, configuration. getSqlFragments ( ) ) ;
mapperParser. parse ( ) ;
} else if ( resource == null && url != null && mapperClass == null ) {
ErrorContext . instance ( ) . resource ( url) ;
InputStream inputStream = Resources . getUrlAsStream ( url) ;
XMLMapperBuilder mapperParser = new XMLMapperBuilder ( inputStream, configuration, url, configuration. getSqlFragments ( ) ) ;
mapperParser. parse ( ) ;
} else if ( resource == null && url == null && mapperClass != null ) {
Class < ? > mapperInterface = Resources . classForName ( mapperClass) ;
configuration. addMapper ( mapperInterface) ;
} else {
throw new BuilderException ( "A mapper element may only specify a url, resource or class, but not more than one." ) ;
}
}
}
}
}