结合Hibernate,理解ORM

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的优点:
  1. 业务代码访问对象,而非数据库中的表
  2. 从面向对象逻辑中隐藏了SQL查询的细节
  3. 基于JDBC的under the hood(ORM的本质是通过JDBC访问数据库)
  4. ORM有很多现成的工具,很多功能都可以自动完成(事务管理、键的自动生成),无需手动处理数据库实现
  5. 使用MVC设计模式,ORM就是天然的Model,代码量少、语义清晰、容易理解,有助于应用的快速开发
  • 同时,ORM也具有以下缺点:
  1. ORM 库不是轻量级工具,需要花很多精力学习和设置。
  2. 对于复杂的查询,ORM 要么是无法表达,要么是性能不如原生的 SQL。
  3. ORM 抽象掉了数据库层,开发者无法了解底层的数据库操作,也无法定制一些特殊的 SQL。
  • 很多编程语言都有自己的ORM实现,最典型、最规范的实现公认是 Ruby 语言的 Active Record
  • 阮一峰大神,有使用 OpenRecord(Active Record在Java Script上的模拟应用)去演示ORM,包括:model的创建、CRUD操作、实体关系(一对一、一对多、多对多)的实现等
  • 还有一篇知乎的小文章,以Django为例简单讲解了什么是ORM
2. 创建Hibernate项目
① web+hibernate项目的创建
  1. 自己手动添加了mysql-connector-java-5.1.49.jar以连接MySQL,否则报错找不到com.mysql.jdbc.Driver
  2. 博客还演示了如何使用idea连接mysql,实现mysql的可视化操作
  3. hibernate配置文件hibernate.cfg.xml和映射文件Student.hbm.xml放在同一级目录
  4. 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>
  1. 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>
  1. 使用junit实现单元测试,体验hibernate的ORM 操作。
import org.junit.Test; // idea有提示,按照提示导包即可
  1. 测试类放在test目录,示例可以参考博客:在idea中创建配置第一个hibernate项目
② spring boot+jpa创建hibernate项目
  1. 在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>
  1. 配置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
  1. 按照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语言就可以实现数据库操作,可以提高应用开发效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值