Hibernate入门学习

news2024/11/19 18:36:44

目录

1、ORM思想概述

2、自定义ORM框架

3、第一个Hibernate程序开发步骤(重要)

1)下载完整包

2)创建项目,导入所需jar包

3)建立student表

4)创建和student表对应的Student实体类

5)创建student表与Student实体类之间的关系映射文件

6)创建hibernate与MYSQL数据库的连接配置文件

7)编写测试代码


1、ORM思想概述

        对象数据到关系数据映射的规则/框架/工具。

            ORM的优点:

                 1. 完全面向对象的编程思想,无SQL出现.

                 2. 减少代码编写,提高工作效率.

                 3. 提高访问数据库的性能,降低访问数据库的频率.

                 4. 具有独立性,发生变化时,不会影响上层的实现.

        Hibernate是什么?

             面向java环境的对象/关系数据库映射框架/工具。

                 1. 开源免费的持久层框架.

                 2. ORM(Object/Relational Mapping)实现之一,建立面向对象的域和关系之间的映射.

                 3. 对JDBC进行封装,负责java对象的持久化(CURD).

                 4. 在分层结构中处于持久化层,封装对数据库的访问细节,使业务逻辑层更专注于实现业务逻辑

        结论:Hibernate是一个对jdbc进行封装的ORM思想的持久层框架。

2、自定义ORM框架

        目标:在DAO层,设计一个通用的Session类,包含一个通用save()保存方法,任意传入一个带有数据的对象就可以保存到指定的表中。

         步骤:

                 1)在数据库设计一张student表,如下:

                

                 2)建立实体对象及对象的映射xml文件

Student实体对象:

public class Student {

   private int id;

   private String name;

   private String gender;

   private int age;

   public int getId() {

      return id;

   }

   public void setId(int id) {

      this.id = id;

   }

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

   public String getGender() {

      return gender;

   }

   public void setGender(String gender) {

      this.gender = gender;

   }

   public int getAge() {

      return age;

   }

   public void setAge(int age) {

      this.age = age;

   }

}

Student.hbm.xml文件

<?xml version="1.0" encoding="utf-8"?>

<hibernate-mapping>

   <!--

      class: 表示需要保存的实体类

      table: 表示需要保存到表

    -->

   <class name="gz.itcast.entity.Student" table="student">

      <!--

          name: 表示实体类的属性

          column:表示表的字段名称

       -->

      <property name="id" column="id"></property>

      <property name="name" column="name"></property>

      <property name="gender" column="gender"></property>

      <property name="age" column="age"></property>

   </class>

</hibernate-mapping>

                 3)Student的DAO类

public class StudentDao {

  

   public void saveStudent(Student student){

      Session session = new Session();

      session.save(student);

   }

}

                 4)通用的Session类的设计(目的为了保存对象及保存表的数据)

public class Session {

   QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());

   //执行sql语句

   String sql = null;

   //参数值

   Object[] values = null;

   //保存方法

   public void save(Object obj){

      //获取sql和参数值

      buildSqlAndParam(obj);

      try {

          qr.update(sql,values);

      } catch (SQLException e) {

          e.printStackTrace();

          throw new RuntimeException(e);

      }

   }

   //insert into student(id,name,gender,age) values(?,?,?,?)

   //构建sql语句

   private void buildSqlAndParam(Object obj){

      try {

          List<Object> params = new ArrayList<Object>();

          InputStream is = Session.class.getResourceAsStream("/gz/itcast/entity/Student.hbm.xml");

          SAXReader reader = new SAXReader();

          Document doc = reader.read(is);

          String sql1 = "insert into ";

          String sql2 = " values(";

         

          Class clazz = obj.getClass();

          String className= clazz.getName();

         

          List<Element> list = doc.getRootElement().elements("class");

          for(Element elem:list){

             if(elem.attributeValue("name").equals(className)){

                //表名

                String tableName = elem.attributeValue("table");

                sql1 += "student(";

                //System.out.println(tableName);

                List<Element> propElems = elem.elements("property");

               

                for(Element propElem:propElems){

                   String columnName = propElem.attributeValue("column");

                   sql1 += columnName+",";

                   sql2 += "?,";

                  

                   //取对象的值

                   String name = propElem.attributeValue("name");

                   Field field = clazz.getDeclaredField(name);

                   field.setAccessible(true);

                   params.add(field.get(obj));

                }

                sql1 = sql1.substring(0,sql1.length()-1);

                sql2 = sql2.substring(0,sql2.length()-1);

                sql1 += ")";

                sql2 += ")";

             }

          }

          System.out.println(sql1+sql2);

          System.out.println(params);

          //赋值

          sql = sql1+sql2;

          values = params.toArray();

      } catch (Exception e) {

          e.printStackTrace();

          throw new RuntimeException(e);

      }

   }

}

        5)测试类

public class TestDao {

   public static void main(String[] args) {

      StudentDao stuDao = new StudentDao();

      Student student = new Student();

      student.setId(1);

      student.setName("张三");

      student.setGender("");

      student.setAge(20);

      stuDao.saveStudent(student);

   }

}

3、第一个Hibernate程序开发步骤(重要)

开发步骤:

1)下载完整包

        到hibernate官网下载完整zip包 。hibernate-release-4.3.8.Final.zip

2)创建项目,导入所需jar包

        建立java项目,导入所需jar包,拷贝%hibernate%/lib/required目录下的所有jar包

3)建立student表

                

4)创建和student表对应的Student实体类

public class Student {

   private int id;

   private String name;

   private String gender;

   private int age;

   public int getId() {

      return id;

   }

   public void setId(int id) {

      this.id = id;

   }

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

   public String getGender() {

      return gender;

   }

   public void setGender(String gender) {

      this.gender = gender;

   }

   public int getAge() {

      return age;

   }

   public void setAge(int age) {

      this.age = age;

   }

   @Override

   public String toString() {

      return "Student [id=" + id + ", name=" + name + ", gender=" + gender

             + ", age=" + age + "]";

   }

}

5)创建student表与Student实体类之间的关系映射文件

        技术:XML

       名字:理论上前缀不限,后缀必须是小写字母xml,但提倡使用如下格式:实体类名.hbm.xml

     位置:理论不限,但提倡放在与实体类同一个目录下

<?xml version="1.0"?>

<!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="gz.itcast.entity.Student" table="student">

      <!-- 主键配置 -->

      <id name="id" column="id">

          <!-- 主键策略 -->

          <generator class="assigned"></generator>

      </id>

      <property name="name" column="name"></property>

      <property name="gender" column="gender"></property>

      <property name="age" column="age"></property>

   </class>

</hibernate-mapping>

6)创建hibernate与MYSQL数据库的连接配置文件

        技术:XML

       名字:理论上前缀不限,后缀必须是小写字母xml,但提倡使用如下格式:hibernate.cfg.xml

     位置:理论不限,但提倡放在IDE工具的src目录下

<!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="hibernate.connection.driver_class">

      com.mysql.jdbc.Driver

   </property>

   <property name="hibernate.connection.url">

      jdbc:mysql://localhost:3306/day14?useUnicode=true&amp;characterEncoding=utf-8

   </property>

   <property name="hibernate.connection.username">root</property>

   <property name="hibernate.connection.password">root</property>

   <!-- 数据库方言 -->

   <property name="hibernate.dialect">

      org.hibernate.dialect.MySQL5InnoDBDialect

   </property>

   <!-- 对象关系映射的配置 -->

   <mapping resource="gz/itcast/entity/Student.hbm.xml" />

</session-factory>

</hibernate-configuration>

       

7)编写测试代码

public class TestHello {

  

   public static void main(String[] args) {

          //创建配置管理器对象

          Configuration configuration = new Configuration().configure();

         

          //创建服务注册器

          StandardServiceRegistry serviceRegistry =

                new StandardServiceRegistryBuilder().

                applySettings(configuration.getProperties()).

                build();

          //创建SessionFactory对象

          SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

          //获得Session对象

          Session session = sessionFactory.openSession();

          //打开事务

          Transaction tx = session.beginTransaction();

         

          Student s = new Student();

          s.setId(4);

          s.setName("陈六");

          s.setGender("");

          s.setAge(20);

          //保存方法

          session.save(s);

          //提交事务

          tx.commit();

          //关闭Session连接

          sessionFactory.close();

   }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1642120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sarcasm detection论文解析 |A2Text-Net:一种用于讽刺检测的新型深度神经网络

论文地址 论文地址&#xff1a;A2Text-Net: A Novel Deep Neural Network for Sarcasm Detection | IEEE Conference Publication | IEEE Xplore github:lliyuan1117/A2Text-Net (github.com) 论文首页 A2Text-Net&#xff1a;一种用于讽刺检测的新型深度神经网络 &#x1f4c5…

Gradle 进阶学习 之 build.gradle 文件

build.gradle 是什么&#xff1f; 想象一下&#xff0c;你有一个大型的乐高项目&#xff0c;你需要一个清单来列出所有的乐高积木和它们如何组合在一起。在软件开发中&#xff0c;build.gradle 就是这个清单&#xff0c;它告诉计算机如何构建&#xff08;组合&#xff09;你的软…

阿里低代码引擎学习记录

官网 一、关于设计器 1、从设计器入手进行低代码开发 设计器就是我们用拖拉拽的方法&#xff0c;配合少量代码进行页面或者应用开发的在线工具。 阿里官方提供了以下八个不同类型的设计器Demo&#xff1a; 综合场景Demo&#xff08;各项能力相对完整&#xff0c;使用Fusion…

掌握JavaScript面向对象编程核心密码:深入解析JavaScript面向对象机制对象概念、原型模式与继承策略全面指南,高效创建高质量、可维护代码

ECMAScript&#xff08;简称ES&#xff0c;是JavaScript的标准规范&#xff09;支持面向对象编程&#xff0c;通过构造函数模拟类&#xff0c;原型链实现继承&#xff0c;以及ES6引入的class语法糖简化面向对象开发。对象可通过构造函数创建&#xff0c;使用原型链共享方法和属…

16、ESP32 Web

Web 服务器具有移动响应能力&#xff0c;可以使用本地网络上的任何设备作为浏览器进行访问。 示例功能&#xff1a; 构建 Web 服务器控制连接到 ESP32 的 LED在本地网络的浏览器上输入 ESP32 IP 地址访问 Web 服务器通过单击 Web 服务器上的按钮&#xff0c;更改 LED 状态 //…

C#语言基础

一、复杂数据类型 1. 枚举 1.1 基本概念 1.1.1 枚举是什么 枚举是一个被命名的整型常量的集合&#xff0c;一般用它来表示状态、类型等等 1.1.2 申明枚举和申明枚举变量 申明枚举和申明枚举变量是两个概念 申明枚举&#xff1a;相当于是创建一个自定义的枚举类型 申明枚…

C#实战—代码实现收发文件智能化

在信息化的今天&#xff0c;收发电子文档几乎是每个朋友都要经历的事情。比如班级学委和班长需要收发作业&#xff0c;企业管理者需要收发工作文件。但是&#xff01;&#xff01;&#xff01; 每到要交结果时&#xff0c;往往会发现总会有一些人没有即使交上&#xff0c;50个…

【Leetcode每日一题】 综合练习 - 全排列 II(难度⭐⭐)(71)

1. 题目解析 题目链接&#xff1a;47. 全排列 II 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路梳理 为了生成给定数组nums的全排列&#xff0c;同时避免由于重复元素导致的重复排列&#xff0c;我们可以遵…

面试中算法(2的整数次幂)

判断一个正整数是否是2的整数次幂&#xff08;如16是2的4次方&#xff0c;返回true;18不是2的整数次幂&#xff0c;则返回false&#xff09;&#xff0c;要求性能尽可能高。 使用一个整型变量&#xff0c;让它从1开始不断乘以2&#xff0c;将每一次乘2的结果和 目标整数进行比较…

【python的魅力】:教你如何用几行代码实现文本语音识别

文章目录 引言一、运行效果二、文本转换为语音2.1 使用pyttsx32.2 使用SAPI实现文本转换语音2.3 使用 SpeechLib实现文本转换语音 三、语音转换为文本3.1 使用 PocketSphinx实现语音转换文本 引言 语音识别技术&#xff0c;也被称为自动语音识别&#xff0c;目标是以电脑自动将…

【网站项目】社区互助平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Object Desktop - Stardock 软件开发商系列套件

Windows 的一大优势在于可高度自定义&#xff0c;能让我们把它打造成一个最符合自己需求的工作和娱乐工具。 在桌面增强工具套件 Object Desktop 中&#xff0c;包含了 Stardock 旗下 10 款生产力和美化工具&#xff0c;可帮助我们打造出美观、实用、高效的 Windows 系统。 St…

Leetcode—163. 缺失的区间【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—163. 缺失的区间 实现代码 class Solution { public:vector<vector<int>> findMissingRanges(vector<int>& nums, int lower, int upper) {int n nums.size();vector<vector<int>> an…

文件(夹)批量重命名数字、字母、日期、中文数字大写小写

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 目标是重命名下面5个文件&#xff08;也可以是文件夹等&#xff0c;任意&#xff09;&#xff0c;从大写中文数字“贰”开始 打开工具&#xff0c;找到“文…

SNR: Signal to Noise Ratio

https://www.xx.com/watch?vmyrZ_R6xIZA Fang, Y., Armin, A., Meredith, P. et al. Accurate characterization of next-generation thin-film photodetectors. Nature Photon 13, 1–4 (2019). https://doi.org/10.1038/s41566-018-0288-z Wang, F., Zhang, T., Xie, R. e…

[XYCTF新生赛]-PWN:fmt解析(scanf格式化字符串漏洞,任意地址写)

查看保护 查看ida 这里没什么好说的 完整exp&#xff1a; from pwn import* context(log_leveldebug) #pprocess(./fmt) premote(gz.imxbt.cn,20975) backdoor0x4012BEp.recvuntil(bgift: ) printf_addrint(p.recv(14),16) print(hex(printf_addr)) libcELF(./libc-2.31.so) …

【计算机网络】循环冗余校验:Cyclic Redundancy Check

1. 任务目标 利用循环冗余校验&#xff08;CRC&#xff09;检测错误。 循环冗余校验&#xff08;英语&#xff1a;Cyclic redundancy check&#xff0c;通称 CRC&#xff09;是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数&#xff0c;主要用来…

消息队列与信号量(基本概念及操作接口介绍)

一、消息队列 基本概念 System V消息队列是Unix系统中一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;它允许进程互相发送和接收数据块&#xff08;消息&#xff09; 操作系统可以在内部申请一个消息队列&#xff0c;可以让不同的进程向消息队列中发送数据块&…

Java中使用RediSearch进行高效数据检索

RediSearch是一款构建在Redis上的搜索引擎&#xff0c;它为Redis数据库提供了全文搜索、排序、过滤和聚合等高级查询功能。通过RediSearch&#xff0c;开发者能够在Redis中实现复杂的数据搜索需求&#xff0c;而无需依赖外部搜索引擎。本文将介绍如何在Java应用中集成并使用Red…