优点: 1.SQL写在XML里面,与业务代码分离,因此相对比较灵活,便于统一管理 2.spring集成很方便,由于使用的JDBC连接数据库,因此,不需要针对不同数据专门做兼容。
缺点: SQL的编写,SQL的语法都强关联数据库的类型,因此,无法随意切换数据库。
# 的作用是占位符,将Java里面的变量按类型注入进来,可以有效防止SQL注入。
$ 的作用是替换,不能防SQL注入,会在传递到数据库之前,就将内容直接文本替换到对应的位置,可以用于SQL语句不确定的场景[或者说可变]
mybatis里面有两级缓存, 一级缓存的生命周期是sqlsession级别的,相当于在sqlsession里面,有一个executor,executor里面有一个localcache对象,每个sqlsession的查询,会优先查看localcache里面有没有,如果没有,再查询数据库 二级缓存的生命周期是跨sqlsession,底层是通过cacheExecutor装饰executor实现的, 这样以后会先查看cacheexecutor里面二级缓存有没有数据,然后,查看localcache里面一级缓存有没有,最后才实时查询数据库。
分页总体来说就两种: 逻辑分页 物理分页
逻辑分页:数据全部加载到内存,得到分页数据后返回,有OOM风险
代表:mybatis提供了Rowbounds对象来实现这种方式。
物理分页:SQL中拼接了分页参数,数据库仅返回分页数据
代表:
1.静态拼接,由开发人员将分页参数拼接到SQL
2.动态拼接,mybatis提供了分页插件,其原理是通过拦截器,动态在SQL上拼接对应的,例如IPage对象,其中还涉及到数据库二级缓存。
主要有以下几点区别:
Hibernate的开发难度大于MyBatis,主要由于Hibernate比较复杂,庞大,学习周期比较长。
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
数据库扩展性的区别。Hibernate与数据库具体的关联在XML中,所以HQL对具体是用什么数据库并不是很关心。MyBatis由于所有sql都是依赖数据库书写的,所以扩展性、迁移性比较差。
缓存机制的区别。Hibernate的二级缓存配置在SessionFactory生成配置文件中进行详细配置,然后再在具体的表对象映射中配置那种缓存。MyBatis的二级缓存配置都是在每个具体的表对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓冲机制,并且MyBatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
日志系统完善性的区别。Hibernate日志系统非常健全,涉及广泛,而Mybatis则除了基本记录功能外,功能薄弱很多。
sql的优化上,Mybatis要比Hibernate方便很多。由于Mybatis的sql都是写在xml里,因此优化sql比Hibernate方便很多。而Hibernate的sql很多都是自动生成的,无法直接维护sql;总之写sql的灵活度上Hibernate不及Mybatis。
读取MyBatis配置文件:mybatis-config.xml为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,例如数据库连接信息。
加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml文件可以加载多个映射文件,每个文件对应数据库中的一张表。
构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory。
创建会话对象:由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
Executor执行器:MyBatis底层定义了一个Executor 接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
MappedStatement 对象:在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
输入参数映射:输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于 JDBC对preparedStatement对象设置参数的过程。
输出结果映射:输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于 JDBC对结果集的解析过程。