Mybatis背景简介及其优缺点

  • Post author:
  • Post category:其他




1. JDBC简介

JDBC全称

Java Database Connectivity

,是Java语言规范客户端访问数据库的应用程序接口,所面向的数据库类型为

关系型数据库



1.1 jdbc架构图

jdbc架构图

JDBC 的 API 提供了以下接口和类:


  • DriverManager

    :这个类管理一系列数据库驱动程序。匹配连接使用通信子协议从 JAVA 应用程序中请求合适的数据库驱动程序。识别 JDBC 下某个子协议的第一驱动程序将被用于建立数据库连接。


  • Driver

    : 这个接口处

    理与数据库服务器的通信

    。你将很少直接与驱动程序互动。相反,你使用 DriverManager 中的对象,它管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息。


  • Connection

    : 此接口具有

    接触数据库的所有方法

    。该连接对象表示通信上下文,即所有与数据库的通信仅通过这个连接对象进行。


  • Statement

    : 使用创建于这个接口的对象

    将 SQL 语句提交到数据库

    。除了执行存储过程以外,一些派生的接口也接受参数。


  • ResultSet

    : 在你使用语句对象执行 SQL 查询后,这些对象

    保存从数据库获得的数据

    。它作为一个迭代器,让您可以通过它的数据来移动。


  • SQLException

    : 这个类处理发生在数据库应用程序的任何错误。



1.2 jdbc例子

public class JdbcTest {
    public static void main(String[] args) {
        //数据库连接
        Connection connection = null;
        //预编译的Statement,使用预编译的statement的可以提高性能,使用statement操作数据库
        PreparedStatement preparedStatement = null;
        //结果集
        ResultSet resultSet = null;

        try {
            //加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            //通过数据驱动管理类获取数据库链接
            connection =DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatisdata?characterEncoding=utf-8","root","root");
            //定义sql语句,其中?标识占位符
            String sql = "select * from user where id = ?";
            //获取预处理statement
            preparedStatement = connection.prepareStatement(sql);
            //设置参数,第一个参数为sql中参数的序号,第二个参数为设置的参数值
            preparedStatement.setInt(1,1);
            //向数据库发出sql查询,查询出数据集
            resultSet = preparedStatement.executeQuery();
            //遍历查询结果
            while(resultSet.next()){
                System.out.println(resultSet.getString("id")+"->"+resultSet.getString("username")+"->"+resultSet.getString("sex"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //释放资源
            if(resultSet != null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(preparedStatement!=null){
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection != null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}



1.3 jdbc缺点

从代码中可以看到jdbc很多缺点,比如:


  1. 每次访问数据库都需要创建数据库连接

    ,最后不需要使用还得释放连接,频繁地连接释放连接会造成

    系统资源浪费

    ,从而

    影响系统性能


  2. 需要在Java代码里面编写SQL语句

    ,SQL语句发生改动,需要重新编译Java代码,就种硬编码的方式造成代码

    不易维护

    的缺点;
  3. Preparedstatement中

    设置的参数要与占位符在数量上一一对应

    ,而且查询的条件不确定,参数或多或少,这就能引起很多麻烦;
  4. ResultSet中

    遍历结果时,需要对应相应数据库字段

    ,这些字段属于硬编码,也不利于系统的维护。



2. Mybatis



2.1 iBATIS是什么

提到Mybatis,就不能不想到iBATIS,那么iBATIS到底和Mybatis有什么关系呢?

Mybatis的前身是iBATIS,是Clinton Begin在2001年发起的一个开源项目,最初侧重于密码软件的开发,后来发展为一款基于Java的持久层框架。2004年Clinton 将iBATIS捐给Apache软件基金会,2010年iBATIS改名Mybatis,所以iBATIS和Mybatis是同一个东西不同阶段。



2.2 Mybatis是什么

Mybatis是一款

优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索

Mybatis可以使用

XML或者注解进行配置和映射,通过将参数映射到配置中的SQL,形成最终执行的SQL语句,最终将执行SQL语句的结果映射到Java对象返回



2.3 和其他持久层框架的本质区别

与其他映射框架本质区别:


Mybatis

不是把 Java对象 直接和数据库联系起来,而是把

Java对象



SQL语句

联系起来,把对象传进SQL语句来设置参数。

而其他映射框架,比如

Hibernate

是直接将

Java对象



数据库表字段

联系起来。



2.4 Mybatis和Hibernate的共同点

  • 从配置文件(通常是 XML 配置文件中)得到 sessionfactory.
  • 由 sessionfactory 产生 session
  • 在 session 中完成对数据的增删改查和事务提交等.
  • 在用完之后关闭 session 。
  • 在 Java 对象和 数据库之间有做 mapping 的配置文件,也通常是 xml 文件。



2.5 Mybatis的优缺点



2.5.1 Mybatis的优点

  • 易于上手和掌握。
  • sql写在xml里,便于统一管理和优化。
  • 解除sql与程序代码的耦合。
  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql。



2.5.2 Mybatis的缺点

  • sql工作量很大,尤其是字段多、关联表多时,更是如此。
  • sql依赖于数据库,导致数据库移植性差。
  • 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
  • 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。
  • DAO层过于简单,对象组装的工作量较大。
  • 不支持级联更新、级联删除。
  • 编写动态sql时,不方便调试,尤其逻辑复杂时。
  • 提供的写动态sql的xml标签功能简单,编写动态sql仍然受限,且可读性低。
  • 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
  • 参数的数据类型支持不完善。
  • 多参数时,使用不方便,功能不够强大。
  • 缓存使用不当,容易产生脏数据。



2.6 Hibernate的优缺点



2.6.1 Hibernate的优点

  • Hibernate 使用 XML 文件来处理映射 Java 类别到数据库表格中,并且不用编写任何代码。
  • 为在数据库中直接储存和检索Java 对象提供简单的 APIs。
  • 如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML 文件属性。
  • 抽象不熟悉的 SQL类型,并为我们提供工作中所熟悉的 Java 对象。
  • Hibernate 不需要应用程序服务器来操作。
  • 操控你数据库中对象复杂的关联。
  • 最小化与访问数据库的智能提取策略。
  • 提供简单的数据询问。



2.6.2 Hibernate的缺点

  • 全表映射带来的不便,比如

    更新时需要发送所有的字段

  • 无法根据

    不同的条件组装不同的SQL

  • 对多表关联和复杂的sql查询支持较差,需要自己写sql,返回后,需要自己将数据封装为pojo。
  • 不能

    有效的支持存储过程

  • 虽然有HQL,但是性能较差,大型互联网系统往往需要优化sql,而hibernate做不到。



2.7 Mybatis和Hibernate的应用场景

  • Mybatis适用于

    需求多变

    的互联网项目,例如电商项目。
  • Hibernate适用于

    需求明确、业务固定

    的项目,例如OA项目、ERP项目等。



2.8 总结


Hibernate

是一个

标准的

ORM映射框架,程序员

无需配置SQL语句

,只需要配置好Java对象与数据库的映射文件.hbm.xml,但是

对SQL的优化和修改是比较困难的


Mybatis

是一个

不完整的

ORM映射框架,需要程序员

编写SQL语句

,这很考验程序员的能力,

对SQL语句的优化和修改是比较方便的

。面对需求量变化比较多的项目来说,选用Myabtis是比较适合的。



3. 参考


https://www.cnblogs.com/magic-sea/p/11189849.html



版权声明:本文为sutong_first原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。