MyBatis是一个基于SQL开发的半ORM组件。
优点:
- 简单易学,容易上手(相比于Hibernate) —— 基于SQL编程,灵活
- 消除了JDBC大量冗余的代码,不需要手动开关连接
- 提供了很多第三方插件(分页插件 / 逆向工程)
- 能够与Spring很好的集成
缺点:
- SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
- SQL语句的编写工作量较大
1. 其他 ORM 比较
用hibernate开发可以节省很多代码,提高效率。
对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。
2. MyBatis的基本工作原理
先封装SQL,接着调用JDBC操作数据库,最后把数据库返回的表结果封装成Java类
我们知道,JDBC有四个核心对象:
(1)DriverManager,用于注册数据库连接
(2)Connection,与数据库连接对象
(3)Statement/PrepareStatement,操作数据库SQL语句的对象
(4)ResultSet,结果集或一张虚拟表
而MyBatis也有四大核心对象:
(1)SqlSession对象,该对象中包含了执行SQL语句的所有方法。类似于JDBC里面的Connection。
(2)Executor接口,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。类似于JDBC里面的Statement/PrepareStatement。
(3)MappedStatement对象,该对象是对映射SQL的封装,用于存储要映射的SQL语句的id、参数等信息。
(4)ResultHandler对象,用于对返回的结果进行处理,最终得到自己想要的数据格式或类型。可以自定义返回类型。
Mybatis中的Dao接口和XML文件里的SQL是如何建立关系的
2.1 解析 xml
Mybatis在初始化SqlSessionFactoryBean的时候,找到mapperLocations路径去解析里面所有的XML文件
1、创建SqlSource
Mybatis会把每个SQL标签封装成SqlSource对象,然后根据SQL语句的不同,又分为动态SQL和静态SQL。
其中,静态SQL包含一段String类型的sql语句;而动态SQL则是由一个个SqlNode组成。
2、创建MappedStatement
XML文件中的每一个SQL标签就对应一个MappedStatement对象,这里面有两个属性很重要。
id:全限定类名+方法名组成的ID。
sqlSource:当前SQL标签对应的SqlSource对象。
创建完MappedStatement对象,将它缓存到Configuration#mappedStatements中。
Configuration对象就是Mybatis中的大管家,基本所有的配置信息都维护在这里。把所有的XML都解析完成之后,Configuration就包含了所有的SQL信息。
XML就解析完成了。当我们执行Mybatis方法的时候,就通过全限定类名+方法名找到MappedStatement对象,然后解析里面的SQL内容
2.2 @MapperScan(“com.xxx.dao”)
它们的作用是一样的。将包路径下的所有类注册到Spring Bean中,并且将它们的beanClass设置为MapperFactoryBean。MapperFactoryBean实现了FactoryBean接口,俗称工厂Bean。那么,当我们通过@Autowired注入这个Dao接口的时候,返回的对象就是MapperFactoryBean这个工厂Bean中的getObject()方法对象。
那么,这个方法干了些什么呢?
简单来说,它就是通过JDK动态代理,返回了一个Dao接口的代理对象,这个代理对象的处理器是MapperProxy对象。所有,我们通过@Autowired注入Dao接口的时候,注入的就是这个代理对象,我们调用到Dao接口的方法时,则会调用到MapperProxy对象的invoke方法。
对这块内容不太能理解的朋友,可以先看看Spring中的FactoryBean 和 JDK动态代理相关知识
曾经有个朋友问过这样一个问题:
对于有实现的dao接口,mapper还会用代理么?
答案是肯定,只要你配置了MapperScan,它就会去扫描,然后生成代理。但是,如果你的dao接口有实现类,并且这个实现类也是一个Spring Bean,那就要看你在Autowired的时候,去注入哪一个了。
2.3 执行
当调用Dao接口方法的时候,实际调用到代理对象的invoke方法。 在这里,实际上调用的就是SqlSession里面的东西了。
是通过statement全限定类型+方法名拿到MappedStatement 对象,然后通过执行器Executor去执行具体SQL并返回。(由于根据方法名找到对象,所以不能重载)
3. 标签介绍
常见的select|insert|updae|delete标签之外
Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值完成逻辑判断并动态拼接sql的功能。
Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。