说说你对mybatis的理解

Mybatis是什么

  1. mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发只需关注SQL语句本身,不需要花费时间去处理加载驱动,创建连接,创建statement对象等繁琐过程。直接编写原生态SQL,执行。
  2. mybatis可以使用XML或者注解的形式来配置和映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
  3. 通过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

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值