1.Mybatis源码剖析(懒加载原理)
2.SpringBoot系列 Mybatis 码详之自定义类型转换 TypeHandler
3.MyBatis-Plusä¸å¦ä½ä½¿ç¨ResultMap
4.Java培训班都需要学什么
5.MyBatis 源码解析:映射文件的加载与解析(上)
Mybatis源码剖析(懒加载原理)
懒加载,即按需加载,码详旨在优化查询性能。码详以一个包含订单列表的码详User对象为例,当仅获取用户信息时,码详若启用懒加载模式,码详安徽卫视源码电视执行SQL不会查询订单列表。码详需获取订单列表时,码详才会发起数据库查询。码详实现方式包括在核心配置文件中设置或在相关映射文件中通过fetchType属性配置懒加载策略。码详
懒加载的码详配置如何加载到项目中呢?首先,这些配置保存在全局Configuration对象中,码详通常在解析核心配置文件的码详代码中实现。在settingsElement方法中,码详懒加载配置被保存在lazyLoadingEnabled属性中。码详对于resultMap标签中collection | association的fetchType属性,其配置通过解析mappers标签下的resultMap标签实现,最终调用buildResultMappingFromContext方法处理子标签。该方法结合全局配置判断是否需要执行懒加载。
懒加载的苹果指标源码实现原理涉及动态代理。当调用代理对象的延迟加载属性方法时,如访问a.getB().getName(),代理对象会调用拦截器方法。若发现需要延迟加载,代理对象会单独发送SQL查询关联对象,加载数据后设置属性值,完成方法调用。简而言之,懒加载通过动态代理实现,拦截指定方法并执行数据加载。
深入剖析懒加载源码,会发现它涉及查询和数据处理的多步操作。查询完成后,结果集处理、列值获取、判断是否进行懒加载等步骤共同构建懒加载机制。动态代理在访问对象属性时触发,最终通过Javassist库创建代理对象,实现懒加载逻辑。spring源码公式当访问如userList2.get(0).getOrderList()时,若满足条件,代理对象会调用懒加载查询方法获取数据。判断懒加载条件的关键在于结果集处理阶段,通过访问映射关系和查询映射值来确定是否执行后续懒加载查询。
综上所述,Mybatis的懒加载机制通过动态代理和结果集处理实现,旨在优化性能,按需加载数据,提高查询效率。通过核心配置和映射文件中的配置,懒加载逻辑被加载到项目中,为开发者提供灵活的加载策略。
SpringBoot系列 Mybatis 之自定义类型转换 TypeHandler
在使用 Mybatis 进行数据库操作时,我们常常遇到将数据库字段映射至 Java Bean 的需求。通常,我们通过 ResultMap 标签实现这一过程,指定两者之间的绑定关系。然而,大厂源码资料当 Java Bean 中的字段类型与数据库中不同,如数据库为 timestamp 而 Java Bean 中定义为 long 时,应该如何处理呢?本文将深入探讨 Mybatis 中的自定义类型转换 TypeHandler,以解决这一问题。
### 环境准备
本例采用 MySQL 作为数据库实例。首先,需创建一张包含 timestamp 类型字段的表。
接着,使用 SpringBoot 2.2.1.RELEASE、maven 3.5.3 和 IDEA 进行项目开发。以下为相关依赖配置及 application.yml 配置信息。
### 实例演示
在实体类(Entity)中定义字段时,确保与数据库表字段类型保持一致。例如,使用 timestamp 类型。
定义 Mapper 接口时,使用注解方式实现简单的查询接口。需要注意的是,虽然 XML 和注解方式的nacos源码版实现差异不大,但使用注解更加简洁。
### 类型转换
为了处理 Java Bean 与数据库类型之间的不一致,自定义 TypeHandler 是关键步骤。这通常涉及继承 BaseTypeHandler 类,并为 Java Bean 的类型定义泛型。
### TypeHandler 注册
自定义 TypeHandler 后,如何让其生效是接下来需要解决的问题。通常,有以下几种注册方式:通过 Result 标签指定、全局配置 SqlSessionFactory、全局 XML 配置或在 SpringBoot 配置文件中指定。
1. **Result 标签中指定**:在 XML 配置中,通过 Result 标签中的 typeHandler 属性指定 TypeHandler。
- XML 方式示例:
xml
- 注解方式示例:
java
@Result(column = "COLUMN_NAME", property = "PROPERTY_NAME", typeHandler = MyTypeHandler.class)
2. **SqlSessionFactory 全局配置**:对于希望全局生效的 TypeHandler,可在 SqlSessionFactory 的配置中实现。
- 示例配置:
java
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
3. **全局 XML 配置**:借助 mybatis-config.xml 配置文件注册 TypeHandler。需要在 SpringBoot 配置中指定相关配置以确保生效。
4. **SpringBoot 配置方式**:通过指定 `type-handlers-package` 配置项注册 TypeHandler。
### 小结
本文主要介绍了如何在 Mybatis 中处理数据库字段与 Java Bean 类型不一致的情况,通过自定义 TypeHandler 实现类型转换。自定义 TypeHandler 的注册方式多样,包括精确指定、全局生效等。
本文还提到了 Mybatis 配置文件中的驼峰与下划线互转配置,这是一个常见的配置需求。此外,对于如何实现自定义的 name 映射,读者可以参考相关源码和知识点,或在社区寻求帮助。
### 不能错过的源码和相关知识点
深入研究 Mybatis 的源码,了解 TypeHandler 的实现细节,对理解其工作原理大有裨益。同时,关注一灰灰 Blog 中的相关内容,可以获取更多学习资源和实战经验分享,促进个人技能提升。
MyBatis-Plusä¸å¦ä½ä½¿ç¨ResultMap
MyBatis-Plus 对 MyBatis åºæ¬é¶ä¾µå ¥ï¼å®å ¨å¯ä»¥ä¸ MyBatis æ··å使ç¨ï¼è¿ç¹å¾èµã
å¨æ¶åå°å ³ç³»åæ°æ®åºå¢å æ¥æ¹çä¸å¡æ¶ï¼ææ¯è¾åæ¬¢ç¨ MyBatis-Plus ï¼å¼åæçæé«ãå ·ä½ç使ç¨å¯ä»¥åèå®ç½ï¼æè èªå·±ä¸ææ¸ç´¢æåä¸ä¸ã
ä¸é¢ç®åæ»ç»ä¸ä¸å¨ MyBatis-Plus ä¸å¦ä½ä½¿ç¨ ResultMap ã
å ç个ä¾åï¼
æå¦ä¸ä¸¤å¼ 表ï¼
å ¶ä¸ï¼ tb_hero ä¸ç bid å ³è tb_book 表ç id ã
ä¸é¢å ç Hero å®ä½ç±»ç代ç ï¼å¦ä¸ï¼
注æäºï¼æç¹å°æ tb_hero 表ä¸ç bid å段æ å°æå®ä½ç±» Hero ä¸ç bookId å±æ§ã
MyBatis-Plus æå°åºç SQL 为ï¼
没æ¯ç ï¼ MyBatis-Plus ä¼æ ¹æ® @TableField æå®çæ å°å ³ç³»ï¼çæ对åºç SQL ã
MyBatis-Plus æå°åºç SQL 为ï¼
ä¹æ²¡æ¯ç ï¼å¯ä»¥çå°çæç SELECT ä¸æ bid åäºå«å bookId ã
æ¯å¦ç°å¨ææ³è¿æ¥ tb_hero ä¸ tb_book è¿ä¸¤å¼ 表ï¼å¦ä¸ï¼
æ¥è¯¢ MyBatis-Plus æå°åºç SQL 为ï¼
SQL没å¥é®é¢ï¼è¿æ»¤ä¸å页ä¹é½æ£å¸¸ï¼ä½æ¯æ¤æ¶ä½ ä¼åç° bookId å±æ§ä¸º null ï¼å¦ä¸ï¼
为ä»ä¹å¢ï¼
è°ç¨ BaseMapper ä¸å ç½®ç selectById() æ¹æ³å¹¶æ²¡æåºç°è¿ç§æ åµåï¼ï¼ï¼
åè¿å¤´æ¥å对æ¯ä¸ä¸å¨ HeroMapper ä¸èªå·±å®ä¹çæ¥è¯¢ä¸ MyBatis-Plus èªå¸¦ç selectById() æå¥ä¸åï¼è¿è®°å¾ä¸é¢çååçæµè¯åï¼çæçSQLæå¥ä¸åï¼
åæ¥ï¼ MyBatis-Plus 为 BaseMapper ä¸å ç½®çæ¹æ³çæSQLæ¶ï¼ä¼æ SELECT åå¥ä¸ bid åå«å bookId ï¼èèªå·±åçæ¥è¯¢ MyBatis-Plus 并ä¸ä¼å¸®ä½ ä¿®æ¹ SELECT åå¥ï¼ä¹å°±å¯¼è´ bookId å±æ§ä¸º null ã
å¨è¿éå°±æ¯ tb_hero 表ä¸ç bid å段æ å°æå®ä½ç±» Hero ä¸ç bid å±æ§ãè¿æ ·å½ç¶å¯ä»¥è§£å³é®é¢ï¼ä½ä¸æ¯æ¬ç¯è®²çéç¹ã
å¨ @TableName 设置 autoResultMap = true
ç¶åå¨èªå®ä¹æ¥è¯¢ä¸æ·»å @ResultMap 注解ï¼å¦ä¸ï¼
è¿æ ·ï¼ä¹è½è§£å³é®é¢ã
ä¸é¢ç®åçä¸æºç ï¼ @ResultMap("mybatis-plus_å®ä½ç±»å") æä¹æ¥çã
详æ è§ï¼ com.baomidou.mybatisplus.core.metadata.TableInfo#initResultMapIfNeed()
注æçä¸é¢çå符串 id çææï¼ä½ åºè¯¥å¯ä»¥æç½ã
æèï¼ è¿ç§æ¹å¼ç ResultMap é»è®¤æ¯å¼ºç»å¨ä¸ä¸ª @TableName ä¸çï¼å¦ææ¯æ个èåæ¥è¯¢æè æ¥è¯¢çç»æ并é对åºä¸ä¸ªçå®ç表æä¹åå¢ï¼æ没ææ´ä¼é çæ¹å¼ï¼
åºäºä¸é¢çæèï¼æåäºä¸é¢ç®åçå®ç°ï¼
å ³é®ä»£ç å ¶å®æ²¡æå è¡ï¼èå¿çä¸åºè¯¥ä¸é¾æã
è¿æ¯ç¨ä¾åæ¥è¯´ææ´ç´è§ã
ä¸é¢æ¯ä¸ä¸ªèåæ¥è¯¢ï¼
å ¶ä¸ BookAgg çå®ä¹å¦ä¸ï¼å¨å®ä½ç±»ä¸ä½¿ç¨äº @AutoResultMap 注解ï¼
Java培训班都需要学什么
我了解到Java培训学习课程分为四部分:
1、Java语言基础知识的学习与应用,掌握常见的数据结构和实用算法。
2、数据库的学习与应用,熟练使用oracle数据库。
3、熟练运用Java脚本语言编程,掌握HTML的基本原理与运用。
4、学习软件项目开发。
Java是一门面向对象编程语言,Java语言集合了C++的优点,丢弃了缺点,所以Java语言表现的功能强大而简单易用。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,让程序员能够以清晰的思维方式进行复杂的编程?。
想了解更多信息,我推荐到AAA教育集团了解一下。AAA教育集团以软件教育、数字教育为主,致力于培养“高级软件工程师”为特色,以促进大学生高质量就业为办学宗旨,是业界“互联网金领生产基地”。
随着当今职业多元化发展态势,我国对IT行业软件技术人才需求越来越旺盛,校企双方联合培养软件技术人才,是学校顺应时代发展的必要举措,对推动国家信息化发展进程具有重要的现实意义。
MyBatis 源码解析:映射文件的加载与解析(上)
MyBatis 的映射文件是其核心组成部分,用于配置 SQL 语句、二级缓存及结果集映射等功能,是其区别于其他 ORM 框架的重要特色。 在解析映射文件时,MyBatis 通过调用 XMLMapperBuilder#parse 方法实现加载与解析操作。此方法首先判断映射文件是否已解析,若未解析则调用 XMLMapperBuilder#configurationElement 方法解析所有配置,并注册当前映射文件关联的 Mapper 接口。对于处理异常的标签,MyBatis 会记录至 Configuration 对象并尝试二次解析。 解析流程主要涉及以下几个关键步骤:缓存配置(cache 标签):MyBatis 采用缓存设计,分为一级缓存和二级缓存。解析 cache 标签时,首先获取相关属性配置,然后使用 CacheBuilder 创建缓存对象,并记录到 Configuration 对象。
缓存引用(cache-ref 标签):标签默认限定在 namespace 范围内,用于引用其它命名空间中的缓存对象。解析过程中记录引用关系,然后从 Configuration 中获取引用的缓存对象。
结果集映射(resultMap 标签):解析 resultMap 标签配置,构建 ResultMap 对象,并将其记录到 Configuration 中。
SQL 语句(sql 标签):通过 sql 标签配置复用的 SQL 语句片段,解析后记录至 Configuration 的 sqlFragments 属性中。
核心数据库操作(select / insert / update / delete 标签):解析这些标签时,构建 MappedStatement 对象并记录到 Configuration 中。
每个标签解析实现由 MyBatis 提供的多个方法执行,如 XMLMapperBuilder 的 configurationElement 方法和解析具体标签的子方法,如 cacheElement、sqlElement 等。解析过程中,MyBatis 会调用不同的构造器和工厂方法来创建、初始化和配置相应的对象。 在解析完成之后,MyBatis 将所有配置对象封装在 Configuration 对象中,该对象包含所有映射文件中定义的配置信息,供后续的 SQL 语句执行和映射操作使用。