说说你对mybatis的理解

it2023-01-12  53

Mybatis是什么

mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发只需关注SQL语句本身,不需要花费时间去处理加载驱动,创建连接,创建statement对象等繁琐过程。直接编写原生态SQL,执行。mybatis可以使用XML或者注解的形式来配置和映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。通过XML文件或者注解的方式将要执行的各种statement配置起来,并通过Java对象和statement中的SQL动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql,并将结果映射为Java对象返回。

Mybaits的优点

基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成影响,SQL写在XML文件里,解除了sql与程序代码的耦合,便于统一管理,提供XML标签,支持编写动态SQL,可重用。 与JDBC相比,减少50%的代码量,消除JDBC大量的冗余代码,不需要手动开关连接。 很好与各种数据库兼容,只要JDBC支持的mybatis都支持。 能够很好与spring集成整合。 提供映射标签,支持对象与数据库的ORM关系映射,提供对象映射关系标签,支持对象关系组件维护。 MyBatis框架的缺点 (1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。

(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

MyBatis框架适用场合 (1)MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。

(2)对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

MyBatis与Hibernate有哪些不同?

(1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。

(2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。 (3)Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。

多表联合查询: 先将数据量小的表结果查出来,然后再用这个结果查询出其它需要连接的表的数据以此类推,最后通过代码,将数据拼接

补充扩展: mybatis主要分三层: 1、接口层: 主要包括:SqlSession

注:接口层是我们打交道最多的。核心对象是SqlSession,它是上层应用和MyBatis打交道的桥梁,SqlSession 上定义了非常多的对数据库的操作方法。接口层在接收到调用请求的时候,会调用核心处理层的相应模块来完成具体的数据库操作。

2、核心处理层 配置解析: Configuration 核心配置 MapperStatement 映射语句 ParameterMapping 参数映射 ResultMapping 结果映射 参数处理: 属性映射 参数映射 动态SQL SQL执行: SimpleExecutor 简单执行 BatchExecutor 批处理执行 ReuseExecutor 缓存执行 结果映射: 简单映射 关联映射 延迟加载

注:核心处理层,也就是跟数据库操作相关的动作都是在这一层完成的。核心处理层主要做了这几件事: 把接口中传入的参数解析并且映射成JDBC 类型; 解析xml 文件中的SQL 语句,包括插入参数,和动态SQL 的生成; 执行SQL 语句; 处理结果集,并映射成Java 对象。 插件也属于核心层,这是由它的工作方式和拦截的对象决定的。

3、基础层 日志 缓存 数据源/连接池 事务 反射

注:基础支持层主要是一些抽取出来的通用的功能(实现复用),用来支持核心处理层的功能。比如数据源、缓存(请点击跳转至缓存详解)、日志、xml 解析、反射、IO、事务等等这些功能。

mybatis的工作流程 通过建造者模式创建一个工厂类,定位,加载,解析配置文件的就是在这一步完成的,包括mybatis-config.xml 和Mapper 适配器文件。 通过SqlSessionFactory 创建一个SqlSession。 获得Mapper 对象。 调用接口方法(insert,delete,update,select)。

接口绑定有几种实现方式,分别是怎么实现的? 通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定; 通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。 #{}和{}区别 #{}是预编译处理,$ {}是字符串替换, mybatis在处理#{}时会将sql中的#{}替换为问号,PreparedStatement的set方法赋值 mybatis在处理${}时其实就是替换变量的值 name = 1 #{name} = “1” ${name} = 1

最新回复(0)