当前位置: 首页 > news >正文

ORM mybits mybits-plus

ORM

ORM 即对象关系映射(Object Relational Mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。下面从基本概念、工作原理、优势与劣势、常见的 ORM 框架等方面详细介绍 ORM。

常见的orm框架有:Mybatis-plus(ibatis)、Hibernate、Jpa。

基本概念

在软件开发中,面向对象编程(OOP)使用对象来表示数据和处理逻辑,而关系型数据库(RDBMS)则使用表、行和列来存储数据。这两种模型在数据表示和操作方式上存在差异,ORM 就是为了解决这种差异而出现的技术。它将数据库中的表映射为对象,表中的行映射为对象的实例,列映射为对象的属性,从而让开发者可以使用面向对象的方式来操作数据库,而无需编写复杂的 SQL 语句。

工作原理

ORM 框架的核心工作流程如下:

  1. 映射配置:开发者需要定义对象和数据库表之间的映射关系。这可以通过注解、XML 配置文件等方式来实现。例如,在 Java 中使用 Hibernate 框架时,可以使用 @Entity@Table@Column 等注解来指定对象和表的映射关系。
  2. 对象操作:开发者使用面向对象的方式对对象进行创建、读取、更新和删除(CRUD)操作。例如,创建一个对象实例并设置其属性值,然后调用 ORM 框架提供的方法将对象保存到数据库中。
  3. SQL 生成:ORM 框架根据对象的操作和映射配置,自动生成相应的 SQL 语句。例如,当调用保存对象的方法时,ORM 框架会生成 INSERT 语句;当调用查询对象的方法时,会生成 SELECT 语句。
  4. 数据库交互:ORM 框架将生成的 SQL 语句发送到数据库执行,并将数据库返回的结果集转换为对象实例。例如,将查询结果集中的每一行数据转换为一个对象实例,并将列值赋给对象的属性。

优势

  • 提高开发效率:开发者可以使用面向对象的方式操作数据库,避免编写大量的 SQL 语句,减少了开发时间和工作量。
  • 降低代码耦合度:将数据库操作封装在 ORM 框架中,使业务逻辑和数据库操作分离,提高了代码的可维护性和可测试性。
  • 支持跨数据库:ORM 框架可以屏蔽不同数据库之间的差异,开发者可以在不修改业务代码的情况下切换数据库。

劣势

  • 性能开销:ORM 框架需要进行对象和数据库之间的映射和转换,会带来一定的性能开销。在处理大量数据或复杂查询时,性能可能不如原生 SQL。
  • 学习成本:使用 ORM 框架需要学习框架的使用方法和配置规则,对于初学者来说可能有一定的学习成本。
  • 复杂查询受限:对于一些复杂的 SQL 查询,ORM 框架可能无法直接支持,需要编写原生 SQL 语句。

常见的 ORM 框架

  • Java 中的 Hibernate:是一个广泛使用的 Java ORM 框架,功能强大,支持多种数据库,提供了丰富的映射配置和查询功能。
  • Java 中的 MyBatis:是一个轻量级的 Java ORM 框架,它允许开发者灵活地编写 SQL 语句,同时也提供了对象映射功能。
  • Python 中的 SQLAlchemy:是一个流行的 Python ORM 框架,支持多种数据库,提供了高级的查询和事务管理功能。
  • .NET 中的 Entity Framework:是微软官方提供的 .NET ORM 框架,与 .NET 平台紧密集成,支持多种数据库。

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

Java           数据库

Integer      Integer

String         varchar

ORM的优点:

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

ORM的缺点:

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

 2,对多表查询力不从心。

JDBC(Java Database Connectivity)

概念

JDBC 是 Java 编程语言用于与数据库进行交互的标准 API,它为 Java 开发人员提供了一种统一的方式来访问各种不同类型的数据库,如 MySQL、Oracle、SQL Server 等。通过 JDBC,开发者可以执行 SQL 语句,实现对数据库的增删改查操作。

工作原理

  1. 加载数据库驱动:不同的数据库有不同的 JDBC 驱动程序,需要使用 Class.forName() 方法加载相应的驱动类。
  2. 建立数据库连接:使用 DriverManager.getConnection() 方法,传入数据库的 URL、用户名和密码,建立与数据库的连接。
  3. 创建 Statement 对象:通过连接对象创建 StatementPreparedStatement 或 CallableStatement 对象,用于执行 SQL 语句。
  4. 执行 SQL 语句:使用 Statement 对象的 executeQuery()executeUpdate() 等方法执行 SQL 语句。
  5. 处理结果集:如果执行的是查询语句,会返回一个 ResultSet 对象,通过该对象可以遍历查询结果。
  6. 关闭资源:使用完数据库连接、Statement 对象和 ResultSet 对象后,需要关闭它们,以释放资源。

缺点:

  1. 编码繁琐,效率低(指的是编码效率低,重复代码多)。
  2. 数据库连接的创建和释放比较重复,也造成了系统资源的浪费
  3. 大量硬编码,缺乏灵活性,不利于后期维护
  4. 参数的赋值和数据的封装全是手动进行
try {

     //加载数据库驱动

     Class.forName("com.mysql.jdbc.Driver");

    //通过驱动管理类获取数据库链接

    Connection connection =     
           DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123");

//定义sql语句?表示占位符

    String sql = "select * from t_book where author = ?";

//获取预处理statement

    PreparedStatement  preparedStatement = connection.prepareStatement(sql);

//设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值

    preparedStatement.setString(1, "张三");

//向数据库发出sql执行查询,查询出结果集

    ResultSet  resultSet =  preparedStatement.executeQuery();

//遍历查询结果集

        bookList = new ArrayList<>();

      while(resultSet.next()){

         Book book=new Book();

         book.setId(resultSet.getInt("id"));

         book.setName(resultSet.getString("bname"));

         book.setAuthor(resultSet.getString("author"));

         book.setPrice(resultSet.getDouble("price"));

         bookList.add(book);

          }

       } catch (Exception e) {

      }finally{

      //释放资源

        resultSet.close();

    preparedStatement.close();

        connection.close();    
    
   }

第一类:着重对JDBC进行API层的抽取和封装,以及功能的增强,

典型代表是Apache的DbUtils。

第二类:借鉴面向对象的思想,让程序员以操作对象的方式操作数据库,无需编写sql语句,典型代表是ORM(mybits )。

JDBC有四个核心对象:
(1)DriverManager,用于注册数据库连接
(2)Connection,与数据库连接对象
(3)Statement/PrepareStatement,操作数据库SQL语句的对象
(4)ResultSet,结果集或一张虚拟表

Mybatis

 集成第三方分页插件(如 PageHelper)

待完善

http://www.dtcms.com/a/109537.html

相关文章:

  • 探索现代网络技术:从负载均衡到 Kubernetes
  • ECMAScript介绍
  • 使用C#写的一个Kafka的使用工具
  • git的作用,以及和github的区别
  • 数据结构与算法学习笔记----贪心区间问题
  • C++中的IO流
  • 【动态规划】最长上升子序列模板
  • 网络编程—网络概念
  • 国产编辑器EverEdit - 扩展脚本:让EverEdit支持“批量查找”功能
  • 使用 requests 和 BeautifulSoup 解析淘宝商品
  • 安利免费开源的声音克隆、文本转语音整合包软件、一键本地安装!
  • Shopify独立站开发与运营全解析
  • iOS 18.4修复多个核心安全漏洞,间接增强Find My服务的数据保护能力
  • 基于javaweb的SSM羽毛球会员俱乐部系统场馆课程运动设计与实现(源码+文档+部署讲解)
  • 五种音频器件综合对比——《器件手册--音频器件》
  • 【C++游戏引擎开发】《几何算法》(2):OBB射线检测
  • 【总结】SQL注入防护手段
  • 【11408学习记录】[特殊字符] 三步攻克英语长难句:嵌套结构×平行结构全解析
  • Linux中系统安全及应用
  • axios取消重复请求
  • Java基础:面向对象入门(一)
  • 【AI News | 20250403】每日AI进展
  • Java 实现 字母异位词分组
  • 5. 数据交互基础:从文本加载到向量存储的完整流程
  • Nyquist插件基础:LISP语法-运算符
  • c++基础-----c++ 成员变量初始化顺序
  • Cline – OpenRouter 排名第一的CLI 和 编辑器 的 AI 助手
  • NVR设备ONVIF接入平台搭建城乡安防网:雪亮工程智慧监管体系建设方案
  • K8s面试第一篇:初识Kubernetes——核心概念与组件详解
  • win10彻底让图标不显示在工具栏