Mybatis:

  • 可以说是半个ORM(对象关系映射)的持久层框架,其内部进行对JDBC的封装,在开发是只需要关注SQL语句的优化问题等,没有必要进行频繁的驱动加载、数据库连接、创建statement等操作。
  • 通过注解和XML两种方式映射原生信息(实体类与数据库表的映射)
  • 优点:(1)编写SQL非常灵活,接触SQL与程序的耦合,支持动态SQL(if,choose,trim,when,otherwise,foreach等标签),可重用性高。(2)代码量少,消除JDBC的代码冗余,自动资源的开关。(3)兼容性强,可以市面上大多数的数据库软件整合使用。(4)能与Spring很好的集成,提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象组件的维护。
  • 缺点:SQL依赖数据库,造成数据库可移植性不好,不能随意更换数据库

Mybatis的执行过程

Mybatis 小结(一)

mybatis的底层原理就是:动态代理;本质就是:反射机制

#{ }与${}的区别:

#{} 是预编译处理,${}是字符串的替换。
Mybatis处理#{}是,将它替换成问号?,在调用PreparedStatement的set方法进行赋值;而 $ { }只是将里面的值替换成变量的值。
还有就是#{}能防止SQL的注入,提高系统安全性。

实体类中的属性名与表中的字段不一致时怎么办:

  1. 通过在SQL语句定义字段名的别名,让字段名的别名与实体类的属性名一直就行了。
  2. 通过映射字段名和实体属性名一一对应就行了。在resultMap中使用id属性映射主键字段,使用result属性映射非主键字段,其中property是实体类的属性名称,column是数据库表的字段名。

分页:

使用RowBounds对象进行分页,
使用第三方插件分页(pageHelper)

1对1的操作

联合查询:几张表进行联合查询,只进行一次,通过resultMap中的association配置1对1的类即可
嵌套查询:先查一张表,再根据这个表的结果里的id再去查询另一张表的内容,也是通过association配置,但是另一张就是普通的select的。

Mybatis缓存

  • MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。
  • MyBatis系统中默认定义了两级缓存:一级缓存二级缓存
    • 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)
    • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
    • 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存
      Mybatis 小结(一)

一级缓存:

基于PerpetualCache的HashMap本地缓存,它的声明周期和SqlSession一致,有许多SqlSession或者分布式的环境中数据库操作,可能出现脏读数据。当Session flush或者close之后,该Session中的所有缓存就被清空,默认一级缓存是被开启的。

二级缓存

  • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
  • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存;
  • 工作机制
    • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;
    • 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
    • 新的会话查询信息,就可以从二级缓存中获取内容;
    • 不同的mapper查出的数据会放在自己对应的缓存(map)中;
  • 开启二级缓存数据查询流程:二级缓存 -> 一级缓存 -> 数据库。
  • 缓存更新机制:当某一个作用域(一级缓存 Session/二级缓存 Mapper)进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

相关文章:

  • 2021-04-18
  • 2021-10-02
  • 2022-01-16
  • 2022-12-23
  • 2022-12-23
  • 2021-12-03
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-10-14
  • 2021-06-28
  • 2021-07-08
  • 2022-12-23
  • 2021-07-03
  • 2021-09-19
相关资源
相似解决方案