MyBatis ORM概念和原理(三)
ORM 概念
我们在介绍 MyBatis 时说到,MyBatis是一种半自动 ORM 实现。那何为 ORM,何为半自动?
ORM(Object/Relation Mapping,对象/关系数据库映射)是一种描述对象与关系数据库之间映射的规范。怎么理解呢?就拿班规来说吧,它也是一种规范,描述学生与班集体之间行为的规范。
ORM 作用
我们知道班规的作用是约束学生的不良行为,目的是营造良好的班级学习氛围。那ORM的作用呢?ORM 作用是为对象与关系数据库之间搭建桥梁,以解决对象与关系数据库之间不协调的问题。
那对象与关系数据库之间到底哪里不协调了?我们都知道在 Java 一种面向对象的编程语言,在 Java 世界里万物皆对象,就是说 Java 编程玩的就是对象,涉及的核心概念就是对象、类和属性。我们回头再看关系数据库,它操作的是对象吗?它能否直接存储对象到数据库或者从数据库直接获取对象?显然不能,如果可以那就不叫关系数据库,而应该叫对象数据库。我们可以说,在关系数据库的世界里,万物皆关系,玩的就是二维表,涉及的核心概念是表、记录和字段。
所以,Java对象和关系数据库如同马和牛,简直是牛头不对马嘴,存在不协调的问题。那这个不协调的问题导致怎样的结果呢?导致的结果就是我们在数据库编程时,使用 JDBC 从数据库里获取的不是对象,而是一个个数据库字段,需要手动创建一个 Java 对象实体,再把这些字段存放到 Java 对象实体的属性里。代码如下:
// 从数据库获取字段
int id = rs.getInt("id");
String userName = rs.getString("userName");
String password = rs.getString("password");
String name = rs.getString("name");
int age = rs.getInt("age");
int sex = rs.getInt("sex");
Date birthday = rs.getDate("birthday");
String created = rs.getString("created");
String updated = rs.getString("updated");
// 创建对象实体并将字段存放到对象属性中
UserEntity userEntity = new UserEntity();
userEntity.setId(id);
userEntity.setUserName(userName);
userEntity.setPassword(password);
userEntity.setName(name);
userEntity.setAge(age);
userEntity.setSex(sex);
userEntity.setBirthday(birthday);
userEntity.setCreated(created);
userEntity.setUpdated(updated);
由于 Java 对象与关系数据库之间不协调的问题,导致的结果就是数据库编程代码繁琐,开发效率低。
ORM 映射规则
类与表相对应(基本规则)
类的属性(或成员变量)与表的字段相对应(基本规则)
类的实例与表中具体的一条记录相对应(基本规则)
一个类可以对应多个表,一个表也可以对应多个类
数据库中的表可以没有主键,但是类中必须有主键字段
数据库中表与表之间的关系对应类与类之间的关系
数据库中表的字段个数和名称可以和类的属性(或成员变量)不一样
这7条 ORM 映射规则中,前3条是基本规则,也是最重要的规则。
ORM 框架
我们已经知道 ORM 是一种规范,而 ORM 本身并不能带来开发效率的提升,这就好比我们制定了一个好的班规,如果大家并不去遵守和执行它,也不会带来任何学习效率的提升。
ORM 框架就是指实现了 ORM 映射规则的框架,而 MyBatis 就是一种 ORM 框架,当然Hibernate也是。有了这些 ORM 框架,我们就不用自己手动编写代码去实现 ORM 规范,使用 ORM 框架就可以发挥 ORM 规范的威力,以提升开发效率。
总结
- ORM 作用是为对象与关系数据库之间搭建桥梁,以解决对象与关系数据库之间不协调的问题
- ORM 框架已实现 ORM 映射规则(MyBatis 为半自动 ORM 框架,而 Hibernate 为全自动 ORM 框架)
MyBatis ORM概念和原理(三)的更多相关文章
- Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
ORACLE集群概念和原理(二) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...
- 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析
文章中引用的代码均来自https://github.com/vczh/tinymoe. 看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...
- Java线程:概念与原理
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- Java IO学习笔记:概念与原理
Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...
- LDAP概念和原理介绍
LDAP概念和原理介绍 相信对于许多的朋友来说,可能听说过LDAP,但是实际中对LDAP的了解和具体的原理可能还比较模糊,今天就从“什么是LDAP”.“LDAP的主要产品”.“LDAP的基本模型”.“ ...
- IT题库9-线程池的概念和原理
在什么情况下使用线程池? 1.单个任务处理的时间比较短:2.需要处理的任务的数量大: 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销.2.如不使用线程池,有可能造成系统创建 ...
- LDAP概念和原理
LDAP概念和原理介绍 相信对于许多的朋友来说,可能听说过LDAP,但是实际中对LDAP的了解和具体的原理可能还比较模糊,今天就从“什么是LDAP”.“LDAP的主要产品”.“LDAP的基本模型”.“ ...
- Storm概念、原理详解及其应用(一)BaseStorm
本文借鉴官文,添加了一些解释和看法,其中有些理解,写的比较粗糙,有问题的地方希望大家指出.写这篇文章,是想把一些官文和资料中基础.重点拿出来,能总结出便于大家理解的话语.与大多数“wordcount” ...
- 转载:【Oracle 集群】RAC知识图文详细教程(二)--Oracle 集群概念及原理
文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...
- mybatis的Mapper代理原理
前言:在mybatis的使用中,我们会习惯采用XXMapper.java+XXMapper.xml(两个文件的名字必须保持一致)的模式来开发dao层,那么问题来了,在XXMapper的文件里只有接口, ...
随机推荐
- Arduino从零开始的高手之路——初识Arduino
初识Arduino 时隔若干年,重启Arduino入门教程~ Arduino自2005年推出以来,广受好评,如今已成为最热门的开源硬件之一.在全球最大的开源社区Github上,Arduino已经成为了 ...
- MySQL数据库连接时区问题
<!-- 组件扫描--> <context:component-scan base-package="com"></context:component ...
- MySQL 07 行锁功过:怎么减少行锁对性能的影响?
行锁是针对数据表中行记录的锁,是在引擎层由引擎实现的. 从两阶段锁说起 在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不需要了就立即释放,而是等到事务结束时才释放,这就是两阶段锁协议. 知 ...
- 如何禁止 SQL Server 中的 xp_cmdshell 以提高安全性
概述 在 SQL Server 中,xp_cmdshell 是一个强大的功能,它允许执行操作系统级别的命令.然而,这也带来了潜在的安全风险.本文将详细介绍如何禁止 xp_cmdshell,以增强 SQ ...
- Xamarin.Andorid 代码方式弹出下拉框
转载于:https://my.oschina.net/u/1024921/blog/163142 public static void SetFocus(this Spinner snr) { snr ...
- Luogu P3549 [POI 2013] MUL-Multidrink 题解
P3549 [POI 2013] MUL-Multidrink 非常 tricky 的一道题,模拟赛拼尽全力无法战胜,写篇题解记录一下. 容易理解的直接构造法. 按原题限制随便跳会破坏很多性质,几乎无 ...
- CentOS7更改静态IP地址
- 首先通过 ifconfig来查看自己的网卡名称. - 修改网卡的配置文件,vim /etc/sysconfig/network-scripts/ifcfg-ens33 - 重启网络服务,确认IP是 ...
- gerrit 遇到问题的解决方案 (missing subject; Change-Id must be in commit message footer)
问题 ! [remote rejected] 13_13 -> refs/for/master (missing subject; Change-Id must be in commit mes ...
- 使用ETL进行数据接入的方式
数据接入 数据接入,作为现代信息技术架构中的一个关键环节,指的是将来自不同源头的数据整合到统一的数据平台或系统中.这一过程不仅是技术上的挑战,也涉及到组织结构.业务流程等多个层面的协调与优化.通过有效 ...
- Unity ShaderGraph 截图保存为PNG
很好用的插件 https://github.com/Cyanilux/ShaderGraphToPNG