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. tp3.2的__construct和_initialize方法

    在tp3.2框架里面,有一个php自带的__construct()构造函数和tp3自带的构造函数_initialize()的实行顺序是先实行 php自带的__construct()构造函数 再实行 t ...

  2. Zabbix数据库表分区

    zabbix的监控主机数量将近300,且运行了一年时间了,最近zabbix server服务监控历史数据等服务不断自身告警.查询性能也变得很低 关于历史数据的两个参数,在zabbix server的配 ...

  3. Linux系统管理第二次作业 目录和文件管理 rpm安装 创建yum仓库

    chapter02 - 03 作业      1.分别用cat \tac\nl三个命令查看文件/etc/ssh/sshd_config文件中的内容,并用自己的话总计出这三个文档操作命令的不同之处? [ ...

  4. 多线程并行请求问题及SplashActivity预加载问题解决方案

    1. 问题描述(一): 现有3个线程thread1, thread2, thread3.这3个线程是并发执行的,当着3个线程都执行完成以后,需要执行一个finish()事件. 1.1 实现方法: /* ...

  5. 多方法解决设置width:100%再设置margin或padding溢出的问题

    2019独角兽企业重金招聘Python工程师标准>>> 当设置了父元素的宽度,子元素设置宽度为100%后再在加上子元素上添加padding或margin值就会溢出.举个例子: < ...

  6. Kubernetes 持久化存储是个难题,解决方案有哪些?\n

    像Kubernetes 这样的容器编排工具正在彻底改变应用程序的开发和部署方式.随着微服务架构的兴起,以及基础架构与应用程序逻辑从开发人员的角度解耦,开发人员越来越关注构建软件和交付价值. Kuber ...

  7. Mysql 查看被锁住的表

    MYSQL  查看被锁住的表 -- 本文章仅用于学习,记录   当你在mysql 执行查询语句的时候,简单的一句查询语句却卡很久,一直转圈圈的时候,这时候你就需要怀疑数据库的哪些进程,哪些事物被锁住 ...

  8. Vue页面权限控制和动态添加路由

    原文转自:点我 页面权限控制 页面权限控制是什么意思呢? 就是一个网站有不同的角色,比如管理员和普通用户,要求不同的角色能访问的页面是不一样的.如果一个页面,有角色越权访问,这时就得做出限制了. Vu ...

  9. 快放弃你的管家软件吧! Part 2 强制删除

    在Windows系统中,难免会遇到用常规方法无法删除文件的情况. 经常有遇到过一些情况? 软件卸载了,有些文件夹就是删不掉,提示被占用,mmp,这时候你肯定想到了360文件粉碎机! mmp,我就删个文 ...

  10. 图论--拓扑排序--HDU-1285确定比赛名次

    Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委 ...