• 由浅入深--ORM简介


      一、ORM简介

       从传统的JDBC开始说起

       下面是通过JDBC连接Oracle的步骤,如下代码所示;

         Connection conn = null;
            PreparedStatement stmt = null;
            ResultSet result = null;
            List<UserDTO> users=new ArrayList<UserDTO>();
            try {
                Properties pro = new Properties();
                pro.put("user", userName);
                pro.put("password", password);
                conn = DriverManager.getConnection(url, pro);
                stmt = conn.prepareStatement("select * from test_user");
                result = stmt.executeQuery();
                while (result.next()) {
                    //实际应用中,要把这里进行转换为JavaBean对象。
                    UserDTO  user=new UserDTO();
                    user.setId(result.getInt("id"));
                    user.setName(result.getString("name"));
                    users.add(user);
                }
                for (UserDTO user : users) {
                    System.out.println(user);
                }
            } catch (SQLException ex) {
                System.out.println("SQLException" + ex.getMessage());
                System.out.println("SQLState" + ex.getSQLState());
                System.out.println("VennorError" + ex.getErrorCode());
            } finally {
                result.close();
                stmt.close();
                conn.close();
            }

      从上面代码可知,主要步骤如下:

      1、明确指定数据库URL地址,数据库用户名,密码等连接信息;

      2、通过DriverManager打开数据库连接;

      3、通过数据库创建PreparedStatement对象;

      4、通过PreparedStatement对象执行SQL执行语句,得到ResultSet对象。

      5、通过ResultSet读取数据,并将数据转换为JavaBean对象。

      6、关闭ResultSet,PreparedStatement对象以及数据库连接,释放相关资源。

          通过上述步骤1,步骤4以及步骤6在每次查询操作中都会出现,在保存,更新,删除等其他数据库操作中也有类似重复性代码。在实践中,我们通常把重复性代码放到DBUtils的工具类中,步骤5,完成了关系模型到对象模型的转换,使用比较通用的方式来封装这种复杂的转换是比较困难的。为了解决该问题,ORM(对象关系映射应运而生); 对应关系如下图所示;

         

        除此之外,实际生产环境中,对系统的性能是有一定要求的,数据库作为系统中比较珍贵的资源,极易成为整个系统的性能瓶颈,所以我们不能像上述JDBC操作那样简单粗暴直接的操作数据库,直接关闭数据库连接。应用程序一般通过集成换成,数据源,数据库连接池等组件进行优化,如果没有ORM框架的存在,就要求开发人员熟悉相关组件API并手动编写集成相关代码,这就提高了开发难度和延长了开发周期。

           二、MyBatis和Hibernate对比

    • 在DAO的设计过程中,我们经常要处理模型实体对象和关系数据库表之间的双向转换问题,怎么样将对象属性和关联关系映射到数据库的表上去?有很多持久化的框架给出了自己的解决方案,我们来看看MyBatis和Hibernate。
    • MyBatis的思路是:使用XML或者注解方式来配置ORM,把SQL用标签管理起来,但不关心,也不干涉实际的书写。
      • 在这种思路下框架很轻量,很容易集成,又因为我们可以使用所有的SQL特性,可以写存储过程,也可以写纯SQL,所以灵活度相当高。当然灵活也意味着在具体实现功能的时候,你需要做更多,不但要关系模型层,SQL还要关心两者怎么样映射起来;具体包括:
        • 1、请求参数映射,即模型的值怎么映射到SQL的变参数里面
        • 2、返回值映射,即将怎样将数据库查询返回的记录成模型对象
    • Hibernate则是一种思路,如果你习惯了和模型层打交道,那么它将SQL层对你隐藏起来了。换句话说,你只需要将模型代码和HQL这种面向对象查询语言可以了,至于SQL的生产,框架可以帮你完成。
      • 好处:就是具体的数据库透明性,你今天使用了数据库MySQL,明天你就可以换成Oracle,并且不用改代码。在分析设计 时候,你只需要做自己习惯的模型驱动编程就可以了。
      • 弊:较高的学习曲线,在出现问题的时候,无论功能性还是性能的问题,都需要更多的知识储备进行问题的定位和性能的调试。
    • 总结
      • 从框架本身的角度来说,Hibernate提供的特性远弊Mybatis更丰富,更完整,如果你是一位有着一定ORM经验的程序,那么Hibernate可能会是你的开发效率更高;
      • 对于一个新项目而言,在技术选型的过程中,如果你团队中没有非常多的经验丰富程序员,我建议持久层不要考虑Hibernate。简单来说,Hibernate里面的水很深,很重。MyBatis是直接面对SQL,无论是对程序员和二线运维和DBA都是更加清晰和直接。
  • 相关阅读:
    Are we still talking about Stored Procedures vs. Dynamic SQL?(转)
    异常处理的讨论
    一些面向对象的设计法则(1)
    合作式调度器Cooperative Scheduler
    iOSExcel文件创建
    FlutterMac环境配置、xcode打开Flutter项目
    Excel编程VBA图形Shape复选框的状态判断
    Termux 搭建kali工作站
    中望CAD的个人使用习惯调整
    Termux 搭建个人工作
  • 原文地址:https://www.cnblogs.com/gdouzz/p/12027288.html
Copyright © 2020-2023  润新知