Mybatis



什么是Mybatis

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

说说Mybatis的优点和缺点

优点

  • 基于SQL语句变成,相当灵活,不会对应用程序和数据库现有设计造成任何影响,SQL写在XMl文件中,解除SQL与程序代码的耦合,便于统一管理;提供XML标签,自己吃编写动态的SQL语句,并可重用。
  • 与JDBC相比,减少了一半以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接。
  • 很好的与各种数据库兼容(因为Mybatis使用JDBC来连接数据库,所以只要JDBC支持的数据库Mybatis都支持)。
  • 能够与SpringMVC很好的集成。
  • 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

缺点

  • SQL语句的编写工作量较大,尤其当字段多,关联表多时,对开发人员编写SQL语句的工地有一定要求。
  • SQL语句依赖与数据库,导致数据库移植性差,不能随意更换换数据库。

#{}和${}的区别是什么

#{}是预编译处理,${}是字符串替换。

Mybatis在处理#{}时,会将SQL语句中的#{}替换为?;调用PreparedStatememt的set方法来赋值。

Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}替换成变量的值。

使用#{}可以有效防止SQL注入,提高系统安全性。

Hibernate和Mybatis的区别

相同点

  • 都是对JDBC的封装,都是持久层框架,都用于dao层开发

不同点

  • 映射关系

    • Mybatis是一个半自动映射的框架,配置Java对象与sql语句执行结果的对相应关系,多表关联关系配置简单
    • Hibernate是一个全表映射的框架,配置Java对象与数据库表的对应关系,多表关联关系配置复杂
  • SQL优化和移植性

    • Hibernate对SQL语句封装,提供了日志,缓存,级联(级联比Mybatis强大)等特性,此外还提供HQL(Hibernate Query Languuage)操作数据库,数据库无关性支持性好,但会多消耗性能。如果项目需要支持多种数据库,代码开发量少,但SQL语句优化困难。

    • Mybatis需要受到编写SQL,支持动态SQL、处理列表、动态生成表名、支持存储过程。开发工作量相对大些。直接使用SQL语句操作数据库,不支持数据库无关性,但SQL语句优化容易。

JDBC编程有哪些不足之处,Mybatis是如何解决的?

  • 1、数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。
    • 解决:在mybatis-config.xml中配置数据连接池,使用连接池管理数据库连接。
  • 2、SQL语句卸载代码中造成代码不易维护,实际应用中SQL变化可能较大,SQL变动需要改变Java代码。
    • 解决:将SQL语句配置在mapper.xml文件中与Java代码分离。
  • 3、向SQL语句传参数麻烦,因为SQL语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
    • 解决:Mybatis自动将Java对象映射至SQL语句中。
  • 4、对结果集解析麻烦,SQL变化导致解析代码变化,且解析需要遍历,如果能将数据库记录封装成POJO对象解析比较方便。
    • 解决:Mybatis自动将sql执行结果映射至Java对象

Mybatis的编程步骤

  1. 创建SqlSessionFactory
  2. 通过SqlSessionFactory创建sqlSession
  3. 调用sqlSession执行数据库操作
  4. 调用session.commit()提交事务
  5. 调用session.close关闭会话

说说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. MapperStatement对象。在Executor接口的执行方法中有一个MapperStatement类型的参数,该参数是映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。

  7. 输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。

  8. 输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出参数映射过程类似于JDBC对结果集的解析过程。

    在这里插入图片描述

Mybatis都有哪些Executor执行器?他们之间的区别是什么?

Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。

  • SimpleExecutor:每一次执行update或select,就开启一个Statement对象,用完立刻关闭。
  • ReuseExecutor:执行update或者select,以sql作为可以查找Statement对象,存在就使用,不存在就创建,用完以后不关闭Statement对象,而是放置在Map集合中,供下一次使用。简言之,就是重复使用Statement对象。
  • BatchExecutor:执行update(没有select,JDBC批量处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

  • Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

  • 它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

  • 当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。

Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

  • 不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。
  • 原因就是namespace+id是作为Map<String, MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

还有很多其他的标签, < resultMap> 、 < parameterMap> 、 < sql> 、 < include> 、< selectKey> ,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中 < sql> 为sql片段标签,通过 < include> 标签引入sql片段, < selectKey> 为不支持自增的主键生成策略标签。

Mybatis是如何进行分页的?分页插件的原理是什么?

  • Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
  • 分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
  • 举例:select * from student,拦截sql后重写为:select t.* from (select * from student) t limit
    0, 10

Mybatis的一级、二级缓存

  1. 一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session
    flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
  2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其
    存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓
    存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状
    态),可在它的映射文件中配置 < cache/>
  3. 对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了
    C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

更行中…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值