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. uniqid用法

    uniqid():妙用就是以当前时间微妙为单位,返回的唯一ID 我们可以用到密码加密和接口加密的功能上,比如 $salt = substr(uniqid(rand()), -6);//截取倒数6位$p ...

  2. 移动端上传图片(引入exif-js,图片被压缩为base64)

    <template> <div class="vue-box"> <img :src="imgUrl" alt="&qu ...

  3. APP路由还能这样玩

    本文主要讲述一种设计思路,组件化架构市面上已经有很多大厂成熟的方案,但是在组件化过程中,偶尔会遇到2个独立业务子模块间没有相互引用,也需要能直接调用对方的功能,因此我想到通过方法路由来解决,如果还有疑 ...

  4. IT成长中的龟兔赛跑

    IT成长中的龟兔赛跑 相信"龟兔赛跑"的故事大家都听过吧,那就让咱给各位看官讲讲我看到的一些事情吧.      最近看到很多文章总是叹息网管如何,起得比鸡早,睡得比狗晚,吃得比猪差 ...

  5. JVM调优:GC 参数

    2019独角兽企业重金招聘Python工程师标准>>> JVM调优:GC 参数 博客分类: java jvm 参考: <Memory Management in the Jav ...

  6. C. The Big Race

    \(给出数n,a,b\) \(在[1,n]区间内随机选数,选出的数被a,b除后同余的概率\) \(这题的精度问题真的是烦炸了~\) \(设最小公倍数lcm=a*b/gcd(a,b)\) \(所以在区间 ...

  7. H - Buy Tickets POJ - 2828 逆序遍历 树状数组+二分

    H - Buy Tickets POJ - 2828 这个题目还是比较简单的,其实有思路,不过中途又断了,最后写了一发别的想法的T了. 然后脑子就有点糊涂,不应该啊,这个题目应该会写才对,这个和之前的 ...

  8. zabbix 告警信息与恢复信息

    名称: Action-Email 默认接收人: 故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障! 默认信息: 告警主机:{HOSTNAME ...

  9. 如何优雅的使用Fegin去构造通用的服务调用的API

    第一步: 创建一个公共的API服务:命名为api(根据自己实际情况进行命名) <?xml version="1.0" encoding="UTF-8"?& ...

  10. python学习之如何一次性输出多个变量的值

    如果要输出多个结果 ,中间使用逗号隔开,且引用变量为%(变量1,变量2,变量3)例如