以Mybatis的Configuration的核心字段,进行总结
/** * @author Clinton Begin */ public class Configuration { // 核心:环境(特指数据源环境,同一个Mybatis中,可以存在多个环境) // 来源:如mybatis-config.xml中<environments>下,多个<environment>节点信息 // 去向:DefaultSqlSessionFactory中提供数据源(DataSource)、AbstractBaseExecutor中提供数据源区分标识等 protected Environment environment; // Mybatis的开关配置 // 如cacheEnabled决定是否采用一级缓存(详见MybatisConfiguration#newExecutor) protected boolean safeRowBoundsEnabled; protected boolean safeResultHandlerEnabled = true; protected boolean mapUnderscoreToCamelCase; protected boolean aggressiveLazyLoading; protected boolean multipleResultSetsEnabled = true; protected boolean useGeneratedKeys; protected boolean useColumnLabel = true; protected boolean cacheEnabled = true; protected boolean callSettersOnNulls; protected boolean useActualParamName = true; protected boolean returnInstanceForEmptyRow; protected boolean shrinkWhitespacesInSql; // 操作日志前缀 protected String logPrefix; protected Class<? extends Log> logImpl; protected Class<? extends VFS> vfsImpl; protected Class<?> defaultSqlProviderType; protected LocalCacheScope localCacheScope = LocalCacheScope.SESSION; protected JdbcType jdbcTypeForNull = JdbcType.OTHER; protected Set<String> lazyLoadTriggerMethods = new HashSet<>(Arrays.asList("equals", "clone", "hashCode", "toString")); protected Integer defaultStatementTimeout; protected Integer defaultFetchSize; protected ResultSetType defaultResultSetType; // Mybatis默认执行器类型(SIMPLE, REUSE, BATCH三种类型,详见newExecutor()) protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE; // Mybatis自动映射行为(NONE、PARTIAL(不对嵌套结果类型进行映射)、FULL三种类型) protected AutoMappingBehavior autoMappingBehavior = AutoMappingBehavior.PARTIAL; // Mybatis对未识别对Column&type,进行对映射行为 protected AutoMappingUnknownColumnBehavior autoMappingUnknownColumnBehavior = AutoMappingUnknownColumnBehavior.NONE; // 配置中变量列表。如mybatis-config.xml中<properties>节点信息 // 来源:XMLConfigBuilder.propertiesElement()解析获取 // 去向:作为Mybatis的配置项,如username、password等 protected Properties variables = new Properties(); // 默认反射工厂。详见反射模块部分 protected ReflectorFactory reflectorFactory = new DefaultReflectorFactory(); // 默认对象构建工厂。详见反射模块部分 protected ObjectFactory objectFactory = new DefaultObjectFactory(); protected ObjectWrapperFactory objectWrapperFactory = new DefaultObjectWrapperFactory(); protected boolean lazyLoadingEnabled = false; protected ProxyFactory proxyFactory = new JavassistProxyFactory(); protected String databaseId; protected Class<?> configurationFactory; // 核心:Mapper方法的管理容器。详见Binding模块 // 来源:XMLConfigBuilder#mapperElement(针对xml配置)、XMLMapperBuilder#bindMapperForNamespace(针对xml配置)=》Configuration#addMapper // 去向:SqlSessionManager#getMapper、DefaultSqlSession#getMapper =》Configuration#getMapper protected final MapperRegistry mapperRegistry = new MapperRegistry(this); // Mybatis插件实现,所依赖的责任链(暂不深入) protected final InterceptorChain interceptorChain = new InterceptorChain(); // 核心:Mybatis类型处理器管理容器。详见类型模块 // 来源:TypeHandlerRegistry#TypeHandlerRegistry =》 Configuration(默认类型注册)、TypeHandlerRegistry#register =》 XMLConfigBuilder#typeHandlerElement(自定义类型) // 去向:DefaultParameterHandler#setParameters(形参注入)、DefaultResultSetHandler#prepareSimpleKeyParameter(返回结果的类型处理) protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry(this); // Mybatis别名的管理容器 protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry(); protected final LanguageDriverRegistry languageRegistry = new LanguageDriverRegistry(); // 核心:唯一标识与对应MappedStatement的映射 // 来源:MapperAnnotationBuilder#handleSelectKeyAnnotation / XMLStatementBuilder#parseStatementNode =》 MapperBuilderAssistant#addMappedStatement =》 Configuration#addMappedStatement // 去向:DefaultResultSetHandler#getNestedQueryConstructorValue / DefaultSqlSession#selectList / MapperMethod.SqlCommand#resolveMappedStatement =》 Configuration#getMappedStatement // 注:唯一标识:可能包含namespace、前缀、自定mapperId(xml)/(typeName+methodName)(注解) // 注:MappedStatement与Sql语句,是1:1关系(MappedStatement -> SqlSource -> BoundSql -> String sql)。所以,MappedStatement是针对接口方法的。 protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection") .conflictMessageProducer((savedValue, targetValue) -> ". please check " + savedValue.getResource() + " and " + targetValue.getResource()); // 重要:缓存映射表,进行命名空间与其下对应缓存的映射 // 来源:MapperAnnotationBuilder#parseCache / XMLMapperBuilder#cacheElement =》 MapperBuilderAssistant#useNewCache =》 Configuration#addCache // 去向:XMLMapperBuilder#parsePendingCacheRefs =》 CacheRefResolver#resolveCacheRef =》 MapperBuilderAssistant#useCacheRef =》 Configuration#getCache(其中有关Incomplete,不用关注) protected final Map<String, Cache> caches = new StrictMap<>("Caches collection"); // 核心:唯一标识和对应ResultMap的映射(类似于上面的mappedStatements) // 来源&去向:类比上文mappedStatements。 // 注:mappedStatements关联Sql语句映射,resultMaps关联结果集映射 protected final Map<String, ResultMap> resultMaps = new StrictMap<>("Result Maps collection"); // 核心:唯一标识和对应ParameterMap的映射(类似于上面的mappedStatements) // 来源:XMLMapperBuilder#parameterMapElement =》 MapperBuilderAssistant#addParameterMap =》 Configuration#addParameterMap // 去向:MapperBuilderAssistant#getStatementParameterMap =》 Configuration#getParameterMap // 注:mappedStatements关联Sql语句映射,resultMaps关联结果集映射,ParameterMap关联参数集映射 protected final Map<String, ParameterMap> parameterMaps = new StrictMap<>("Parameter Maps collection"); // 重要:唯一标识和对应KeyGenerator的映射(类似于上面的mappedStatements) protected final Map<String, KeyGenerator> keyGenerators = new StrictMap<>("Key Generators collection"); protected final Set<String> loadedResources = new HashSet<>(); protected final Map<String, XNode> sqlFragments = new StrictMap<>("XML fragments parsed from previous mappers"); protected final Collection<XMLStatementBuilder> incompleteStatements = new LinkedList<>(); protected final Collection<CacheRefResolver> incompleteCacheRefs = new LinkedList<>(); protected final Collection<ResultMapResolver> incompleteResultMaps = new LinkedList<>(); protected final Collection<MethodResolver> incompleteMethods = new LinkedList<>(); protected final Map<String, String> cacheRefMap = new HashMap<>(); } 四、Mybatis-Plus 1.简介 a.介绍 b.架构 c.特性:无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
2.实现