Hibernate5 之 Hello World 级入门教程

本文是一篇关于Hibernate5的入门教程,介绍了Hibernate作为ORM框架的基本概念,详细阐述了如何搭建Hibernate环境,包括下载jar包、配置文件编写、创建实体类和映射文件、数据的保存、修改、删除等操作,帮助初学者快速上手。
摘要由CSDN通过智能技术生成

Hibernate 是一个优秀的持久化框架、ORM 框架。万事开头难--框架的学习,往往完成了第一步的环境搭建,后续的应用学习其实就很简单了,所以本场 Chat 就只关注 Hibernate5 环境的搭建。内容主要分为以下几个部分:

  1. Hibernate 简介,ORM 概念
  2. 资源 jar 包获取、下载、导入项目
  3. 配置文件编写
  4. 实体类和映射文件
  5. 对象查询,测试环境搭建是否成功
  6. 保存对象数据到数据库
  7. 修改对象数据
  8. 根据主键删除对象

Hibernate 简介

Hibernate 是一款优秀的持久化框架及优秀的 ORM 框架之一。它通过使用 Java 反射、xml 解析、代理模式等等技术对 JDBC 原有的繁琐的操作步骤进行了简化封装,使得之前 JDBC 代码可能需要几十行代码才能完成的功能,只需几行代码就能搞定。而且开发人员即使不需要熟悉 SQL 也能完成对数据库完成 CRUD 操作。它可以自动生成 SQL 语句,自动执行。完全可以使用面向对象的思想完成对数据库的操作。所以使用 Hibernate 框架可以大大简化了代码和提高了开发的效率。

ORM 是什么?

ORM 即 Object Relation Mapping 对象关系映射。是一种程序技术,解决一类问题的思路方法,不局限于应用在 Java 语言。用于面向对象语言中完成类和表,属性和表字段转换的映射机制。

​ 举例来说:

​ 在 Java 有一个实体类 School,在 MySQL 数据库中有一张表 schoolTbl。现在需要完成 Java 中对象数据通过自动化框架持久化到 MySQL 数据库表中。这时对象的属性和表中的列如何对应?ORM 就是解决这样问题的。如图:

enter image description here

从上图中,可以看到中间映射的作用,就是完成了类属性和表字段的对应映射关系。从而可以实现 School 对象根据映射表生成对应表的 SQL 语句。这就是 ORM 的概念和作用。

搭建环境详细步骤

​ Hibernate 的其他概念,我们就先不啰嗦了,有需要进一步解释的,可以关注文末我的个人公众号 zp11481062,接下来,我们来介绍 Hibernate 环境搭建步骤。

1. 下载 Hibernate 类库 jar 包

​ 目前 Hibernate 官网版本已经到 Hibernate6 了,但是还是属于测试阶段,所以我们可以下载最近更新的稳定版 Hibernate5.4.3 版:

下载地址:http://hibernate.org/orm/releases/5.4/

enter image description here

2. 解压并找到 lib 目录

​ 在 lib 目录下有一个文件夹 required 下就是 Hibernate 必须的依赖 jar 包

enter image description here

3. 使用 IDE (本案例使用 Eclipse ) 创建项目工程

​ 本案例使用 Eclipse 新建 web 工程(工程创建步骤省略),然后拷贝上一步的 jar 包到工程下的 lib 目录,另外注意:连接 MySQL 还需要连接 Mysql 的驱动 jar 包,所以也需要提前下载,拷贝进来,如下图:

enter image description here

4. 在 MySQL 数据库中创建表
-- 创建数据库CREATE DATABASE hib;-- 打开数据库USE hib;-- 创建表CREATE TABLE school(    scid INT PRIMARY KEY AUTO_INCREMENT,    scname VARCHAR(100),    address VARCHAR(200));-- 创建学生表CREATE TABLE student(    sid INT AUTO_INCREMENT PRIMARY KEY,    sname VARCHAR(20),    birthday DATE,    gendar VARCHAR(2),    phone VARCHAR(12));-- 插入测试数据INSERT INTO school(scname,address)VALUES('西安三中','西安市新城区长乐西路');
5. 在 Java 项目中新建实体类 School
package com.wdzl.entity;public class School {    private Integer scid;    private String scname;    private String address;    public Integer getScid() {        return scid;    }    public void setScid(Integer scid) {        this.scid = scid;    }    public String getScname() {        return scname;    }    public void setScname(String scname) {        this.scname = scname;    }    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }}
6. 新建实体类的映射文件 School.hbm.xml
 xml 文件名可以自己定义,没有必须的要求。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping>    <class name="com.wdzl.entity.School" table="school">        <!-- id表示主键 -->        <id name="scid" column="scid">             <!-- 主键生成策略,native表示数据库端本地生成策略,比如标识列 -->            <generator class="native"></generator>          </id>        <!-- 属性和列名对应关系,不过这里属性和列表定义相同了,可以不同的 -->        <property name="scname" column="scname"></property>        <property name="address" column="address"></property>    </class></hibernate-mapping>
7. 新建 Hibernate 的配置文件

​ Hibernate 框架是对 JDBC 的封装,所以一样是需要 JDBC 连接所需的 url、driver、username、password 这四个参数的,Hibernate 一般是通过配置文件来指定的。所以在 src 目录下新建 xml 文件 hibernate.cfg.xml文件,内容如下:

<!DOCTYPE hibernate-configuration PUBLIC    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory>        <!-- 数据库方言 -->        <property name="dialect">            org.hibernate.dialect.MySQLDialect        </property>        <!-- 驱动 -->        <property name="connection.driver_class">            com.mysql.jdbc.Driver        </property>        <!-- URL -->        <property name="connection.url">            jdbc:mysql://127.0.0.1:3306/hib        </property>        <!-- 用户名 -->        <property name="connection.username">root</property>        <!-- 密码 -->        <property name="connection.password">root</property>        <!-- 在控制台显示SQL语句 -->        <property name="show_sql">true</property>        <!-- 注册所有ORM映射文件 -->        <mapping resource="com/wdzl/entity/School.hbm.xml" />    </session-factory></hibernate-configuration>

注意:在上面配置文件中,

<mapping resource="com/wdzl/entity/School.hbm.xml" />

这个映射文件的引入就是和上一步第 6 步创建的映射文件关联的,所以这里的路径一定要一致,而且注意是路径,不是包结构。

8. 新建类来测试调用,检查环境

​ 写一个类来根据主键查询对象, Test01.java:

package com.wdzl.test;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import com.wdzl.entity.School;public class Test01 {    public static void main(String[] args) {        try {            //加载配置文件            Configuration cfg = new Configuration().configure("hibernate.cfg.xml");            //创建会话工厂            SessionFactory factory = cfg.buildSessionFactory();            //创建会话session            Session session = factory.openSession();            //根据主键查询对象            School school = session.get(School.class, 1);            System.out.println("==="+school);            //关闭会话            session.close();            //关闭工厂 释放资源            factory.close();        } catch (HibernateException e) {             e.printStackTrace();        }    }}

运行结果如下,表示查询到对象数据,成功:

enter image description here

9.保存对象数据(插入操作)

通过上面第 8 步,我们就算是完成了 Hibernate5 的环境搭建了,上面是根据主键查询,接下来,写一个保存数据的代码例子:

package com.wdzl.test;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import com.wdzl.entity.School;/** *     保存数据到数据库 * */public class Test02 {    public static void main(String[] args) {        try {            //加载配置文件            Configuration cfg = new Configuration().configure("hibernate.cfg.xml");            //创建会话工厂            SessionFactory factory = cfg.buildSessionFactory();            //创建会话session            Session session = factory.openSession();            //开启事务            Transaction tran = session.beginTransaction();            //实例化对象            School school = new School();            school.setScname("Java一中");            school.setAddress("Java三路");            //持久化            session.save(school);            //提交事务            tran.commit();            //关闭会话            session.close();            //关闭工厂 释放资源            factory.close();        } catch (HibernateException e) {             e.printStackTrace();        }    }}

这里就是新实例化一个对象,并赋值,然后通过 session.save() 方法完成数据保存入库操作。步骤最后我们总结。

10. 数据修改

下面来看修改代码:

package com.wdzl.test;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import com.wdzl.entity.School;/** *     修改 */public class Test03 {    public static void main(String[] args) {        try {            //加载配置文件            Configuration cfg = new Configuration().configure("hibernate.cfg.xml");            //创建会话工厂            SessionFactory factory = cfg.buildSessionFactory();            //创建会话session            Session session = factory.openSession();            //开启事务            Transaction tran = session.beginTransaction();            //根据主键查询对象            School school = session.get(School.class, 1);            school.setScname("西安4中");            //持久化 修改            session.update(school);            //提交事务            tran.commit();            //关闭会话            session.close();            //关闭工厂 释放资源            factory.close();        } catch (HibernateException e) {             e.printStackTrace();        }    }}

上面代码需要注意的就是,对于修改,需要先根据主键查询出对象,然后在查出后的对象上做修改,最后持久化到数据库中。为什么要先查询,看下图:

enter image description here

从图中我们可以看到框架在执行修改操作时,执行的 SQL 语句。比较代码,我们只是修改了 scname 属性,并没有要修改 address 属性,但是框架这里做的是全列修改!所以如果我们不先查询出旧的对象数据,而是新实例化对象执行修改,则会导致,其他没有要修改的属性值,会置空 null 或修改成其他数据。所以一般修改,需要先查询再修改。

11. 数据删除
package com.wdzl.test;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import com.wdzl.entity.School;public class Test04 {    public static void main(String[] args) {        try {            //加载配置文件            Configuration cfg = new Configuration().configure("hibernate.cfg.xml");            //创建会话工厂            SessionFactory factory = cfg.buildSessionFactory();            //创建会话session            Session session = factory.openSession();            //开启事务            Transaction tran = session.beginTransaction();            //根据主键查询对象            School school = session.get(School.class, 1);            //持久化 删除            session.delete(school);            //提交事务            tran.commit();            //关闭会话            session.close();            //关闭工厂 释放资源            factory.close();        } catch (HibernateException e) {             e.printStackTrace();        }    }}

删除操作,这里也是先查询再删除的,因为 Hibernate 完全面向对象思想来操作的。修改的是对象,删除的也是对象。当然,如果你这里新实例化一个对象,只要指定主键,也是可以删除成功的,不过就不能和缓存同步了而已,具体差别这里不在详述。

12. 总结

​ 上面代码中,为了方便理解,并没有去封装 session 对象的获取步骤,开发中肯定需要封装成工具类的。

从上面四个的查询、插入、修改、删除操作中,可以归纳 Hibernate 持久化的七个步骤:

​ 加载配置文件;

​ 创建会话工厂 SessionFactory;

​ 创建会话 Session;

​ 开启事务;

​ 持久化操作;

​ 提交事务;

​ 关闭会话;

13. 最后

​ 如果有问题可以随时留言,可以关注个人公众号:java_1995。

​ 后续会经常推送技术相关面试题,敬请关注,谢谢

​ 源码下载:https://github.com/zp8126/hibernate01

enter image description here

阅读全文: http://gitbook.cn/gitchat/activity/5d11c436b429f31bd0a2a27c

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

FtooAtPSkEJwnW-9xkCLqSTRpBKX

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值