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. JVM原理以及深度调优(二)

    JVM内存分配 内存分配其实真正来讲是有三种的.但对于JVM来说只有两种 栈内存分配: 大家在调优的过程中会发现有个参数是-Xss 默认是1m,这个内存是栈内存分配, 在工作中会发现栈OutOfMem ...

  2. centos7安装及部署zabbix监控

    一:实验环境 server.zabbix.com-------------------- 192.168.200.11 agent.zabbix.com------------------------ ...

  3. 【Linux常见命令】ip命令

    ip命令是用来配置网卡ip信息的命令,且是未来的趋势,重启网卡后IP失效. ip - show / manipulate routing, devices, policy routing and tu ...

  4. dhcpd.conf(5) - Linux man page

    http://linux.die.net/man/5/dhcpd.conf Name dhcpd.conf - dhcpd configuration file Description   The d ...

  5. 吞吐量(TPS)、QPS、并发数、响应时间(RT)

    1. 响应时间(RT)  响应时间是指系统对请求作出响应的时间.直观上看,这个指标与人对软件性能的主观感受是非常一致的,因为它完整地记录了整个计算机系统处理请求的时间.由于一个系统通常会提供许多功能, ...

  6. Ant 环境安装

    1.下载安装 Ant,配置环境变量 进入 http://ant.apache.org/bindownload.cgi 下载 Ant 配置环境变量 新建 ANT_HOME 配置 Path 环境变量 配置 ...

  7. DeepWalk论文精读:(4)总结及不足

    模块4 1 研究背景 随着互联网的发展,社交网络逐渐复杂化.多元化.在一个社交网络中,充斥着不同类型的用户,用户间产生各式各样的互动联系,形成大小不一的社群.为了对社交网络进行研究分析,需要将网络中的 ...

  8. js怎么删除数组元素,有哪些删除元素方法

    JavaScript删除元素方法 1.根据索引删除数组元素 delete 数组[索引]   *注意delete 后面是空格 var arr1=["aa","bb" ...

  9. B. Sorted Adjacent Differences(思维构造)

    \(给出n个数字,要求构造一个由这n个数组成的序列,使得|a_1-a_2|<=|a_2-a_3|...<=|a_{n-1}-a_n|\) \(排序后,从数列中间取个数,然后从左右分别循环取 ...

  10. HDU1176(正推DP)

    时间和位置都可以决定这一秒捡到的馅饼数 不妨设\(dp[i][j]\)为在\(i\)秒\(j\)位置的最大收益 那么\(dp[0][5]=0\),dp数组的其他部分置成-1代表不能转移 那么对于第\( ...