深入理解Mybatis

目录

1、Mybatis介绍

1.1、什么是Mybatis

1.2、Mybaits的优缺点

1.3、#{}和${}的区别

1.4、如何在MyBatis中进行分页查询

1.5、延迟加载

2、 MyBatis的工作原理

3、MyBatis与XML

3.1、不同的Xml映射文件,id是否可以重复

3.2、一个mapper.xml对应一个Dao接口,该Dao接口工作原理

4、MyBatis与插件

4.1、插件运行原理

4.2、如何编写一个插件

4.3、MyBatis如何分页的(limit内存分页)

4.4、分页插件的原理(物理分页)

5、MyBatis与缓存

5.1、MyBatis中的一级缓存和二级缓存是什么

5.2、如何配置二级缓存

5.3、二级缓存注意事项


1、Mybatis介绍

1.1、什么是Mybatis

Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句即可。

通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。

1.2、Mybaits的优缺点

(1)优点

  • 消除了JDBC大量冗余的代码,不需要手动开关连接;
  • 基于SQL语句编程,相当灵活;
  • 与各种数据库兼容

(2)缺点

  •  SQL语句的编写工作量较大
  • SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

1.3、#{}和${}的区别

${}是字符串替换,#{}是预处理;使用#{}可以有效的防止SQL注入,提高系统安全性

1.4、如何在MyBatis中进行分页查询

(1)使用limit和offset

(2)使用RowBounds

(3)使用插件或自定义分页插件,如PageHelper

1.5、延迟加载

(1)什么是MyBatis延迟加载

是指在需要使用关联对象时才加载关联对象的数据,而不是在查询主对象时立即加载关联对象的数据,可以减少不必要的数据库查询。

(2)如何开启延迟加载

lazyLoadingEnabled配置文件方式:

  <settings>
       <setting name="lazyLoadingEnabled" value="true"/>
   </settings>

fetchType属性方式:略

2、 MyBatis的工作原理

(1)加载配置

MyBatis首先会加载配置文件,包括数据库连接信息、SQL映射文件的位置、插件等配置信息

(2) 解析映射:解析SQL映射文件,将内容解析成相应的数据结构

(3) 创建SqlSession

当应用程序需要执行SQL时,MyBatis会创建一个SqlSession对象,SqlSession提供了对数据库操作的接口

(4)执行SQL

通过SqlSession执行SQL命令,在执行SQL之前,MyBatis会通过参数映射将Java对象的属性值传递给SQL语句

(5)结果映射:当SQL执行完毕后,MyBatis会将结果集映射为Java对象

(6)缓存处理

MyBatis支持一级缓存和二级缓存,在执行SQL时会根据配置对缓存进行处理,以提高查询性能

(7) 关闭资源:SQL执行完毕后,MyBatis会关闭SqlSession并释放相关的数据库连接和资源。

3、MyBatis与XML

3.1、不同的Xml映射文件,id是否可以重复

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;原因就是namespace+id是作为Map的key使用的(新版本的namespace已经是必填项了)

3.2、一个mapper.xml对应一个Dao接口,该Dao接口工作原理

Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象 MappedProxy,代理对象会拦截接口方法,根据类的全限定名+方法名,唯一定位到一个MapperStatement并调用执行器执行所代表的sql,因为在Mybatis中每一个SQL标签,都会被解析为一个MapperStatement对象,最后将sql执行结果返回。

4、MyBatis与插件

4.1、插件运行原理

Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法

4.2、如何编写一个插件

实现Mybatis的Interceptor接口并复写intercept()方法,然后再给插件编写注解,指定要拦截哪一个接口的哪些方法即可,最后在配置文件中配置你编写的插件

4.3、MyBatis如何分页的(limit内存分页)

使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。

4.4、分页插件的原理(物理分页)

 分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。根据dialect方言,添加对应的物理分页语句和物理分页参数。

5、MyBatis与缓存

5.1、MyBatis中的一级缓存和二级缓存是什么

(1)一级缓存(默认)

是HashMap 本地缓存,其存储作用域为 Session。指在同一个SqlSession中,对相同的查询进行缓存,当再次执行相同的查询时,MyBatis会直接从缓存中获取结果,而不再去数据库中执行查询。

只在当前SqlSession的生命周期内有效,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空。

(2)二级缓存

二级缓存是指在多个SqlSession之间共享缓存,因此可以跨越多个SqlSession的生命周期。这意味着当一个SqlSession执行查询后,结果会被缓存起来,当其他SqlSession执行相同的查询时,可以直接从缓存中获取结果

也是HashMap 本地缓存,但是其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache,默认不打开。

5.2、如何配置二级缓存

以通过<cache/>元素来配置二级缓存

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

配置表示使用FIFO算法进行缓存清理,每隔60秒刷新缓存,最多缓存512个对象,只读模式

5.3、二级缓存注意事项

要确保被缓存的对象是可序列化的,因为二级缓存的实现通常会将对象序列化到磁盘或网络中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值