MyBatis 是一个开源、轻量级的数据持久化框架,是 JDBC 和 Hibernate 的替代方案。MyBatis 内部封装了 JDBC,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,开发者只需要关注 SQL 语句本身。
数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。
MyBatis
支持定制化 SQL
、存储过程以及高级映射,可以在实体类和 SQL
语句之间建立mapping
映射关系,是一种半自动化的 ORM
实现。其封装性低于 Hibernate
,但性能优秀、小巧、简单易学、应用广泛。
ORM
(Object
Relational
Mapping
,对象关系映射)是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过 JavaBean 对象去操作数据库表中的数据。
MyBatis
的主要思想是将程序中的大量 SQL
语句剥离出来,使用 XML
文件或注解的方式实现 SQL
的灵活配置,将 SQL
语句与程序代码分离,在不修改程序代码的情况下,直接在配置文件中修改 SQL
语句。MyBatis
与其它持久性框架最大的不同是,MyBatis
强调使用 SQL
,而其它框架(例如 Hibernate
)通常使用自定义查询语言,即 HQL
(Hibernate
查询语言)或EJB QL
(Enterprise JavaBeans
查询语言)。
MyBatis是免费开源的。
与JDBC相比,减少了50%以上的代码量。
MyBatis是最简单的持久化框架,体积小并且学习门槛低。
MyBatis
相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL 写在 XML 中,和程序逻辑代码分离,降低耦合度,便于同一管理和优化,提高了代码的可重用性。
提供xml标签,支持编写动态SQL语句。
提供字段标签,支持实体对象与数据库的表字段的关系映射。
编写SQL语句工作量较大,对开发人员的数据库SQL语句的功底有一定的要求。
SQL语句依赖于数据库,导致数据库的移植性差,不能随便更改数据库。
第一步:准备工作
1.下载并添加MyBatis依赖Releases · mybatis/mybatis-3 · GitHub
2.创建数据库表结构
3.创建实体类
第二步:SQL映射文件
第三步:核心配置文件
MyBatis 核心配置文件主要用于配置数据库连接和 MyBatis运行时所需的各种特性,包含了设置和影响 MyBatis 行为的属性。
第四步:日志文件
MyBatis 默认使用 log4j 输出日志信息,如果开发者需要查看控制台输出的 SQL 语句,可以在 classpath 路径下配置其日志文件。
第五步:测试类
在 src 目录下创建一个名为com.apesource.test 的包,在该包中创建 MyBatisTest 测试类。在测试类中首先使用输入流读取配置文件,然后根据配置信息构建 SqlSessionFactory 对象。接下来通过 SqlSessionFactory 对象创建 SqlSession 对象,并使用 SqlSession 对象的方法执行数据库操作。
MyBatis 的核心接口和类包括:SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession。
使用步骤:
1首先,获取 SqlSessionFactoryBuilder对象,可以根据 XML 配置文件或者 Configuration 类的实例构建该对象。
2其次,通过 SqlSessionFactoryBuilder对象来获取 SqlSessionFactory 对象。
3最后,获取 SqlSessionFactory 对象之后,就可以进一步获取 SqlSession 实例。SqlSession 对象中完全包含以数据库为背景的所有执行 SQL 操作的方法,用该实例可以直接执行已映射的 SQL 语句。
这个类可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory
,就不再需要它了。 因此 SqlSessionFactoryBuilder
实例的最佳作用域是方法作用域(也就是局部方法变量)。 可以重用 SqlSessionFactoryBuilder
来创建多个 SqlSessionFactory
实例。
SqlSessionFactory
一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory
的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory
被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是"应用作用域"。即随着应用程序的生命周期一直存在。这种“存在于整个应用运行期间,并且只存在一个对象实例”。例如使用单例模式。
每个线程都应该有它自己的 SqlSession
实例。SqlSession
的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession
实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally
块中。 下面的示例就是一个确保 SqlSession
关闭的标准模式: