文档章节

咕泡-MyBatis 实用篇作业

职业搬砖20年
 职业搬砖20年
发布于 09/20 17:55
字数 1054
阅读 27
收藏 0

1. Mapper在spring管理下其实是单例,为什么可以是一个单例?

  • 首先,mapper 内部不包含 成员字段,无状态单例是安全的
  • 另外,一直存在不用每次调用都new 一个新实例

2. MyBatis在Spring集成下没有mapper的xml文件会不会报错,为什么?

  • 不会报错,因为支持 xml 和 annotation 两种

3. TypeHandler手写

  • 继承自 BaseTypeHandler
  • public class ExampleTypeHandler extends BaseTypeHandler<Date>
  • 配置到configuration 里面

  • 具体使用

  • 比如 String 和Date 之间的互转

4. 手写Plugin,多个interceptor到底谁先执行?顺序由谁决定的?

  • 允许使用插件拦截的接口

  • 根据签名判断其拦截点,根据jdbc 执行顺序,执行到相应的点,进行执行

  • 配置到 configuration 里面

1.怎么验证一级缓存的存在?

  • 相同的查询,连续查询两遍,记录查询用时,会发现第二次快得多
  • update、 insert、delete 等语句会触发清除缓存
  • 一级缓存默认开启,SqlSession 级别的
  • 二级缓存默认关闭,SqlSessionFactory 级别的 

二级缓存是需要配置来开启的:

  • 所以,一级缓存,在存在俩sqlsession 时,可能存在脏数据的情况
    •  比如,sqlsessionA 两次相同查询t 表中间,sqlsessionB 更新了t表数据,第二次查询的数据就是可能已被修改的脏数据

2.验证N+1问题

  • 所谓级联查询(嵌套查询)

  • 外层查询的一条结果数据,由内层查询获得
  • 外层查询一次,获得结果数N ,就要进行N 次内层查询(官方不鼓励使用,这样产生大量1+N次查询)

由于1+N 问题的性能损耗,可以考虑配合使用 延时加载

  • 配置到 configuration 里面

1、TestMapper 作者为什么要设计这样的形式来做?为什么不是一个class而是一个interface?

  • 首先使用 interface 接口已经可以满足,根据全限定名+方法名找到对应的SQL语句,然后MapperProxy代理实现具体的执行
  • 所有的执行套路都是一样的,xml文件里面配置也很清楚了,不需要class
  • 保留interface 的原因是用户使用方便

2.org.apache.ibatis.executor.BaseExecutor#queryFromDatabase 322行这行代码的意义

  • 322行这行代码的意义是声明一个占位符,当发送一次查询数据的请求时,设置该占位符 告诉其他请求 正在查询数据库,请其他请求先阻塞或休眠。
  • 当这次请求查询到数据之后,将真正的数据放到占位符的位置,缓存数据。如果其他请求与该次请求查询的数据时一样的,直接从缓存中拿数据减少了查询请求对数据库的压力

3.MyBatis的plugin实现机制

  • interceptorChain.pluginAll(executor) 在configuration 内部注册所有的 plugin

  • 本质就是getSignatureMap 方法,扫描所有注解,对配置的Signature 方法进行 动态代理
     

  • 代理类就是public class Plugin implements InvocationHandler
  • 执行Plugin 的invoke 会判断该方法是否被代理(signatureMap 里面有没有)

  • 如果有执行 intercept 方法

  • 该方法最后一行执行的proceed 方法,其实就是该方法的invoke 执行

4.lazy loading 是怎么做到的?

  • 懒加载在级联查询时用到了,SimpleStatementHandler 里面query结果

  • DefaultResultSetHandler 处理结果
  • handleResultSets -->handleResultSets -->...getRowValue-->createResultObject 

  • 如果有嵌套查询且开启了懒加载 那么会使用代理工厂来处理(代理工厂类型cglib或javasissit类型(默认))
  • 针对某一个属性,当执行

  • protected Set<String> lazyLoadTriggerMethods = new HashSet<String>(Arrays.asList(new String[] { "equals", "clone", "hashCode", "toString" }));
  • 在嵌套查询的时候 get/set 方法会触发 ResultLoaderMap LoadPair load() 方法去查询(我看源代码的理解),我找到了触发函数lazyLoadTriggerMethods 里面没有get/is  依赖的是PropertyNamer.isGetter(methodName)

© 著作权归作者所有

共有 人打赏支持
职业搬砖20年
粉丝 23
博文 205
码字总数 103975
作品 0
南京
程序员
提起app中的资源文件

步骤如下(以咪咕阅读为例): 1、打开iTunes,先进入其中的App Store,然后在搜索框中搜索“咪咕阅读“,如下图: 然后获取“咪咕阅读App“。 2、获取之后,点击我的应用,找到“咪咕阅读“...

DavidHacker
2016/10/24
17
0
shenzhanwang/SSM

SSM SpringMVC,Mybatis,Spring三大框架的整合总是很麻烦,在此提供一个已经整合好三大框架的包,可以直接下载导入Myeclipse使用,项目基于Maven做依赖管理。项目基于Mysql自带的Sakila数据库...

shenzhanwang
2016/11/16
0
0
浅谈JAVA就业前景

权威统计机构统计在所有软件开发类人才的需求中,对Java工程师的需求达到全部需求量的60%~70%。JAVA工程师的薪水相对较高,通常来说,具有3~5年开发经验的工程师,拥有年薪10万元是很正常的一...

耳东陈_f1e5
01/12
0
0
史上最简单的 MyBatis 教程

1 前言   MyBatis 源于 Apache 的一个开源项目 iBatis,而 iBatis 一词则来源于“internet”和“abatis”的组合,2010年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且...

qq_35246620
2017/02/01
0
0
ZHENFENGSHISAN/perfect-ssm

Quick Start 项目简介 ssm系列 ssm-demo:Spring+SpringMVC+Mybatis+easyUI整合 perfect-ssm:RESTful API+redis缓存 ssm-cluster:前后端分离+集群部署 ssm-dubbo:dubbo服务化 ssm-micro-se......

ZHENFENGSHISAN
2017/09/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《netty入门与实战》笔记-05:netty内置的channelHandler

Netty 内置了很多开箱即用的 ChannelHandler。下面,我们通过学习 Netty 内置的 ChannelHandler 来逐步构建我们的 pipeline。 ChannelInboundHandlerAdapter 与 ChannelOutboundHandlerAdap...

Funcy1122
23分钟前
1
0
帧动画(wifi信号动态动画)

准备六张wifi不同信号强度的素材图片,复制到drawable目录中 在drawable目录中新建frame文件,并编写代码 <animation-list xmlns:android="http://schemas.android.com/apk/res/android"> ...

lanyu96
44分钟前
2
0
快速get到学习Linux操作系统的点

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。Linux能够运行主要的UNIX工具软件、网络协议和应用程序。它支持32位...

问题终结者
52分钟前
1
0
Django2 model操作数据库

1.将应用(如learn)添加到安装应用配置中 将我们新建的应用(learn)添加到 settings.py 中的 INSTALLED_APPS中,告诉Django有这么一个应用。 INSTALLED_APPS = [ 'django.contrib.ad...

MichaelShu
54分钟前
2
0
SpringBoot基础篇Bean之条件注入之注解使用

更多Spring文章,欢迎点击 一灰灰Blog-Spring专题 bean的条件注入,除了前面一篇博文中介绍的通过@Conditional注解配合Condition接口的实现之外,还提供了更多简化的注解使用方式,省略了自己...

小灰灰Blog
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部