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. Python(3)

    使用除法来缩减数字,使用余数法来计算个数. class Solution: def hammingWeight(self, n: int) -> int: count = 0 while Tru ...

  3. 走 进 java 的 四 个 基 本 特 性

    赶上明天就还是五一c小长假了,准备在这几天写几篇原创文章,供大家一起学习. 首先今天就来好好地唠一唠,到底java的那几个特性都是什么呢?到底怎么用呢?相信一定有一些小白对此会有些懊恼,没关系的,谁还 ...

  4. 【高并发】由InterruptedException异常引发的思考

    写在前面 InterruptedException异常可能没你想的那么简单! 前言 当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedExc ...

  5. 3.PEP 8是什么?

    PEP 8是什么? PEP 8 is a coding convention, a set of recommendation, about how to write your Python code ...

  6. Joomla CMS 3.2-3.4.4 SQL注入 漏洞分析

    RickGray · 2015/10/26 11:24 昨日,Joomla CMS发布新版本3.4.5,该版本修复了一个高危的SQL注入漏洞,3.2至3.4.4版本都受到影响.攻击者通过该漏洞可以直接 ...

  7. Codeforce 140C (贪心+优先队列)补题

    C. New Year Snowmen time limit per test2 seconds memory limit per test256 megabytes inputstandard in ...

  8. 疯子的算法总结(六) 复杂排序算法 ① 归并排序 merge_sort()

    归并排序采取了分治的思想,每次分别排左半边和右半边,不断递归调用自己,直到只有一个元素递归结束,开始回溯,调用merge函数,合并两个有序序列,再合并的时候每次给末尾追上一个最大int这样就不怕最后一 ...

  9. The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 K题 center

    You are given a point set with nn points on the 2D-plane, your task is to find the smallest number o ...

  10. 【Java8新特性】一张图带你领略Java8有哪些新特性

    写在前面 很多小伙伴留言说,冰河你能不能写一些关于Java8的文章呢,看书看不下去,看视频进度太慢.好吧,看到不少读者对Java8还是比较陌生的,那我就写一些关于Java8的文章吧,希望对大家有所帮助 ...