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

  • 相关阅读:
    Educational Codeforces Round 67 D. Subarray Sorting
    2019 Multi-University Training Contest 5
    Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code
    Educational Codeforces Round 69 D. Yet Another Subarray Problem
    2019牛客暑期多校训练第六场
    Educational Codeforces Round 68 E. Count The Rectangles
    2019牛客多校第五场题解
    2019 Multi-University Training Contest 3
    2019 Multi-University Training Contest 2
    [模板] 三维偏序
  • 原文地址:https://www.cnblogs.com/smallocean/p/12354594.html
Copyright © 2011-2022 走看看