当前位置: 首页 > news >正文

万网域名备案网站筑招建筑人才网长春安全员

万网域名备案网站,筑招建筑人才网长春安全员,如何自建网页,网站的做用#x1f3ae; 作者主页#xff1a;点击 #x1f381; 完整专栏和代码#xff1a;点击 #x1f3e1; 博客主页#xff1a;点击 文章目录 MapperRegistry 的作用核心字段解析整体工作流程addMapper方法MapperAnnotationBuilder#parse流程详解MapperAnnotationBuilder#parse… 作者主页点击 完整专栏和代码点击 博客主页点击 文章目录 MapperRegistry 的作用核心字段解析整体工作流程addMapper方法MapperAnnotationBuilder#parse流程详解MapperAnnotationBuilder#parseStatement处理主键生成策略KeyGenerator处理缓存、超时、ResultMap 等配置处理 ResultMap注册 MappedStatement MapperRegistry 的作用 MapperRegistry 是 MyBatis 核心组件之一主要负责管理 Mapper 接口的注册和获取。当通过 sqlSession.getMapper(XXXMapper.class) 获取 Mapper 实例时会通过 MapperRegistry 返回相应的 Mapper 代理对象。 核心字段解析 private final Configuration config; private final MapClass?, MapperProxyFactory? knownMappers new HashMap();• ConfigurationMyBatis 的全局配置对象管理 MyBatis 的各种配置信息。 • knownMappers用于存储已经注册的 Mapper 接口及其对应的 MapperProxyFactory。 整体工作流程 Mapper 注册 ◦ 通过 addMapper 方法注册 Mapper 接口将其与 MapperProxyFactory 绑定并解析注解或 XML 配置文件。Mapper 获取 ◦ 通过 getMapper 方法获取 Mapper 实例实际返回的是一个动态代理对象 (MapperProxy)。动态代理执行 ◦ 当调用 Mapper 方法时代理对象 (MapperProxy) 会拦截方法调用并根据方法上的注解或 XML 配置执行对应的 SQL 语句。 addMapper方法 MapperRegistry#addMapper 是 MyBatis 框架中的一个核心方法用于将 Mapper 接口注册到 MyBatis 环境中。这一过程确保 MyBatis 能够正确识别和管理 Mapper 接口以便在实际使用时生成相应的代理对象。 public T void addMapper(ClassT type) {// 判断是否是接口如果不是接口直接返回if (type.isInterface()) {if (hasMapper(type)) {// 防止重复注册如果已经注册过则抛出异常throw new BindingException(Type type is already known to the MapperRegistry.);}boolean loadCompleted false;try {// 添加到 knownMappers一个 MapClass?, MapperProxyFactory?中knownMappers.put(type, new MapperProxyFactory(type));// Its important that the type is added before the parser is run// otherwise the binding may automatically be attempted by the// mapper parser. If the type is already known, it wont try.// 检查该接口是否有与之关联的 XML 映射文件MapperAnnotationBuilder parser new MapperAnnotationBuilder(config, type);parser.parse();loadCompleted true;} finally {if (!loadCompleted) {knownMappers.remove(type);}}}}MapperAnnotationBuilder#parse流程详解 MapperRegistry#addMapper方法流程最后是将解析流程交给了MapperAnnotationBuilder#parse下面针对这个方法进行详细分析。 org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#parse 是 MyBatis 中用来解析 Mapper 接口中注解的方法它的作用是扫描并处理 Select, Insert, Update, Delete 等 SQL 操作注解生成对应的 MappedStatement 并将其注册到 Configuration 中。 public void parse() {String resource type.toString();// 检查资源是否已加载if (!configuration.isResourceLoaded(resource)) {// 解析加载mapper关联的XML文件信息如果是注解形式则为空loadXmlResource();configuration.addLoadedResource(resource);assistant.setCurrentNamespace(type.getName());// 解析缓存和缓存引用parseCache();parseCacheRef();// 获取当前 Mapper 接口中的所有方法for (Method method : type.getMethods()) {// 调用 canHaveStatement(method) 方法检查该方法是否适合生成 MappedStatementif (!canHaveStatement(method)) {continue;}// 处理Select和SelectProvider注解方法if (getAnnotationWrapper(method, false, Select.class, SelectProvider.class).isPresent() method.getAnnotation(ResultMap.class) null) {parseResultMap(method);}try {// 解析 Mapper 方法上的注解并生成 MappedStatementparseStatement(method);} catch (IncompleteElementException e) {configuration.addIncompleteMethod(new MethodResolver(this, method));}}}parsePendingMethods();}• 通过 configuration.isResourceLoaded(resource) 检查当前 Mapper 是否已经被加载过如果加载过则直接返回避免重复加载。如果没有加载过则将其标记为已加载。 • loadXmlResource用于加载 XML 资源即 Mapper.xml 文件并确保其与 Mapper 注解的接口绑定在一起。如果 Mapper.xml 存在则将其加载到 Configuration 中并将其中的 select, insert, update, delete 等语句转换为 MappedStatement。 • assistant.setCurrentNamespace(type.getName()) 的作用是将当前 Mapper 接口的全限定类名如 com.example.mapper.UserMapper设置为命名空间。MyBatis 中的命名空间是用于隔离不同 Mapper 的关键机制确保每个 MappedStatement 的 id 是唯一的避免冲突。 • canHaveStatement(Method method) 方法用于判断当前 Mapper 接口中的某个方法是否可以解析为 MyBatis 的 MappedStatement。这意味着只有符合条件的方法MyBatis 才会尝试为其生成对应的 SQL 映射语句MappedStatement。method.isBridge()排除桥接方法。method.isDefault() 用于检查该方法是否为 Java 8 引入的接口默认方法。 MapperAnnotationBuilder#parseStatement 这段代码是 org.apache.ibatis.builder.annotation.MapperAnnotationBuilder 类的一部分其作用是从 Mapper接口的方法通常标注有 Select、Insert、Update 或 Delete 注解的方法中提取信息并构建出 MappedStatement 对象用于 SQL 的执行。 以下是方法的总体思路 解析方法参数类型。获取方法所使用的语言驱动LanguageDriver。从注解中构建 SqlSource 和 SqlCommandType。解析主键生成策略。解析缓存、超时、结果集等配置。生成并注册 MappedStatement。 final Class? parameterTypeClass getParameterType(method); final LanguageDriver languageDriver getLanguageDriver(method);• getParameterType(method)获取方法的参数类型。如果方法有多个参数则 MyBatis 会将其封装为 Map 类型。 • getLanguageDriver(method)确定使用哪种语言驱动默认是 XMLLanguageDriver。语言驱动用于解析 SQL 语句可以是注解中的 SQL也可以是 XML 配置中的 SQL。 getAnnotationWrapper(method, true, statementAnnotationTypes).ifPresent(statementAnnotation - {final SqlSource sqlSource buildSqlSource(statementAnnotation.getAnnotation(), parameterTypeClass, languageDriver, method);final SqlCommandType sqlCommandType statementAnnotation.getSqlCommandType();private SqlSource buildSqlSource(Annotation annotation, Class? parameterType, LanguageDriver languageDriver,Method method) {if (annotation instanceof Select) {return buildSqlSourceFromStrings(((Select) annotation).value(), parameterType, languageDriver);} else if (annotation instanceof Update) {return buildSqlSourceFromStrings(((Update) annotation).value(), parameterType, languageDriver);} else if (annotation instanceof Insert) {return buildSqlSourceFromStrings(((Insert) annotation).value(), parameterType, languageDriver);} else if (annotation instanceof Delete) {return buildSqlSourceFromStrings(((Delete) annotation).value(), parameterType, languageDriver);} else if (annotation instanceof SelectKey) {return buildSqlSourceFromStrings(((SelectKey) annotation).statement(), parameterType, languageDriver);}return new ProviderSqlSource(assistant.getConfiguration(), annotation, type, method);}• getAnnotationWrapper()获取方法上的 SQL 注解如 Select、Insert 等。 • buildSqlSource()根据注解内容生成 SqlSource 对象SqlSource 用于封装 SQL 语句并处理占位符参数如 #{}。 • getSqlCommandType()确定 SQL 命令类型如 SELECT、INSERT、UPDATE、DELETE。 final Options options getAnnotationWrapper(method, false, Options.class).map(x - (Options)x.getAnnotation()).orElse(null); 它的作用是从 Mapper 方法中获取 Options 注解并将其解析为 Options 对象以便在后续配置 MappedStatement时使用。MyBatis 提供了 Options 注解用于配置 Mapper 方法的一些额外选项。常见的配置选项包括useCache是否启用二级缓存。timeoutSQL 执行超时时间。 处理主键生成策略KeyGenerator // 处理主键生成策略KeyGeneratorfinal KeyGenerator keyGenerator;String keyProperty null;String keyColumn null;if (SqlCommandType.INSERT.equals(sqlCommandType) || SqlCommandType.UPDATE.equals(sqlCommandType)) {// 如果方法上有 SelectKey 注解使用其生成主键SelectKey selectKey getAnnotationWrapper(method, false, SelectKey.class).map(x - (SelectKey)x.getAnnotation()).orElse(null);if (selectKey ! null) {keyGenerator handleSelectKeyAnnotation(selectKey, mappedStatementId, getParameterType(method), languageDriver);keyProperty selectKey.keyProperty();} else if (options null) {// 默认使用 JDBC3 的主键生成方式keyGenerator configuration.isUseGeneratedKeys() ? Jdbc3KeyGenerator.INSTANCE : NoKeyGenerator.INSTANCE;} else {keyGenerator options.useGeneratedKeys() ? Jdbc3KeyGenerator.INSTANCE : NoKeyGenerator.INSTANCE;keyProperty options.keyProperty();keyColumn options.keyColumn();}} else {keyGenerator NoKeyGenerator.INSTANCE;}• 如果 SqlCommandType 是 INSERT 或 UPDATE则可能需要生成主键。 • 优先使用 SelectKey 注解来生成主键如果没有则根据配置选择是否自动生成主键。 • keyProperty 和 keyColumn 用于指定主键映射。 处理缓存、超时、ResultMap 等配置 // 处理缓存、超时、ResultMap 等配置Integer fetchSize null;Integer timeout null;// statementType语句类型默认为 PREPARED还可以是 STATEMENT 或 CALLABLE。StatementType statementType StatementType.PREPARED;ResultSetType resultSetType configuration.getDefaultResultSetType();boolean isSelect sqlCommandType SqlCommandType.SELECT;boolean flushCache !isSelect;boolean useCache isSelect;if (options ! null) {// 从方法上的 Options 注解中提取配置如 flushCache、useCache、fetchSize 和 timeout。if (FlushCachePolicy.TRUE.equals(options.flushCache())) {flushCache true;} else if (FlushCachePolicy.FALSE.equals(options.flushCache())) {flushCache false;}useCache options.useCache();fetchSize options.fetchSize() -1 || options.fetchSize() Integer.MIN_VALUE ? options.fetchSize() : null; //issue #348timeout options.timeout() -1 ? options.timeout() : null;statementType options.statementType();if (options.resultSetType() ! ResultSetType.DEFAULT) {resultSetType options.resultSetType();}}处理 ResultMap // 处理 ResultMapString resultMapId null;if (isSelect) {// 如果方法是 SELECT 查询则可能需要 ResultMap 来映射结果集到 Java 对象。ResultMap resultMapAnnotation method.getAnnotation(ResultMap.class);if (resultMapAnnotation ! null) {// 优先使用 ResultMap 注解如果没有则自动生成 ResultMap。resultMapId String.join(,, resultMapAnnotation.value());} else {resultMapId generateResultMapName(method);}}注册 MappedStatement // 注册 MappedStatementassistant.addMappedStatement(mappedStatementId,sqlSource,statementType,sqlCommandType,fetchSize,timeout,// ParameterMapIDnull,parameterTypeClass,resultMapId,getReturnType(method),resultSetType,flushCache,useCache,// TODO gcode issue #577false,keyGenerator,keyProperty,keyColumn,statementAnnotation.getDatabaseId(),languageDriver,// ResultSetsoptions ! null ? nullOrEmpty(options.resultSets()) : null);• 调用 assistant.addMappedStatement() 将解析好的信息封装成 MappedStatement 并注册到 MyBatis 的 Configuration 中。 • MappedStatement 包含了执行 SQL 所需的所有信息包括 SQL 语句、参数类型、结果集映射、缓存策略等。
http://www.dnsts.com.cn/news/77014.html

相关文章:

  • 济宁网站建设seo模板网站能用吗
  • 站酷设计官方网站做网站源代码
  • 什么网站不能备案wordpress本地环境迁移步骤
  • 建设网站的4个根目录被删快速收录网站内页
  • 你去湖北省住房城乡建设厅网站查神箭手wordpress
  • 外贸网站建设网络公司网站建设开发 脚本语言
  • 河北省衡水市景县规划网站建行输了三次密码卡锁怎么解
  • 中国十大黄页网站排行榜帝国cms能建设视频网站吗
  • 门户网站建设好如何维护广告设计主要做哪些
  • 网站应用网站开发中国核工业第五建设有限公司校招
  • 如何做互联网网站微信二维码制作网站
  • 网站用ps如何做山东省乡镇网站建设
  • 教育网站前置审批找人做企业网站注意啥
  • 企业网站网站设计珠海网站制作费用
  • 怎么做查成绩网站友情链接是啥意思
  • 网站建设调查网站底部优化文字
  • 网站开发网站开发设计景安网络网站建设教程
  • 谷搜易外贸网站建设网站普查建设背景
  • 网页与网站设计wordpress模板怎么制作视频教程
  • 如何建设淘宝网站汕头门户网站建设
  • 网站转换小程序宝塔wordpress ssl证书
  • 做电影方面的网站怎么做酒店网站模板下载
  • 佘山网站建设免费印章在线制作
  • 工控网做网站维护吗html5 wordpress模板
  • iis 无法启动此网站公司做网站需要提供什么条件
  • 北京网站建设认知网站建设类外文翻译
  • 企业怎么做网站推广怎样建立个人的网站
  • 加强文明网站建设线上推广渠道有哪些方式
  • 网站底部背景博客建站系统
  • 个人网站模板 html5wordpress生成tags页面