MyBatis
简介
1. MyBatis
是什么?
Mybatis
是一个半
ORM
(对象关系映射)框架,它内部封装了
JDBC
,开发时只需要关注
SQL
语
句本身,不需要花费精力去处理加载驱动、创建连接、创建
statement
等繁杂的过程。程序员直
接编写原生态
sql
,可以严格控制
sql
执行性能,灵活度高。
MyBatis
可以使用
XML
或注解来配置和映射原生信息,将
POJO
映射成数据库中的记录,避免了
几乎所有的
JDBC
代码和手动设置参数以及获取结果集。
2. Mybatis
优缺点
优点
与传统的数据库访问技术相比,
ORM
有以下优点:
基于
SQL
语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,
SQL
写在
XML
里,解除
sql
与程序代码的耦合,便于统一管理;提供
XML
标签,支持编写动态
SQL
语句,并
可重用
与
JDBC
相比,减少了
50%
以上的代码量,消除了
JDBC
大量冗余的代码,不需要手动开关连接
很好的与各种数据库兼容(因为
MyBatis
使用
JDBC
来连接数据库,所以只要
JDBC
支持的数据库
MyBatis
都支持)
提供映射标签,支持对象与数据库的
ORM
字段关系映射;提供对象关系映射标签,支持对象关系
组件维护
能够与
Spring
很好的集成
缺点
SQL
语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写
SQL
语句的功底有一定
要求
SQL
语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
3. Hibernate
和
MyBatis
的区别
相同点
都是对
jdbc
的封装,都是持久层的框架,都用于
dao
层的开发。
不同点
映射关系
MyBatis
是一个半自动映射的框架,配置
Java
对象与
sql
语句执行结果的对应关系,多表关联
关系配置简单
Hibernate
是一个全表映射的框架,配置
Java
对象与数据库表的对应关系,多表关联关系配
置复杂
SQL
优化和移植性
Hibernate
对
SQL
语句封装,提供了日志、缓存、级联(级联比
MyBatis
强大)等特性,此外还提
供
HQL
(
Hibernate Query Language
)操作数据库,数据库无关性支持好,但会多消耗性能。如
果项目需要支持多种数据库,代码开发量少,但
SQL
语句优化困难。
MyBatis
需要手动编写
SQL
,支持动态
SQL
、处理列表、动态生成表名、支持存储过程。开发工
作量相对大些。直接使用
SQL
语句操作数据库,不支持数据库无关性,但
sql
语句优化容易。
ORM
是什么
ORM
(
Object Relational Mapping
),对象关系映射,是一种为了解决关系型数据库数据与简单
Java
对象(
POJO
)的映射关系的技术。简单的说,
ORM
是通过使用描述对象和数据库之间映射的
元数据,将程序中的对象自动持久化到关系型数据库中。
4.
为什么说
Mybatis
是半自动
ORM
映射工具?它与全自动的区别在
哪里?
Hibernate
属于全自动
ORM
映射工具,使用
Hibernate
查询关联对象或者关联集合对象时,可以根
据对象关系模型直接获取,所以它是全自动的。
而
Mybatis
在查询关联对象或关联集合对象时,需要手动编写
sql
来完成,所以,称之为半自动
ORM
映射工具。
5.
传统
JDBC
开发存在什么问题?
频繁创建数据库连接对象、释放,容易造成系统资源浪费,影响系统性能。可以使用连接池解决这
个问题。但是使用
jdbc
需要自己实现连接池。
sql
语句定义、参数设置、结果集处理存在硬编码。实际项目中
sql
语句变化的可能性较大,一旦发
生变化,需要修改
java
代码,系统需要重新编译,重新发布。不好维护。
使用
preparedStatement
向占有位符号传参数存在硬编码,因为
sql
语句的
where
条件不一定,可
能多也可能少,修改
sql
还要修改代码,系统不易维护。
结果集处理存在重复代码,处理麻烦。如果可以映射成
Java
对象会比较方便。
6. JDBC
编程有哪些不足之处,
MyBatis
是如何解决的?
1
、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解
决此问题。
解决:在
mybatis-confifig.xml
中配置数据链接池,使用连接池管理数据库连接。
2
、
Sql
语句写在代码中造成代码不易维护,实际应用
sql
变化的可能较大,
sql
变动需要改变
java
代
码。
-
解决:将
Sql
语句配置在
XXXXmapper.xml
文件中与
java
代码分离。
3
、向
sql
语句传参数麻烦,因为
sql
语句的
where
条件不一定,可能多也可能少,占位符需要和参
数一一对应。
解决:
Mybatis
自动将
java
对象映射至
sql
语句。
4
、对结果集解析麻烦,
sql
变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装
成
pojo
对象解析比较方便。
解决:
Mybatis
自动将
sql
执行结果映射至
java
对象。
7. MyBatis
和
Hibernate
的适用场景
?
MyBatis
专注于
SQL
本身,是一个足够灵活的
DAO
层解决方案。
对性能的要求很高,或者需求变化较多的项目,如互联网项目,
MyBatis
将是不错的选择。
开发难易程度和学习成本
Hibernate
是重量级框架,学习使用门槛高,适合于需求相对稳定,中小型的项目,比如:办公自
动化系统
MyBatis
是轻量级框架,学习使用门槛低,适合于需求变化频繁,大型的项目,比如:互联网电子
商务系统
总结
MyBatis
是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,
Hibernate
是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。
MyBatis
的架构
8. MyBatis
编程步骤是什么样的?
1
、 创建
SqlSessionFactory
2
、 通过
SqlSessionFactory
创建
SqlSession
3
、 通过
sqlsession
执行数据库操作
4
、 调用
session.commit()
提交事务
5
、 调用
session.close()
关闭会话
9.
请说说
MyBatis
的工作原理
在学习
MyBatis
程序之前,需要了解一下
MyBatis
工作原理,以便于理解程序。
MyBatis
的工作
原理如下图
1.
读取
MyBatis
配置文件:
mybatis-confifig.xml
为
MyBatis
的全局配置文件,配置了
MyBatis
的运
行环境等信息,例如数据库连接信息。
2.
加载映射文件。映射文件即
SQL
映射文件,该文件中配置了操作数据库的
SQL
语句,需要在
MyBatis
配置文件
mybatis-confifig.xml
中加载。
mybatis-confifig.xml
文件可以加载多个映射文
件,每个文件对应数据库中的一张表。
3.
构造会话工厂:通过
MyBatis
的环境等配置信息构建会话工厂
SqlSessionFactory
。
4.
创建会话对象:由会话工厂创建
SqlSession
对象,该对象中包含了执行
SQL
语句的所有方法。
5. Executor
执行器:
MyBatis
底层定义了一个
Executor
接口来操作数据库,它将根据
SqlSession
传递的参数动态地生成需要执行的
SQL
语句,同时负责查询缓存的维护。
6. MappedStatement
对象:在
Executor
接口的执行方法中有一个
MappedStatement
类型的参