1. 绪言
- 关系型数据库(
RDB
)通过实体之间的关系连接数据,而面向对象编程(OOP
)把现实生活中的实体抽象成对象。 - 其实,RDB中的实体也可以使用对象进行表达,这样就能使用OOP来操作RDB。
- 比如,对象的
save()
方法,对应RDB的insert
语句;对象的update()
方法对应RDB的update
语句。 - 以上思想或技术被叫做ORM(Object/Relational Mapping,对象/关系映射):
通过实例对象的语法,完成关系型数据库的操作的技术
- 在ORM中,对象与数据库的关系如下:
数据库中的table --> 类(class)
table的一行记录(record) --> 对象(Object)
table中的一个字段(field) --> 对象的一个属性(attribute)
- 也就是说,ORM 使用对象,封装了数据库操作。开发者可以不触碰SQL语言,仅使用OOP与数据对象
直接
进行交互,而不用关心底层数据库。 - ORM的优点:
- 业务代码访问对象,而非数据库中的表
- 从面向对象逻辑中隐藏了SQL查询的细节
- 基于JDBC的
under the hood
(ORM的本质是通过JDBC访问数据库) - ORM有很多现成的工具,很多功能都可以自动完成(事务管理、键的自动生成),无需手动处理数据库实现
- 使用MVC设计模式,ORM就是天然的Model,代码量少、语义清晰、容易理解,有助于应用的快速开发
- 同时,ORM也具有以下缺点:
- ORM 库不是轻量级工具,需要花很多精力学习和设置。
- 对于复杂的查询,ORM 要么是无法表达,要么是性能不如原生的 SQL。
- ORM 抽象掉了数据库层,开发者无法了解底层的数据库操作,也无法定制一些特殊的 SQL。
- 很多编程语言都有自己的ORM实现,最典型、最规范的实现公认是 Ruby 语言的 Active Record
- 阮一峰大神,有使用 OpenRecord(Active Record在Java Script上的模拟应用)去演示ORM,包括:model的创建、CRUD操作、实体关系(一对一、一对多、多对多)的实现等
- 还有一篇知乎的小文章,以
Django
为例简单讲解了什么是ORM
2. 创建Hibernate项目
① web+hibernate项目的创建
- 使用idea,基于web applicantion创建hibernate项目:Intellij IDEA创建第一个hibernate项目
- 自己手动添加了
mysql-connector-java-5.1.49.jar
以连接MySQL,否则报错找不到com.mysql.jdbc.Driver
。 - 博客还演示了如何使用idea连接mysql,实现mysql的可视化操作
- hibernate配置文件
hibernate.cfg.xml
和映射文件Student.hbm.xml
放在同一级目录 hibernate.cfg.xml
的内容如下,一定要添加映射文件,否则报错找不到Student类
,其实是找不到映射文件。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/lucy?useUnicode=TRUE&characterEncoding=UTF-8
</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="show_sql">true</property>
<mapping resource="Student.hbm.xml"/>
<!-- DB schema will be updated if needed -->
<!-- <property name="hibernate.hbm2ddl.auto">update</property> -->
</session-factory>
</hibernate-configuration>
Student.hbm.xml
的内容如下:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.example.Student" table="stu">
<id name="id">
<generator class="assigned"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name"/>
</property>
<property name="age">
<column name="age"></column>
</property>
<property name="classId">
<column name="class_id"></column>
</property>
</class>
</hibernate-mapping>
- 使用junit实现单元测试,体验hibernate的ORM 操作。
import org.junit.Test; // idea有提示,按照提示导包即可
- 测试类放在test目录,示例可以参考博客:在idea中创建配置第一个hibernate项目
② spring boot+jpa创建hibernate项目
- 创建spring boot项目参考博客:IntelliJ IDEA创建第一个Spring Boot项目
- 或参考:SpringBoot项目创建与数据库连接
- 整合JPA来实现hibernate
- 在pom中添加如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
- 配置application.properties文件,添加数据库连接信息和JPA配置信息
# 数据库连接配置,不知为啥,这里使用characterEncoding=utf-8就能解决无法查询中文的问题
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/lucy?characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
# jpa配置
spring.jackson.serialization.indent-output=true
# 第一次建表时用create,后面用update
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
- 按照mvc的思想,创建entity、dao、service、service.impl、controller,最后的项目结构如下
3. 基于spring boot+JPA体验hibernate的ORM
① 开发流程
- 由于篇幅原因,具体代码放在了专门的博:SpringHibernate项目代码示例
- 首先创建实体类
Student
,并直接在实体类中添加映射信息 - 创建实体类的dao层
StudentDao
- 创建service接口,并实现service接口
- 创建工具类
Message
,用于返回信息的构建 - 添加swagger依赖,方便通过swagger查看接口。在controller出,添加
@EnableSwagger2
注解就可以开启接口的swagger访问。
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
- 创建controller,最后启动项目,访问swagger页面,测试各个接口
② hibernate中的ORM
- hibernate被称为完全的ORM框架,它对数据的处理处处体现了OOP的思想。
- 添加数据:
<S extends T> S save(S var1);
<S extends T> Iterable<S> saveAll(Iterable<S> var1);
- 查询数据库:
Optional<T> findById(ID var1);
Iterable<T> findAll();
- 删除数据
void deleteById(ID var1);
void delete(T var1);
void deleteAll(Iterable<? extends T> var1);
void deleteAll();
- 从展示各种方法来看,hibernate提供了很多基本的数据库操作方法,这些方法是的程序员无需撰写SQL语言就可以实现数据库操作,可以提高应用开发效率