1.持久层的概念
持久化:只是将数据保存在可掉电的存储介质上。
持久层:可以将业务数据存储到磁盘,具备长期存储能力,只要磁盘不损坏(大部分的重要数据都会有相关的备份机制),在断电或者其他情况下,重新开启系统仍然可以读取这些数据。
2.持久层的技术解决方案
Java中使用JDBC技术(JDBC是规范,不是框架)
- Connection
- Statement 或者 PrepareStatement
- ResultSet
3.使用JDBC存在的问题
- 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可以解决此问题。
- 存在大量硬编码问题。实际应用sql变化的可能比较打,sql变动需要改变Java代码。使用preparedStatement向占有位符号传参数方式同样存在硬编码,系统不易维护。对结果集解析也存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护。
- 此外实际开发中,我们关注的是需求、关注功能,真正查询业务相关不那么多,但需要写大量重复的工作代码。而且Java是面向对象,这中间还要来回转换。
4.引入ORM框架概念
目前流行的编程语言,如Java\C++\C#等,他们都是面向对象的编程语言,它具有非常多的优势,比如:
- 面向对象建模、操作
- 封装、继承、多态
- 简单易用
目前主流的数据库产品,如Oracle,DB2,MySQL,SQLServer等几乎都是关系型数据库,关系型数据的优势:
- 大量数据查找、排序
- 集合数据连接操作、映射
- 数据库访问的并发、事务
- 数据库的约束、隔离等
这样我们需要有一个(面向)对象和关系(数据库)之间的映射,作为桥梁的ORM框架就产生了。
采用ORM框架之后,应用程序不再直接访问底层的数据库,而是以面向对象的方式来操作持久化对象(PO),而ORM框架负责将这些面向对象的操作转换成底层的SQL操作。
ORM框架把持久化对象的保存、删除、修改等操作转换成对数据库的SQL操作。
基本映射方式:
- 数据表映射持久化类
- 数据表的行映射持久化类的实例
- 数据表的列映射持久化类的属性
基于这种基本映射方式,ORM框架可以完成对象模型和关系模型的相互映射。
开发者只需要操作持久化类对象,无需关心底层的数据库SQL操作,将开发和数据库操作都转化成面向对象的操作,工作量和复杂度大为减少。
流行的ORM框架:
- Hibernate : 最流行的ORM框架
- Toplink: Oracle公司产品
- MyBatis: Apache组织的项目
5.MyBatis介绍
MyBatis 是一个支持普通MySQL查询、存储过程和高级映射的优秀持久层框架。
- 一方面,MyBatis去掉了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索,对细节进行了封装。
- 另一方面,MyBatis使用简单XML或注解进行配置和原始映射,使得开发者只需关心功能实现的SQL语句本身,而无需花费多余精力去处理诸如加载驱动、创建连接、创建Statement等繁琐的重复工作。
- MyBatis作为持久层框架,其主要思想是将程序中的大量SQL语句剥离处理,配置在配置文件中,好处就是将SQL与程序代码分离。
MyBatis与众多ORM框架具有以下优势:
- 不屏蔽SQL,意味着可以更精确地定位SQL语句,可以对其进行优化和改造,这有利于互联网系统性能的提高,符和互联网需要性能优化的特点。
- 提供强大、灵活的映射机制,方便Java开发者使用。提供动态SQL的功能,允许我们更具不同条件组装SQL,这个功能远比其他工具或者Java编码的可读性和可维护性高,满足各种应用系统的同时也满足了需求经常变化的互联网应用的要求。
- 在MyBatis中,提供了使用Mapper的接口编程,只要一个接口和一个XML就能创建映射器,进一步简化我们的工作,使得很多框架API在MyBatis中消失,开发者能更集中于业务逻辑。
MyBatis与Hibernate对比
Hibernate | MyBatis |
---|---|
Hibernate是一个全表映射的框架 | MyBatis是一个半自动映射的框架 |
通常开发者只需定义好持久化对象到数据表的映射关系,就可以通过Hibernate提供的方法完成持久化操作 | "半自动"是相对于Hibernate全表映射而言的,MyBatis需要手动匹配提供POJO,SQL和映射关系即可 |
开发者并不需要熟练的掌握SQL语句的编写,Hibernate会根据制定的存储逻辑,自动的生成对应的SQL,并调用JDBC接口来执行,所以开发效率也会高于MyBatis | 与Hibernate相比,虽然使用MyBatis手动编写SQL要比使用Hibernate的工作量大,但MyBatis可以配置动态SQL并优化SQL,可以通过配置决定SQL的映射规则,它还支持存储过程等。对于一些复杂的和需要优化性能的项目来说,显然使用MyBatis更加合适 |
Hibernate也存在一些缺点,例如它在多表关联时,对SQL查询的支持较差;更新数据时,需要发送所有字段;不支持存储过程;不能通过优化SQL来优化性能等 |