由浅入深--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、返回值映射,即将怎样将数据库查询返回的记录成模型对象
- 在这种思路下框架很轻量,很容易集成,又因为我们可以使用所有的SQL特性,可以写存储过程,也可以写纯SQL,所以灵活度相当高。当然灵活也意味着在具体实现功能的时候,你需要做更多,不但要关系模型层,SQL还要关心两者怎么样映射起来;具体包括:
- Hibernate则是一种思路,如果你习惯了和模型层打交道,那么它将SQL层对你隐藏起来了。换句话说,你只需要将模型代码和HQL这种面向对象查询语言可以了,至于SQL的生产,框架可以帮你完成。
- 好处:就是具体的数据库透明性,你今天使用了数据库MySQL,明天你就可以换成Oracle,并且不用改代码。在分析设计 时候,你只需要做自己习惯的模型驱动编程就可以了。
- 弊:较高的学习曲线,在出现问题的时候,无论功能性还是性能的问题,都需要更多的知识储备进行问题的定位和性能的调试。
- 总结
- 从框架本身的角度来说,Hibernate提供的特性远弊Mybatis更丰富,更完整,如果你是一位有着一定ORM经验的程序,那么Hibernate可能会是你的开发效率更高;
- 对于一个新项目而言,在技术选型的过程中,如果你团队中没有非常多的经验丰富程序员,我建议持久层不要考虑Hibernate。简单来说,Hibernate里面的水很深,很重。MyBatis是直接面对SQL,无论是对程序员和二线运维和DBA都是更加清晰和直接。
由浅入深--ORM简介的更多相关文章
- web框架开发-Django模型层(1)之ORM简介和单表操作
ORM简介 不需要使用pymysql的硬编码方式,在py文件中写sql语句,提供更简便,更上层的接口,数据迁移方便(有转换的引擎,方便迁移到不同的数据库平台)…(很多优点),缺点,因为多了转换环节,效 ...
- ORM简介 单表添加修改删除表记录
---------------------------------------------------------------目标既定,在学习和实践过程中无论遇到什么困难.曲折都不灰心丧气,不轻易改变 ...
- python 全栈开发,Day70(模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介)
昨日内容回顾 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 Quer ...
- ORM 简介 单表操作
cls超 Django基础五之django模型层(一)单表操作 本节目录 一 ORM简介 二 单表操作 三xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型 ...
- Django中ORM简介与单表数据操作
一. ORM简介 概念:.ORM框架是用于实现面向对象编程语言种不同类型系统的数据之间的转换 构建模型的步骤:重点 (1).配置目标数据库信息,在seting.py中设置数据库信息 DATABASE ...
- django总结 --》内容(django建project开始的大致流程、ORM简介)
1 安装: pip install django==1.11.9 另外:在pycharm中安装 django,在下图中七步走 2. 新建Django项目 django-admin startpro ...
- Django 06 Django模型基础1(ORM简介、数据库连接配置、模型的创建与映射、数据的增删改查)
Django 06 Django模型基础1(ORM简介.数据库连接配置.模型的创建与映射.数据的增删改查) 一.ORM系统 #django模型映射关系 #模型类-----数据表 #类属性-----表字 ...
- 8 Django 模型层(1)--orm简介
ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...
- Django基础(2)--模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介
没整理完 昨日回顾: 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 ...
随机推荐
- 新手如何入门linux,linux原来还可以这么学
前言 在这个只有cangls和小白两人的小房间中,展开了一次关于学习方法的讨论. 小白:cangls啊,我想请教一个问题,您是如何记住那么多linux命令的. cangls:我啊,别人都看我的小电影, ...
- golang中的RPC开发-2
RPC简介 远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程 如果 ...
- Servlet-HttpServletResponse类介绍及作用和两个响应流介绍
Servlet-HttpServletResponse类 HttpServletResponse类和HttpServletRequest类一样.每次请求进来,Tomcat服务器都会创建一个Respon ...
- NGINX的动静分离;什么是负载均衡
目录 一:动静分离 二:负载均衡 一:动静分离 动静分离是指在 web 服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提示整个服务的访问性和可维护 ...
- js-reduce方法源码
// 数组中的reduce方法源码复写 //先说明一下reduce原理:总的一句,reduce方法主要是把数组遍历, //然后把数组的每个元素传入回调函数中,回调函数怎么处理,就会的到什么样的效果 A ...
- [SDOI2017]数字表格 & [MtOI2019]幽灵乐团
P3704 [SDOI2017]数字表格 首先根据题意写出答案的表达式 \[\large\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)} \] 按常规套路改为枚举 \(d ...
- Java读写文件常用方法
一.字符流:读写纯文本(txt,csv等), 1 字符流写文件主要用:FileWriter,BufferedWriter,PrintWriter 1.1 测试 FileWriter 写入 privat ...
- 微服务如何聚合 API 文档?这波秀~
今天这篇文章介绍一下微服务如何聚合Swagger实现接口文档管理. 文章目录如下: 为什么需要聚合? 微服务模块众多,如果不聚合文档,则访问每个服务的API文档都需要单独访问一个Swagger UI界 ...
- java中LinkedList ArrayList 数组 HashSet 存储数据测试
话不多少,直接上代码 import java.text.SimpleDateFormat;import java.util.*; public class testList { public stat ...
- Dubbo原理解析(非常透彻)
一.概述 dubbo是一款经典的rpc框架,用来远程调用服务的. dubbo的作用: 面向接口的远程方法调用 智能容错和负载均衡 服务自动注册和发现. 自定义序列化协议 Dubbo 架构中的核心角色有 ...