1、mybatis是什么?
mybatis是一款用于持久层的半自动化ORM框架
持久层是什么意思呢,可以把层字去掉,持久,也就是”保持长久“的意思,他针对的是系统中数据存在的时限。有一个基本问题大家应该知道,在内存中的数据是不持久的,如果计算机崩溃或者其他原因导致关机,数据就会丢失,但是磁盘上的数据是持久的,因此,用在持久层也就是这个框架是用来将内存中的数据写入到磁盘中的,再具体一点,就是写到数据库中。所以,框架用于持久层,就是说这个框架是和数据库进行交互的,用于数据库中数据操作的框架。
ORM,Object Relational Mapping,就是对象关系映射,用于实现面向对象编程语言里不同类型系统的数据之间的转换
为什么说mybatis是半自动化orm框架
MyBatis被称为半ORM(Object-Relational Mapping)是因为它并不完全按照传统的ORM框架的方式来处理对象和关系数据库之间的映射关系。
传统的ORM框架会自动地将对象和数据库表进行映射,通过在对象和数据库之间建立映射关系,实现数据的持久化和操作。这种方式在某些情况下可能会带来性能问题,特别是当需要处理复杂的SQL语句或者对性能要求较高时。
相比之下,MyBatis更加灵活。它允许开发人员直接编写SQL语句,并且提供了强大的SQL映射功能,可以将SQL语句和Java对象进行映射。开发人员可以根据具体需求自由地编写和优化SQL语句,从而更好地控制数据库操作的性能和效率。
虽然MyBatis不像传统的ORM框架那样自动处理对象和数据库之间的映射关系,但它提供了方便的映射配置和查询方法,使得开发人员可以更加便捷地进行数据操作。因此,MyBatis被称为半ORM框架。
特性:
- 支持定制化 SQL、存储过程以及高级映射
- 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的操作
- 可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(实体类)映射成数据库中的记录
优点:
- 轻量级,性能出色
- SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据
2.MyBatis的工作原理
(1)读取MyBatis的配置文件。mybatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接信息。
(2)加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
(3)构造会话工厂。通过MyBatis的环境配置信息构建会话工厂SqlSessionFactory。
(4)创建会话对象。由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
(5)Executor执行器。MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
(6)MappedStatement对象。在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
(7)输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。
(8)输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。
3.什么是缓存?
缓存即为存在内存中的临时数据.将用户经常查询的数据存放在缓存(内存)中,用户去查询数据就不用去每次去数据库中查询,而是去缓存中查询,从而提高了查询的效率,解决了高并发系统的性能问题.
mybatis中,一级缓存的作用域在一个sqlsession中,在同一个sqlsession中执行两个相同的sql语句,第一次执行的sql语句后的结果数据将会写入到缓存中,第二次执行时就不会再去数据库中查询,直接会去缓存中获取,从而提高查询效率。当一个sqlsession结束后该sqlsession中的一级缓存就不存在了。mybatis默认开启一级缓存。
mybatis的二级缓存是多个sqlsession共享的,它的作用于是mapper的同一个namespace,不同的sqlsession执行相同namespace下的sql语句且向sql语句中传递的参数也相同。即最终执行相同的sql语句,第一次会将执行的结果写入二级缓存中,第二次执行相同的sql时不会再去数据库查询,直接从缓存中取数据,从而提升了查询效率。mybatis默认没有开启二级缓存,需要在setting全局参数中配置开启二级缓存。
4.Mapper动态代理
动态代理是一种在程序运行时生成代理类的技术,代理类实现了目标接口,并在实现中委托给实际的实现类来完成具体的方法调用。
在 MyBatis 中,Mapper 接口对应于一个具体的 SQL 映射文件,Mapper 接口中的方法对应于 SQL 映射文件中的 SQL 语句。
当 MyBatis 加载一个 Mapper 接口时,它会使用 JDK 的动态代理技术创建一个代理类,代理类实现了 Mapper 接口中的方法,并在实现中委托给 SqlSession 对象来完成具体的 SQL 操作。
在实际的调用过程中,当调用 Mapper 接口的方法时,实际上是调用了代理类的方法,代理类的方法中会通过 SqlSession 执行对应的 SQL 语句,最终将结果返回给调用方。
通过动态代理,MyBatis 实现了对 Mapper 接口的透明化封装,使得使用者可以像调用普通的 Java 接口一样使用 Mapper 接口,而无需关注具体的 SQL 语句和数据库操作细节。