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"/>
</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
;
测试类放在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语言就可以实现数据库操作,可以提高应用开发效率