MyBatis与JDBC和Hibernate的比较
Mybatis学习(-)---了解多用ORM框架
本章主要介绍 了Java ORM 的来源和历史 ,同时分别介绍 了JDBC 、Hibernate 和 MyBatis三种访问数据库的方法,在分析它们优缺点 的基础上 ,比较它们之间的 区别和适用的场景。
1、传统的JDBC
Java 程序都是通过 JDBC (Java Data Base Connectivity ) 连接数据库的,这样我们就可 以通过 SQL 对数据库编程。JDBC 是由 SUN 公司 ( SUN 公司后被 Oracle 公司收购〉 提出 的一系列规范,但是它只定义了接口规范,而具体的实现是交由各个数据库厂商去实现 的, 因为每个数据库都有其特殊性,这些是 Java 规范没有办法确定的,所以 JDBC 就是一种典 型的桥接模式。
传统的JDBC 编程的使用给我们带来了连接数据库的功能,但是也引发了 巨大的问题。
public class JDBCExample { public static final String URL = "jdbc:mysql://localhost:3306/imooc"; public static final String USER = "liulx"; public static final String PASSWORD = "123456"; public static void main(String[] args) throws Exception { //1.加载驱动程序 Class.forName("com.mysql.jdbc.Driver"); //2. 获得数据库连接 Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); //3.操作数据库,实现增删改查 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM imooc_goddess"); //如果有数据,rs.next()返回true while(rs.next()){ System.out.println(rs.getString("user_name")+" 年龄:"+rs.getInt("age")); } } }
1.2 JDBC执行流程
从代码中我们可以看出整个过程大致分为以下几步:
- 使用 JDBC 编程需要连接数据库,注册驱动和数据库信息。
- 操作 Connection ,打开 Statement 对象。
- 通过 Statement 执行 SQL ,返回结果到 ResultSet 对象。
- 使用 ResultSet 读取数据,然后通过代码转化为具体的 POJO 对象。
- 关闭数据库相关资源。
1.3 传统JDBC问题
- 工作量相对较大。我们需要先连接 ,然 后处理 JDBC 底层事务 ,处理数据类型。我们还需要操作 Connection 对象、Statement 对象和 ResultSet 对象去拿到数据 ,并准确关闭它们。
- 需要对JDBC这种方式产生的异常进行正确的捕获并正确的关闭资源
3、ORM 模型
由于 JDBC 存在的缺陷,在实际工作中我们很少使用 JDBC 进行编程 ,于是提出了对 象关系映射 C Object Relational Mapping ,简称 ORM ,或者 O/RM ,或者 O/R mapping ) 。那 什么是 ORM 模型呢?
简单地说 ,ORM 模型就是数据库的表和简单 Java 对象 ( Plain Ordinary Java Object, 简称 POJO ) 的映射关系模型,它主要解决数据库数据和 POJO 对象的相互映射。我们通过 这层映射关系就可以简单迅速地把数据库表的数据转化为 POJO,以便程序员更加容易理解 和应用 Java 程序
有了 ORM 模型,在大部分情况下,程序员只需要了解 Java 应用而无需对数据库相关知识深入了解 ,便可以写出通俗易懂的程序。此外,ORM 模型提供了统一的规则使得数据 库的数据通过配置便可轻易映射到 POJO 上。
4、Hibernate简介
Hibernate 是由 Gavin King 于 2001 年创建的开放源代码的对象关系框架。它强大且高效的构建具有关系对象持久性和查询服务的 Java 应用程序。
Hibernate 将 Java 类映射到数据库表中,从 Java 数据类型中映射到 SQL 数据类型中,并把开发人员从 95% 的公共数据持续性编程工作中解放出来。
Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。
4.1 Hibernate 优势
- Hibernate 使用 XML 文件来处理映射 Java 类别到数据库表格中,并且不用编写任何代码。
- 为在数据库中直接储存和检索 Java 对象提供简单的 APIs。
- 如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML 文件属性。
- 抽象不熟悉的 SQL 类型,并为我们提供工作中所熟悉的 Java 对象。
- Hibernate 不需要应用程序服务器来操作。
- 操控你数据库中对象复杂的关联。
- 最小化与访问数据库的智能提取策略。
- 提供简单的数据询问。
4.2 Hibernate 劣势
- 全表映射带来的不方便,查询每次都是查询表中所有字段(表一共有上百个字段,如果你只需要两个),每次更新都对所有字段进行update
- 无法根据不同条件组装不同的sql
- 对多表关联和复杂的sql支持较差,需要手写sql,需要自己将放回数据组装成pojo
- 不能有效支持存储过程
- 虽有hql,但新能较差
5、MyBatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
5.1 MyBatis 优势
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
- 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql
5.2 MyBatis劣势
- 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
- SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
- 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
- 二级缓存机制不佳