当前位置:   article > 正文

Hibernate 的 CRUD 案例快速入门_java 数据库框架 hibernate 例子

java 数据库框架 hibernate 例子

一、Hibernate 简介

Hibernate 是一款优秀的持久化框架及优秀的 ORM 框架之一。

它通过使用 Java 反射、xml解析、代理模式等等技术对 JDBC 原有的繁琐的操作步骤进行了简化封装,使得之前 JDBC 代码可能需要几十行代码才能完成的功能,只需几行代码就能搞定。

而且开发人员即使不需要熟悉 SQL 也能完成对数据库完成 CRUD 操作。它可以自动生成SQL语句,自动执行。完全可以使用面向对象的思想完成对数据库的操作。

所以使用 Hibernate 框架可以大大简化了代码和提高了开发的效率。

二、ORM 是什么?

ORM 即 Object Relation Mapping 对象关系映射。

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

​ 举例来说:

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

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

三、搭建环境详细步骤

Hibernate 的其他概念,我们就先不啰嗦了,有需要进一步解释的,

可以添加个人微信zp11481062,

接下来,我们来介绍 Hibernate 环境搭建步骤。

1. 下载 Hibernate 类库 jar 包

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

下载地址:5.4 series - Hibernate ORM

 

2. 解压并找到 lib 目录

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

 

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

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

 

4. 在 MySQL 数据库中创建表
  1. -- 创建数据库
  2. CREATE DATABASE hib;
  3. -- 打开数据库
  4. USE hib;
  5. -- 创建表
  6. CREATE TABLE school(
  7. scid INT PRIMARY KEY AUTO_INCREMENT,
  8. scname VARCHAR(100),
  9. address VARCHAR(200)
  10. );
  11. -- 创建学生表
  12. CREATE TABLE student(
  13. sid INT AUTO_INCREMENT PRIMARY KEY,
  14. sname VARCHAR(20),
  15. birthday DATE,
  16. gendar VARCHAR(2),
  17. phone VARCHAR(12)
  18. );
  19. -- 插入测试数据
  20. INSERT INTO school(scname,address)VALUES('西安三中','西安市新城区长乐西路');
5. 在 Java 项目中新建实体类 School
  1. package com.wdzl.entity;
  2. public class School {
  3. private Integer scid;
  4. private String scname;
  5. private String address;
  6. public Integer getScid() {
  7. return scid;
  8. }
  9. public void setScid(Integer scid) {
  10. this.scid = scid;
  11. }
  12. public String getScname() {
  13. return scname;
  14. }
  15. public void setScname(String scname) {
  16. this.scname = scname;
  17. }
  18. public String getAddress() {
  19. return address;
  20. }
  21. public void setAddress(String address) {
  22. this.address = address;
  23. }
  24. }
6. 新建实体类的映射文件 School.hbm.xml

xml 文件名可以自己定义,没有必须的要求。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.wdzl.entity.School" table="school">
  7. <!-- id表示主键 -->
  8. <id name="scid" column="scid">
  9. <!-- 主键生成策略,native表示数据库端本地生成策略,比如标识列 -->
  10. <generator class="native"></generator>
  11. </id>
  12. <!-- 属性和列名对应关系,不过这里属性和列表定义相同了,可以不同的 -->
  13. <property name="scname" column="scname"></property>
  14. <property name="address" column="address"></property>
  15. </class>
  16. </hibernate-mapping>
7. 新建 Hibernate 的配置文件

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

  1. <!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  4. <hibernate-configuration>
  5. <session-factory>
  6. <!-- 数据库方言 -->
  7. <property name="dialect">
  8. org.hibernate.dialect.MySQLDialect
  9. </property>
  10. <!-- 驱动 -->
  11. <property name="connection.driver_class">
  12. com.mysql.jdbc.Driver
  13. </property>
  14. <!-- URL -->
  15. <property name="connection.url">
  16. jdbc:mysql://127.0.0.1:3306/hib
  17. </property>
  18. <!-- 用户名 -->
  19. <property name="connection.username">root</property>
  20. <!-- 密码 -->
  21. <property name="connection.password">root</property>
  22. <!-- 在控制台显示SQL语句 -->
  23. <property name="show_sql">true</property>
  24. <!-- 注册所有ORM映射文件 -->
  25. <mapping resource="com/wdzl/entity/School.hbm.xml" />
  26. </session-factory>
  27. </hibernate-configuration>

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

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

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

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

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

  1. package com.wdzl.test;
  2. import org.hibernate.HibernateException;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.cfg.Configuration;
  6. import com.wdzl.entity.School;
  7. public class Test01 {
  8. public static void main(String[] args) {
  9. try {
  10. //加载配置文件
  11. Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
  12. //创建会话工厂
  13. SessionFactory factory = cfg.buildSessionFactory();
  14. //创建会话session
  15. Session session = factory.openSession();
  16. //根据主键查询对象
  17. School school = session.get(School.class, 1);
  18. System.out.println("==="+school);
  19. //关闭会话
  20. session.close();
  21. //关闭工厂 释放资源
  22. factory.close();
  23. } catch (HibernateException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }

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

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

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

  1. package com.wdzl.test;
  2. import org.hibernate.HibernateException;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.Transaction;
  6. import org.hibernate.cfg.Configuration;
  7. import com.wdzl.entity.School;
  8. /**
  9. * 保存数据到数据库
  10. *
  11. */
  12. public class Test02 {
  13. public static void main(String[] args) {
  14. try {
  15. //加载配置文件
  16. Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
  17. //创建会话工厂
  18. SessionFactory factory = cfg.buildSessionFactory();
  19. //创建会话session
  20. Session session = factory.openSession();
  21. //开启事务
  22. Transaction tran = session.beginTransaction();
  23. //实例化对象
  24. School school = new School();
  25. school.setScname("Java一中");
  26. school.setAddress("Java三路");
  27. //持久化
  28. session.save(school);
  29. //提交事务
  30. tran.commit();
  31. //关闭会话
  32. session.close();
  33. //关闭工厂 释放资源
  34. factory.close();
  35. } catch (HibernateException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }

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

10. 数据修改

下面来看修改代码:

  1. package com.wdzl.test;
  2. import org.hibernate.HibernateException;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.Transaction;
  6. import org.hibernate.cfg.Configuration;
  7. import com.wdzl.entity.School;
  8. /**
  9. * 修改
  10. */
  11. public class Test03 {
  12. public static void main(String[] args) {
  13. try {
  14. //加载配置文件
  15. Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
  16. //创建会话工厂
  17. SessionFactory factory = cfg.buildSessionFactory();
  18. //创建会话session
  19. Session session = factory.openSession();
  20. //开启事务
  21. Transaction tran = session.beginTransaction();
  22. //根据主键查询对象
  23. School school = session.get(School.class, 1);
  24. school.setScname("西安4中");
  25. //持久化 修改
  26. session.update(school);
  27. //提交事务
  28. tran.commit();
  29. //关闭会话
  30. session.close();
  31. //关闭工厂 释放资源
  32. factory.close();
  33. } catch (HibernateException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }

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

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

11. 数据删除
  1. package com.wdzl.test;
  2. import org.hibernate.HibernateException;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.Transaction;
  6. import org.hibernate.cfg.Configuration;
  7. import com.wdzl.entity.School;
  8. public class Test04 {
  9. public static void main(String[] args) {
  10. try {
  11. //加载配置文件
  12. Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
  13. //创建会话工厂
  14. SessionFactory factory = cfg.buildSessionFactory();
  15. //创建会话session
  16. Session session = factory.openSession();
  17. //开启事务
  18. Transaction tran = session.beginTransaction();
  19. //根据主键查询对象
  20. School school = session.get(School.class, 1);
  21. //持久化 删除
  22. session.delete(school);
  23. //提交事务
  24. tran.commit();
  25. //关闭会话
  26. session.close();
  27. //关闭工厂 释放资源
  28. factory.close();
  29. } catch (HibernateException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }

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

12. 总结

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

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

​ 加载配置文件;

​ 创建会话工厂 SessionFactory;

​ 创建会话 Session;

​ 开启事务;

​ 持久化操作;

​ 提交事务;

​ 关闭会话;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/870900
推荐阅读
相关标签
  

闽ICP备14008679号