Hibernate入门学习

目录

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();

   }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

postman中百度preview无法加载的解决方案

问题 在使用postman关联时&#xff0c;百度接口与天气接口已使用glb_city关联&#xff0c;但在百度接口发送请求时&#xff0c;发现preview无法加载 解决方案 1、进入百度 百度全球领先的中文搜索引擎、致力于让网民更便捷地获取信息&#xff0c;找到所求。百度超过千亿的中…

基于Springboot的民航网上订票系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的民航网上订票系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

vue3 + ts 快速入门(全)

文章目录 学习链接1. Vue3简介1.1. 性能的提升1.2.源码的升级1.3. 拥抱TypeScript1.4. 新的特性 2. 创建Vue3工程2.1. 基于 vue-cli 创建2.2. 基于 vite 创建&#xff08;推荐&#xff09;vite介绍创建步骤项目结构安装插件项目结构总结 2.3. 一个简单的效果Person.vueApp.vue …

11个2024年热门的AI编码助手

大家好&#xff0c;人工智能&#xff08;AI&#xff09;领域的大型语言模型&#xff08;LLMs&#xff09;已经逐渐发展成熟&#xff0c;并且深入到了我们日常的工作当中。在众多AI应用中&#xff0c;编码助手尤为突出&#xff0c;是开发人员编写更高效、准确无误代码的必备辅助…

docker原理

Docker原理 在前面我们学习了Docker&#xff0c;接下来我们探究一下Docker的底层技术原理 Linux 命名空间&#xff08;namespace&#xff09;、控制组&#xff08;cgroups&#xff09;和 联合文件系统&#xff08;UnionFS&#xff09; 三大技术支撑了目前 Docker 的实现&…

STM32入门学习之DMA

1.直接存储访问DMA(Direct Memory Access)&#xff1a;DMA传输不需要CPU的参与&#xff0c;直接在内存和I/O设备间开辟了一条新的数据传输通道&#xff0c;不仅提高数据传输的速率&#xff0c;还因为不需要CPU的干预&#xff0c;从而提高了CPU的利用率。(注&#xff1a;文中的资…

OpenCV如何在图像中寻找轮廓(60)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何模板匹配(59) 下一篇 :OpenCV检测凸包(61) 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 cv::findContours使用 OpenCV 函数 cv::d rawContours …

基于SSM的校园短期闲置资源置换平台(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的校园短期闲置资源置换平台&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过…

英语语法动词和动词的虚拟语气

动词 谓语动词的三大功能&#xff1a;时、态、气 1、时 和 态 的组合构成了英语的 16 种时态。 2、气 表示的是动作的情感和假设。

uboot-网络配置

文章目录 一、网络简介二、修改PHY芯片地址三、删除 uboot 中 74LV595 的驱动代码1.删除宏定义&#xff0c;添加ENET1和ENET2复位引脚&#xff0c;宏定义2.删除内容如下 四、添加 I.MX6U-ALPHA 开发板网络复位引脚驱动 一、网络简介 &#x1f4a6;I.MX6UL/ULL 内部有个以太网 …

perl:用 MIDI::Simple 生成midi文件,用 pygame 播放 mid文件

在 csdn.net 下载 strawberry-perl-5.32.1.1-64bit.zip 解压安装在 D:\Strawberry\ 运行 cpan install MIDI::Simple D:\Strawberry\c\bin\gmake.exe test -- OK Running make install for CONKLIN/MIDI-Perl-0.84.tar.gz Installing D:\Strawberry\perl\site\lib\MIDI.pm I…

算法打卡day40

今日任务&#xff1a; 1&#xff09;139.单词拆分 2&#xff09;多重背包理论基础&#xff08;卡码网56携带矿石资源&#xff09; 3&#xff09;背包问题总结 4&#xff09;复习day15 139单词拆分 题目链接&#xff1a;139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; …

【数据库原理及应用】期末复习汇总高校期末真题试卷

试卷 一、填空题 1.________是位于用户与操作系统之间的一层数据管理软件。 2.数据库系统的三级模式结构是指________、________、________。 3.数据库系统的三种数据模型是________ 、________、________。 4.若关系中的某一属性组的值能唯一地标识一个元组&#xff0c;则…

项目管理-项目进度管理3/3

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 项目进度管理&#xff1a;需掌握 ITTO, 搞懂计算图&#xff0c;问题和解决方案。 项目进度管理6个过程&#xff0c;包括&#xff08;口…

Qt5.15.2安装Android开发环境。

下载Java 8&#xff0c;不要下Java 20 jdk8 安装跟着默认走就行&#xff1a;C:\Program Files\Java 需要将QtCreator的sdk_definitions.json文件修改一下 “cmdline-tools;latest” 修改为 “cmdline-tools;6.0” 在一个非中文路径&#xff0c;建立一个android-sdk-windows空…

MATLAB 微积分

MATLAB 微积分 MATLAB提供了多种方法来解决微分和积分问题&#xff0c;求解任意程度的微分方程式以及计算极限。最重要的是&#xff0c;您可以轻松求解复杂函数的图&#xff0c;并通过求解原始函数及其导数来检查图上的最大值&#xff0c;最小值和其他文具点。 本章将讨论微…

AD中如何器件带动导线一起旋转

选中器件和导线&#xff0c;右键点击联合&#xff0c;从选中的器件生成联合 点击屏幕右上角的小齿轮&#xff08;设置按钮&#xff09;&#xff0c;选择下图所示的旋转步进为45度&#xff08;或其他&#xff09;&#xff0c;器件拖拽设置为Connected Tracks 之后就可以按住空格…

从零开始搭建一个vue项目

从零开始搭建一个vue项目 一、环境准备 1.1 安装node.js 选择合适的LTS版本&#xff0c;然后下载安装&#xff0c;安装地址&#xff1a;https://nodejs.org/en/download 在命令行中查看已安装的node.js版本 node -v v14.14.01.2 切换为淘宝的镜像源 解决国内下载慢的问题,…

【数据结构(邓俊辉)学习笔记】向量06——位图

文章目录 0.概述1.结构2.实现3. 应用3.1 去重3.2 筛法 0.概述 位图&#xff08;Bitmap&#xff09;是一种特殊的序列结构&#xff0c;可用以动态地表示由一组&#xff08;无符号&#xff09;整数构成的集合。 test() 判断k 是否存在集合S中。set() 将k 加入到集合S中。clear…

免费APP分发平台 - 一个指南和解析

数字化时代的APP分发平台 随着数字化进程的加速免费APP分发平台 - 一个指南和解析&#xff0c;移动应用&#xff08;APP&#xff09;市场正迅速扩大。在这个充满竞争的市场中免费APP分发平台 - 一个指南和解析&#xff0c;一个优秀的APP分发平台能够帮助开发者和商家更有效地触…