zoukankan      html  css  js  c++  java
  • 【JavaEE】之MyBatis与原生JDBC、Hibernate访问数据库的比较

      首先来看一下原生JDBC访问数据库的代码:

    public static void main(String[] args) {
        // 数据库连接
        Connection connection = null;
        // 预编译的Statement,使用预编译的Statement提高数据库的性能
        PreparedStatement statement = null;
        // 结果集
        ResultSet resultSet = null;
        try {
            // 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 通过驱动管理类获取数据库的连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
            // 定义SQL语句,“?”表示占位符
            String sql = "select * from emp where ename = ?";
            // 获取预处理的Statement
            statement = connection.prepareStatement(sql);
            // 设置参数,第一个参数为SQL语句中占位符的序号(从1开始),第二个参数是设置的参数值
            statement.setString(1, "smith");
            // 向数据库发出SQL进行查询,查询出结果集
            resultSet = statement.executeQuery();
            // 遍历结果集
            while (resultSet.next()) {
                System.out.println(resultSet.getInt("empno") + "	" + resultSet.getString("ename"));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

      使用原生JDBC访问数据库,存在以下四个问题:

    • 数据库使用时就创建,不使用就释放,即需要对数据库进行频繁的开启和关闭,造成数据库资源的浪费,影响数据库的性能。
    • 将SQL语句硬编码到JAVA代码中,如果后期SQL语句发生变化,就需要重新编译JAVA代码,不利于系统的维护。
    • PreparedStatement中传入的参数都硬编码进了JAVA代码中,不利于系统的维护。
    • 从ResultSet中遍历结果集时,将字段名都进行了硬编码,不利于系统的维护。

      针对上面的四个问题,MyBatis都对其进行了一一解决:

    • 针对上面的第一个问题,MyBatis使用了数据库连接池进行数据库管理。在SSM框架中,常用的数据库连接池有 dbcp、c3p0、druid 等,现在最常用的是 druid 。
    • 针对上面的第二个问题,MyBatis的解决方案是创建Mapper.xml文件对SQL语句进行统一的管理。
    • 针对上面的第三个问题,MyBatis的解决方案是将参数以parameterType的方式注入到Mapper.xml中的SQL语句中。
    • 针对上面的第四个问题,MyBatis的解决方案是以resultType的方式将结果自动映射成JAVA对象。

      以上是MyBatis与JAVA原生JDBC访问数据库的比较。下面介绍一下MyBatis与Hibernate之间访问数据库的比较。

    (1)字段注入

    • Hibernate是SSH框架(Struts2 + Spring + Hibernate)中的一部分,我们只需要定义与数据表字段相同或基本相同的POJO,就可以在运行的时候动态的将POJO中的字段映射到数据库中,这种方式操作耗时多。
    • MyBatis是SSM框架(Spring + SpringMVC + MyBatis)中的一部分,MyBatis是将数据表映射成JAVA对象,通过输入映射、输出映射对数据表进行操作,所有数据和表结构都是从数据库中映射来的,因此MyBatis相比与Hibernate耗时较少。

    (2)SQL编写

    • Hibernate不需要程序员编写SQL语句,所有的SQL语句都是自动生成的,程序员只需要调用insert、select、update、delete等方法就可以了,但这种方式对SQL优化以及一些比较复杂的SQL语句束手无策,而且如果表结构发生变化,那么Hibernate就需要重新将POJO映射到数据库,耗时很大,因此Hibernate适合那些需求变化不多的中小型项目,如后台管理系统、ERP等等。
    • MyBatis需要程序员自己编写SQL语句,这使得系统可以完全轻松的应对复杂的SQL以及SQL优化,而且由于MyBatis是从数据库映射到POJO对象,因此不需要考虑表结构变化后引起的映射耗时,适合需求变化较多的项目,如互联网项目等。

      从上面的分析来看,无论从性能、耗时,还是后期的维护角度,MyBatis相比与JDBC和Hibernate,似乎都有一定的优势,也许这就是为什么SSM现在很火的原因吧。

  • 相关阅读:
    redis客户端连接,最大连接数查询与设置
    基于php实现QQ授权登陆 --qq授权登录
    在H5页面内通过地址调起高德地图实现导航
    数据库备份的两种方法
    ThinkPHP5.0 实现 app支付宝支付功能
    jQuery选取所有复选框被选中的值并用Ajax异步提交数据
    php 微信公众号接入支付宝支付
    MySQL查询优化
    php函数的使用技巧
    安装Django时解决的问题-mysql及访问(附pycharm激活)
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6211309.html
Copyright © 2011-2022 走看看