zoukankan      html  css  js  c++  java
  • [Java-基础] 什么是ORM

    ORM简介

    ORM:对象关系映射:Object Relational Mapping

    用于实现面向对象编程语言里不同类型系统的数据之间的转换

    ​ 一般的,数据库绝大部分是面向关系的数据库,但是写代码的时候是用类,对象这种,而关系则不好用高级语言表示。所以经常需要把类跟表相互转化。

    • 类和表结构对应
    • 属性和字段对应
    • 对象和记录对应

    ​ 当没有ORM的时候我们是这样完成对象与关系数据库之间的映射的:

    //将执行的sql
                String sql = "SELECT name, id, age, password FROM users";
                //创建命令对象
                preparedStatement = connection.prepareStatement(sql);
                //执行并获得结果集
                resultSet = preparedStatement.executeQuery();
                //遍历结果集,将数据库中的数据转换成Java中的对象
                while(resultSet.next()){
                    String name = resultSet.getString("name");
                    int id = resultSet.getInt("id");
                    int age = resultSet.getInt("age");
                    String password = resultSet.getString("password");
                    User entity= new User(name,id,age,password);
                    Users.add(entity);
                }
    

    这段代码非常眼熟,就是Java课上写的代码。

    但是这种写法有很多弊端:

    1. 持久化层缺乏弹性。一旦出现业务需求的变更,就必须修改持久化层的接口
    2. 持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,都要修改持久化曾的相关程序代码,增加了软件的维护难度。
    3. 将和数据库交互(CRUD)的代码硬编码到JDBC程序中
    4. 实现见状的持久化层需要高超的开发技巧,而且编程量很大
    5. 对象模型和关系模型的转换非常麻烦

    上面说的可能很难理解,换一种思路。

    如果说上面代码类的属性多一个“hobby”,那么就读取不到,还必须加上相关的代码,形容一下就是原来的代码是死的,原来的代码是采取一种硬编码的方式,那么相对应的,我们需要一个“活代码”。

    ORM(O/R Mapping:对象关系映射)

    • 它是一种将内存中的对象保存到关系型数据库中的技术
    • 主要负责实体域对象的持久化,封装数据库访问细节
    • 提供了实现持久化层的另一种模式,采用映射元数据(XML)来描述对象-关系的映射细节,使得ORM中间件能在任何一个Java应用的业务逻辑层和数据库之间充当桥梁。

    上面这些暂时不懂,但是有个重要的框架mybatis,这是马上要学习的东西。

    mybatis

    先来看看mybatis的部分优点:

    • 灵活,不会对应用程序或者数据库现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用
    • 提供XML标签,支持编写动态SQL语句。
    • 提供映射标签,支持对象与数据库的ORM字段关系映射

    如果不分离的话,那就是上面所说的硬编码的形式,硬编码程序的维护性是非常差的。

    如果分离出来,java只是读取XML里的SQL语句,不需要再去改JAVA了。

    解耦合的方法非常重要!

    ORM的优缺点

    优势

    第一:隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。

    第二:ORM使我们构造固化数据结构变得简单易行。在ORM年表的史前时代,我们需要将我们的对象模型转化为一条一条的SQL语句,通过直连或是DB helper在关系数据库构造我们的数据库体系。而现在,基本上所有的ORM框架都提供了通过对象模型构造关系数据库结构的功能。这,相当不错。

    缺点

    第一:无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。

    第二:面向对象的查询语言(X-QL)作为一种数据库与对象之间的过渡,虽然隐藏了数据层面的业务抽象,但并不能完全的屏蔽掉数据库层的设计,并且无疑将增加学习成本.

    第三:对于复杂查询,ORM仍然力不从心。虽然可以实现,但是不值的。视图可以解决大部分calculated column,case ,group,having,order by, exists,但是查询条件(a and b and not c and (d or d))。

    世上没有驴是不吃草的(又想好又想巧,买个老驴不吃草),任何优势的背后都隐藏着缺点,这是不可避免的。问题在于,我们是否能容忍缺点。

    常用的ORM框架

    hibernate:全自动的框架,强大、复杂、笨重、学习成本较高

    Mybatis:半自动的框架(懂数据库的人 才能操作) 必须要自己写sql

    JPA:JPA全称Java Persistence API、JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,是Java自带的框架

    本文参考

    [1]: https://www.cnblogs.com/weibanggang/p/10167006.html
    [2]: https://blog.csdn.net/cillyb/article/details/79464374

  • 相关阅读:
    用CSS3实现上下左右箭头
    让input框只能输入数字
    给内联元素设置宽高的几种方式
    当文本溢出包含的元素时加省略号之text-overflow
    通过box盒子模型给元素内容设置居中
    CSS3中的字体rem
    封装一个取消事件冒泡的方法
    HTML5 web workes实现多线程
    通过imeMode禁用键盘只能输入数字
    jquery的children方法和css3选择器配合使用
  • 原文地址:https://www.cnblogs.com/smallocean/p/12354594.html
Copyright © 2011-2022 走看看