JDBC问题:1.数据库配置信息硬编码
2.频繁创建,释放数据库连接
3.sql,设置参数,获取结果集硬编码,不通用
 
解决方案:1.配置文件
2.采用连接池
3.使用反射和内省
 
自定义持久层框架:
 
 
 
 
一对一查询:使用association标签
 
一对多查询:使用collection标签
 
 
 
多对多查询(返回结果为list)
 
 
1.Mybatis有哪些动态sql
用于在多入参的条件下,根据不同的标签和入参条件是,动态组合sql条件。
原理:根据 不同的标签(where 标签,if标签判断是否拼接条件,foreach标签用于in查询,include 抽象公共的sql语句)在解析sql的时候动态拼接查询语句
 
2.Mybatis是否支持延迟加载实现原理
支持,延迟加载主要是通过动态代理的形式实现,通过代理拦截到指定方法,执行数据加载。
MyBatis延迟加载主要使用:Javassist,Cglib实现
 
  • 三种关联对象的加载时机
MyBatis的延迟加载只是对关联对象的查询有延迟设置,对于主加载对象都是直接执行查询语句的。
1.直接加载
即执行对象的select语句,完成对主加载马上执行对关联对象的select查询。
2.侵入式延迟加载(aggressiveLazyLoading) 也可看做立即加载
执行对主加载对象的查询时,不会执行对关联对象的查询。但是当要访问主加载对象的详情时马上执行对关联对象的select查询。即对关联对象的执行查询,侵入到了主加载对象的访问详情中。也可理解为:将关联对象的详情侵入到主加载对象的详情中去,即将关联对象的详情作为主加载对象的一部分出现了!
3.深度延迟加载
执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的select查询。
 
2.延迟加载如何使用
Setting 参数配置
设置参数
描述
有效值
默认值
lazyLoadingEnabled
延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。
true、false
false
aggressiveLazyLoading
当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载(参考lazyLoadTriggerMethods).
true、false
false (true in ≤3.4.1)
lazyLoadTriggerMethods
指定哪个对象的方法触发一次延迟加载。
   
 
 
3.Mybatis Executor执行器
 
①SimpleExecutor
SimpleExecutor继承BaseExecutor
主要实现:doUpdate、doQuery、doFlushStatements
每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象
②ReuseExecutor
执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象
③BatchExecutor
执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同
④CachingExecutor
缓存执行器,这里的缓存是全局缓存
 
 
4.Mybatis的一级、二级缓存
一级缓存(默认开启):
作用范围:sqlSession级别不同sqlSession间互不影响
存储结构:在对象中有(HashMap)用于存储数据,key由 mappedStatement,parameter,rowBounds,resultHandler生成
失效场景:进行增删改操作,并提交事物,或者手动调用sqlSession的 clearCash方法清除缓存
注意:
  • 一级缓存无法关闭,可以采用清空缓存或者在sql后面拼接随机串的方式
  • 在spring 结合了mybatis后,如果不开启事物,即使是同一个线程每次查询都会申请新的sqlSession导致,一级缓存无用。
开启了事务,在同一事物中一级缓存是生效的
  • 一级缓存没有过期时间
 
 
 
二级缓存:
作用范围:mapper(namespace)级别的缓存,多个sqlSession可以共用二级缓存
存储结构:HashMap
失效场景:进行增删改操作、禁用二级缓存、缓存时间过期
注意点:
  • 开启了二级缓存后,数据不只会存在内存,还有可能持久化,所以mybatis 的 pojo需要实现序列化接口
  • 每当存取数据的时候,都有检测一下cache的生命时间,默认是1小时,如果这个cache存活了一个小时,那么将整个清空一下。
 
5.Mybatis的插件运行原理,以及如何编写一个插件
运行原理:interceptorChain保存了所有拦截器,调用拦截器链中的拦截器依次对目标进行拦截,增强。interceptor.plugin(target)中的target就是被代理后的对象。以Executor为例,我们执行sql的时候,先通过DefaultSqlSessionFactory创建sqlsession。Executor实例再创建SqlSession的过程中被创建,Executor实例创建后,MyBatis通过动态代理为实例生成代理类。这样插件就可以在Executor相关方法被调用前执行。
编写插件:
1.继承Interceptor接口,并且在实现类增加@Intercepts,@Signature注解进行详细的拦截配置
2.在重写方法中定义要增强的逻辑
3.在mybatis主配置文件中配置插件类

mybatis随记的更多相关文章

  1. Spring生态研习【四】:Springboot+mybatis(探坑记)

    这里主要是介绍在springboot里面通过xml的方式进行配置,因为xml的配置相对后台复杂的系统来说,能够使得系统的配置和逻辑实现分离,避免配置和代码逻辑过度耦合,xml的配置模式能够最大限度的实 ...

  2. Mybatis随记(一)update动态SQL

    <update id="updateUser"> UPDATE user_info SET <if test="gzhOpenId != null an ...

  3. 逆水行舟 —— MyBatis

    第一轮总结性笔记 这是一个很漫长的过程,我买了套课程,将在日后记录学习笔记,取名为逆水行舟系列 MyBatis的基础 根据MyBatis的官方介绍: 整个测试项目结构如下:使用Maven架构项目 po ...

  4. 把struts2-convention-plugin丢进太平洋

    struts2-convention-plugin是一个插件,通过这个插件可以实现对于struts2的零配置,基本用法可以参考这个博客(http://javeye.iteye.com/blog/358 ...

  5. Mybatis 示例之 Association - 偶尔记一下 - 博客频道 - CSDN.NET

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  6. 记一笔MyBatis的坑

    记一笔MyBatis的坑 1.sql查询concat()连接函数xml运行查询乱码 ) , ), char)'%') bll FROM fact_dkxx sq 由于连接的字符串中包含数字与百分比字符 ...

  7. 记Mybatis动态sql

    目录 记MyBatis动态SQL 1.< SQL >标签 2.< if >标签 3.分支标签 1.第一种:用在查询条件上用choose-when:otherwise可不要 2. ...

  8. 学习大神笔记之 “MyBatis学习总结(一)”

    1.准备工作 软件:eclipse. mysql .navicat for mysql 包:mybatis-3.1.1.jar   mysql-connector-java-5.1.7-bin.jar ...

  9. 记一次 IDEA mybatis.generator 自定义扩展插件

    在使用 idea mybatis.generator 生成的代码,遇到 生成的代码很多重复的地方, 虽然代码是生成的,我们也不应该允许重复的代码出现,因为这些代码后期都要来手动维护. 对于生成时间戳注 ...

随机推荐

  1. 安装和使用redis

    我现在只是在window上使用redis在其他平台上暂时没有操作过,如果你有其他好的意见欢迎提出来! 安装redis具体可查看:http://www.runoob.com/redis/redis-in ...

  2. Linux操作系统进入单用户模式的方法

    单用户模式的作用 在使用Linux的过程中,维护人员经常会碰到一些问题,就是在拥有root账号权限和密码的用户中,总是会出现忘记root密码的情况. 遇到这种情况,一般情况下,维护人员就会通过最常用的 ...

  3. Kubernetes产生背景、核心概念

    Kubernetes是什么 • Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S. • Kubernetes用于容器化应用程序的部署,扩展和管理 ...

  4. nginx 配置多个 https 域名访问

    需要此操作的原因 在服务器上部署了 halo blog 以后,这次需要部署另外一个项目,但是又不想使用 ip + port,因此选择使用 nginx 配置多个域名访问. nginx 配置 server ...

  5. 再也不用c刷题了!!——c++刷题必备

    致读者: 博主是一名数据科学与大数据专业大二的学生,真正的一个互联网萌新,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于困惑的读者.由于水平有限,博客中难免会有一些错误 ...

  6. 【React踩坑记五】React项目中引入并使用react-ace代码编辑插件(自定义列表提示)

    最近有一个引入sql编辑器插件的需求,要求代码高亮显示,代码智能提示,以及支持自定义代码提示列表等功能.中途在自定义代码提示列表中由于没有相关demo,所以踩了一些坑,遂将其整理如下,以便日后查看. ...

  7. asp.net下载大文件代码

    public void Down(string filepath, HttpResponse aResponse) { System.IO.Stream iStream = null; // Buff ...

  8. mpvue开发微信小程序之时间+日期选择器

    最近在做微信小程序,技术栈为mpvue+iview weapp组件库. 因项目需求,要用到日期+时间选择器,iview组件库目前还未提供时间日期选择器的组件,小程序官方组件日期时间也是分开的,在简书上 ...

  9. PPT模板素材

    http://588ku.com/sucai/0-dnum-0-54-0-1/

  10. 外媒解读Web安全核心PKI的四大致命问题

    Web安全的立足根基在于复杂的PKI部署体系,但实际生活中得到正确部署的比例却非常有限,而且这一切都将随着摩尔定律的滚滚洪流灰飞烟灭. 我个人算是PKI(即公共密钥基础设施)的忠实拥护者.我热爱数学与 ...