结合Hibernate,理解ORM

    科技2025-05-07  22

    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&amp;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&amp;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语言就可以实现数据库操作,可以提高应用开发效率
    Processed: 0.010, SQL: 8