Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

图书勘误 #13

Open
fl150 opened this issue Jun 27, 2020 · 9 comments
Open

图书勘误 #13

fl150 opened this issue Jun 27, 2020 · 9 comments

Comments

@fl150
Copy link

fl150 commented Jun 27, 2020

江老师您好,最近在阅读您写的《MyBatis 3源码深度解析》,对于本人理解MyBatis源码提供了很大的帮助。阅读过程中,发现书上有个小错误,您核对下是否有误。
6.3 Mapper方法调用过程详解
原文:
如上面的代码所示,MethodSignature构造方法中只做了3件事情:(1)获取Mapper方法的返回值类型,具体是哪种类型,通过boolean类型的属性进行标记。例如,当返回值类型为void时,returnsVoid属性值为true,当返回值类型为List时,将returnsMap属性值设置为true。MethodSignature类中标记Mapper返回值类型的属性如下:
修正:
当返回值类型为List时,将returnsMap属性值设置为true --> 当返回值类型为List时,将returnsMany属性值设置为true
1593269666(1)

@fl150
Copy link
Author

fl150 commented Jun 28, 2020

8.1 Java日志体系
原文:
读者可以想象一下,我们的项目中通常会依赖很多第三方工具包或者框架,如果这些工具包或框架使用不同的日志实现,那么我们的项目就要为每种不同的日志框架维护一套单独的配置,这会造成项目日志输出模块相当混乱。然而在实际项目中,我们只维护了一套日志配置,这些日志直接是怎样解决冲突的呢?
修正:
这些日志直接是怎样解决冲突的呢? --> 这些日志之间是怎样解决冲突的呢?
image

@fl150
Copy link
Author

fl150 commented Jun 28, 2020

10.1 MyBatis插件实现原理
原文:
如图10-2所示,当我们调用SqlSession对象的selectOne()方法执行查询操作时,大致会经历下面几个过程:
(1)SqlSession操作数据库需要依赖于Executor组件,SqlSession会调用Configuration对象的newExecutor()方法获取Executor的实例。
(2)SqlSession获取到的是Executor组件的代理对象,执行查询操作时会调用代理对象的query()方法。
建议修改为:
如图10-2所示,当我们调用SqlSession对象的selectOne()方法执行查询操作时,大致会经历下面几个过程:
(1)SqlSession执行查询操作时会调用Executor代理对象的query()方法。
1593355199(1)

@fl150
Copy link
Author

fl150 commented Jun 28, 2020

10.1 MyBatis插件实现原理
原文:
如上面的代码所示,通过Intercepts注解指定拦截ResultHandler组件的query()方法,同时拦截StatementHandler组件的prepare()方法。
修正:
如上面的代码所示,通过Intercepts注解指定拦截Executor组件的query()方法,同时拦截StatementHandler组件的prepare()方法。
1593355685(1)

@fl150
Copy link
Author

fl150 commented Jul 1, 2020

11.3 MyBatis级联映射实现原理
11.3.1 ResultMap详解
原文:
MyBatis是一个半自动化的ORM框架,可以将数据库中的记录转换为Java实体对象,但是Java实体属性通常采用驼峰命名法,而数据库字段习惯采用**下画线**分割命名法,因此需要用户指定Java实体属性与数据库表字段之间的映射关系。
修正:
下画线 --> 下划线。

@fl150
Copy link
Author

fl150 commented Jul 1, 2020

11.2 MyBatis懒加载机制
原文:
aggressiveLazyLoading参数用于控制ResultMap默认的加载行为,参数值为false表示ResultMap默认的加载行为为懒加载,否则为积极加载。
修正:
aggressiveLazyLoading官网描述:开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods)。默认为false(在 3.4.1 及之前的版本中默认为 true)。
lazyLoadTriggerMethods官网描述:指定对象的哪些方法触发一次延迟加载。默认值为equals,clone,hashCode,toString。

@fl150
Copy link
Author

fl150 commented Jul 1, 2020

11.3 MyBatis级联映射实现原理
11.3.2 ResultMap解析过程
原文:
这些属性的含义如下。
Id:通过标签的id属性和Mapper命名空间组成的全局唯一的Id。
Type:通过标签的type属性指定与数据库表建立映射的Java实体。
resultMappings:通过标签配置的所有数据库字段与Java实体属性之间的映射信息。
idResultMappings:通过标签配置的数据库主键与Java实体属性的映射信息。需要注意的是,标签与标签没有本质的区别。
constructorResultMappings:通过标签配置的构造器映射信息。
propertyResultMappings:通过标签配置的数据库字段与Java实体属性的映射信息。
阅读源码发现:
resultMappings:标签的所有子节点都会解析并添加到该属性中。
propertyResultMappings:、标签都会解析并添加到该属性中。

@fl150
Copy link
Author

fl150 commented Jul 7, 2020

8.1 Java日志体系
原文:
这些模块之间的关系如图8-3所示,最上层表示桥阶层,用于使其他日志框架的调用转接到SLF4J-api。
修正:
这些模块之间的关系如图8-3所示,最上层表示桥接层,用于使其他日志框架的调用转接到SLF4J-api。
1594082938(1)

@jiangrongbo
Copy link
Owner

你好 你看的是电子版的还是纸质版的,有些错别字问题稿件中是正确的

@fl150
Copy link
Author

fl150 commented Jul 18, 2020

在微信读书看的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants