Hibernate框架的概述

一、框架的概述

1、初次接触框架,那么问题来了,什么是框架?

  • 框架:指的是软件的半成品,已经完成了部分功能。

二、EE的三层架构

1、EE的经典三层结构

三、Hibernate的概述

1、什么是Hhibernate

2、什么是ORM

3、Hibernate的优点

Hibernate的入门

一、Hiernate入门

1、下载Hibernate的开发环境

  • Hiberante一共有三个大版本:Hibernate3.x、Hibernate4.x、Hibernate5.x;
    • 其中Hibernate4.x版本由于改动过大与Hibernate3.x很多内容都不兼容,基本不再使用,而后来出的Hibernate5.x与之前的Hibernate3.x兼容性良好,所以现在市面上绝大部分使用的是3.x和5.x的版本。
  • Hibernate下载地址:

https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/

2、解压Hibernate

3、创建一个项目,引入jar包:

4、从案例出发,创建数据库和表

CREATE TABLE `cst_customer` (`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',`cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',`cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',`cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',`cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',`cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',`cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

5、创建实体类

public class Customer {private Long cust_id;private String cust_name;private String cust_source;private String cust_industry;private String cust_level;private String cust_phone;private String cust_mobile;

6、创建映射(重要)

  • 映射需要通过XML的配置文件来完成,这个配置文件可以任意命名。但尽量统一命名规范(类名.hbm.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: 完整类名(带完整包结构)table: 数据库表名--><class name="com.heer.hibernate.demo1.Customer" table="cst_customer"><!-- 建立类中的属性与表中的主键对应 --><!-- id元素:配置主键映射的属性name:填写主键对应的属性名column(可选):填写表中的主键列名.默认值:主键会默认使用属性名type(可选):填写列(属性)的类型。hibernate会自动检测实体的属性类型每个类型有三种填法:java类型|hibernate类型|数据库类型not-null(可选):配置该属性(列)是否不能为空。默认值:falselength(可选):配置数据库中列的长度。默认值:使用数据库类型的最大长度--><id name="cust_id" column="cust_id"><!-- 主键生成策略 --><generator class="native"/></id><!-- 建立类中的普通的属性和表中的字段的对应 --><property name="cust_name" column="cust_name"/><property name="cust_source" column="cust_source"/><property name="cust_industry" column="cust_industry"/><property name="cust_level" column="cust_level"/><property name="cust_phone" column="cust_phone"/><property name="cust_mobile" column="cust_mobile"/></class></hibernate-mapping>
    

7、创建一个Hibernate的核心配置文件(重要)

  • Hibernate的核心配置文件的名称,统一命名为:hibernate.cfg.xml,当然,其他的名称也可以,但是不推荐改
      <?xml version="1.0" encoding="UTF-8"?><!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><!-- 必选属性配置5个 --><!-- 连接数据库的基本参数 --><!-- 数据库驱动 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- 数据库url --><property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property><!-- 数据库连接用户名 --><property name="hibernate.connection.username">root</property><!-- 数据库连接密码 --><property name="hibernate.connection.password">123456</property><!-- 配置Hibernate的方言:不同的数据库中,sql语法稍有区别,指定方言可以让hibernate框架在生成sql语句时,针对数据库的方言生成sql99标准:  DDL:数据定义语言 库表的增删改查DCL:数据控制语言 事务 权限DML:数据操纵语言 增删改查注意:mysql在选择方言时,会选择最短的方言 org.hibernate.dialect.MySQLDialect--><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 可选配置3个 --><!-- 打印SQL语句,将hibernate生成的sql语句打印在控制台 --><property name="hibernate.show_sql">true</property><!-- 格式化SQL语句,将hibernate生成的sql语句格式化(缩进) --><property name="hibernate.format_sql">true</property><!--auto schema export 自动导出表结构 ,自动建表hibernate.hbm2ddl.auto create 自动建表,每次运行框架都会创建新的表,以前的表会被覆盖,数据会丢失(开发环境测试使用)hibernate.hbm2ddl.auto create-drop 自动建表,每次运行框架结束后都会删除多使用的表(开发环境测试使用) hibernate.hbm2ddl.auto update (推荐使用) 自动生成表,如果已经存在则不会生成,直接使用,如果表有变动,自动更新表(不会删除表内容)hibernate.hbm2ddl.auto validate 校验:不自动建表,每次启动会校验数据库中的表是否正确,不正确则校验失败,抛出异常--><property name="hibernate.hbm2ddl.auto">update</property><!-- 配置C3P0连接池,别忘了引入jar包 --><property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property><!--在连接池中可用的数据库连接的最少数目 --><property name="c3p0.min_size">5</property><!--在连接池中所有数据库连接的最大数目  --><property name="c3p0.max_size">20</property><!--设定数据库连接的过期时间,以秒为单位,如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 --><property name="c3p0.timeout">120</property><!--每3000秒检查所有连接池中的空闲连接 以秒为单位--><property name="c3p0.idle_test_period">3000</property><!-- 引入(ORM数据源)映射文件 --><mapping resource="com/heer/hibernate/demo1/Customer.hbm.xml"/></session-factory></hibernate-configuration>
    

8、编写测试代码(重要)

package com.heer.hibernate.demo1;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;/*** Hibernate入门案例* @author hand**/
public class HibernateTestConfig {@Test// 保存客户的案例public void demo1(){// 1.加载Hibernate的核心配置文件Configuration configuration = new Configuration().configure();// 如果是加载的属性文件即hibernate.properties文件,则使用下面的方法,只需要new一个对象即可// Configuration configuration = new Configuration();// 若hibernate.cfg.xml文件中没有加入映射文件,可以在此处手动加载// configuration.addResource("com/heer/hibernate/demo1/Customer.hbm.xml");// 2.创建一个SessionFactory对象:类似于JDBC中的连接池SessionFactory sessionFactory = configuration.buildSessionFactory();// 3.通过SessionFactory获取到Session对象:类似于JDBC中ConnectionSession session = sessionFactory.openSession();// 4.手动开启事务(在Hibernate5中可以不用管,为了兼容Hibernate3,这块以后交给spring处理)Transaction transaction = session.beginTransaction();// 5.编写代码Customer customer = new Customer();customer.setCust_name("张三");// 执行保存session.save(customer);// 6.事务提交transaction.commit();// 7.资源释放session.close();}}

Hibernate常见的配置

一、XML提示的配置

1、配置XML提示(在没有联网的情况下可以进行自动提示)



二、Hibernate的映射配置

1、映射文件的配置

1) 【class标签的配置】

  • class标签用来建立类与表的映射关系
    • 属性:

      • name :类的全路径
      • table :表名(类名与表名一致,table可以省略)
      • catalog :数据库名

2) 【id标签的配置】

  • id标签用来建立类中的属性与表中的主键的对应关系
    • 属性:

      • name :类中的属性名
      • column :表中的字段名(类中的属性名和表中的字段名如果一致,column可以省略)
      • length :长度
      • type :类型

3) 【property标签的配置】

  • property标签用来建立类中的普通属性与表的字段的对应关系
    • 属性:

      • name :类中的属性名
      • column :表中的字段名
      • length :长度
      • type :类型
      • not-null :设置非空
      • unique :设置唯一

三、Hibernate的核心文件配置

1、Hibernate的核心配置方式(了解)

1) 第一种方式:属性文件的方式

  • 文件名称: hibernate.properties
      hibernate.connection.driver_class=com.mysql.jdbc.Driver…hibernate.show_sql=true
    

注意:属性文件的方式不能引入映射文件(需要手动编写代码加载映射文件)

2) 第二种方式:XML文件的方式

文件名称: hibernate.cfg.xml

2、核心的配置

Hibernate的核心API

一、Hibernate的API

1、Configuration :Hibernate的配置对象

2、SessionFactory :Session工厂

  • SessionFactory内部维护了Hibernate的连接池和Hibernate的二级缓存。是线程安全的对象。一个项目创建一个对象即可。
    • 配置C3P0连接池:(了解)
        <!-- 配置C3P0连接池 --><property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property><!--在连接池中可用的数据库连接的最少数目 --><property name="c3p0.min_size">5</property><!--在连接池中所有数据库连接的最大数目  --><property name="c3p0.max_size">20</property><!--设定数据库连接的过期时间,以秒为单位,如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 --><property name="c3p0.timeout">120</property><!--每3000秒检查所有连接池中的空闲连接 以秒为单位--><property name="c3p0.idle_test_period">3000</property>
      
    • 抽取工具类
        package com.heer.hibernate.utils;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;/*** Hibernate的工具类* 一个项目只会有一个SessionFactory的对象* @author hand* 2018年11月14日 上午10:03:06*/public class HibernateUtils {// 定义session创建所需要的Configuration,SessionFactory,都定义成静态的public static final Configuration cfg;public static final SessionFactory sf;// 对上面的两个对象进行赋值,静态代码块static{cfg = new Configuration().configure();sf = cfg.buildSessionFactory();}// 对外提供一个方法,返回openSession()public static Session openSession(){return sf.openSession();}}
      

3、Session : 类似Connection对象,是连接对象


Session代表的是Hibernate与数据库的链接对象。不是线程安全的。是与数据库交互的桥梁。

  • Session中的API

1) 保存方法:

  • Serializable save(Object obj);

      @Test// 保存基本数据案例public void testUtil(){// 获取session对象Session session = HibernateUtils.openSession();// 开启事务Transaction transaction = session.beginTransaction();Customer customer = new Customer();customer.setCust_name("王小二");// session保存,等有了其他的框架之后,上下的所有语句都没有了,只有这一句话session.save(customer);// 事务提交transaction.commit();// 释放资源session.close();}
    

2) 查询方法:

  • T get(Class c,Serializable id);

  • T load(Class c,Serializable id);

  • get方法和load方法的区别

     @Test// 查询操作// ***get方法和load方法的区别public void testGetAndLoad(){Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();/*** get方法* * 采用的是立即加载,执行到这行代码的时候,就会马上发送sql语句进行查询;* * 查询后返回的是对象本身;* * 查询一个找不到的对象的时候,返回null;* * load方法* * 采用的是延迟加载(lazy加载),执行到这行代码的时候,不会发送sql语句,当真正使用这个对象的时候才会发送sql语句;* * 查询后返回的是代理对象。javassist-3.18.1-GA.jar 利用javassist技术产生的代理。* * 查询一个扎偶倒的对象的时候,返回ObjectNotFoundException异常* */// 使用get方法查询/*Customer customer = session.get(Customer.class, 1l);System.out.println(customer);*/// 使用load方法查询Customer customer = session.load(Customer.class, 1l);System.out.println(customer);transaction.commit();session.close();}
    

3) 修改方法

  • void update(Object obj);

       @Test// 修改操作public void testUpdate(){Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();// 直接创建对象,进行修改/*Customer customer = new Customer();customer.setCust_id(1l);customer.setCust_name("王二小");session.update(customer);*/// 先进行查询,再修改(推荐)Customer customer = session.get(Customer.class, 1l);customer.setCust_name("王小贱");session.update(customer);transaction.commit();session.close();}
    

4) 删除方法

  • void delete(Object obj);

      @Test// 删除操作public void testDelete(){Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();// 创建对象,进行删除/*Customer customer = new Customer();customer.setCust_id(1l);session.delete(customer);*/// 先进行查询,在进行删除操作(推荐使用)---Hibernate有级联删除,级联删除的条件是先查询后删除Customer customer = session.get(Customer.class, 2l);session.delete(customer);transaction.commit();session.close();}
    

5) 保存或更新

  • void saveOrUpdate(Object obj);

      @Test// 保存或更新操作public void testSaveOrUpdate(){Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();// 保存方法/*Customer customer = new Customer();customer.setCust_name("王大锤");session.saveOrUpdate(customer);*/// 修改操作Customer customer = new Customer();customer.setCust_id(4l);           // 如果id不存在的话,则会报错customer.setCust_name("美如画");session.saveOrUpdate(customer);transaction.commit();session.close();}
    

6) 查询所有

 @Test// 查询所有操作public void testQuery(){Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();// 接收HQL:Hibernate Query Language面向对象的查询语言,一般情况下都是用此方法,因为来源是一个对象/*Query query = session.createQuery("from Customer");List<Customer> list = query.list();for (Customer customer : list){System.out.println(customer);}*/// 接收SQL:只有在当sql语句特别复杂的时候才会使用此方法SQLQuery query = session.createSQLQuery("select * from cst_customer");List<Object[]> list = query.list();for (Object[] objects : list){System.out.println(Arrays.toString(objects));}transaction.commit();session.close();}

4、Transaction : 事务对象

  • Hibernate中管理事务的对象。
    commit();            事务提交
    rollback();         事务回滚
    

学习Hibernate框架笔记-第1天相关推荐

  1. 学习Hibernate框架笔记-第2天

    持久化类的编写规则 一.持久化类的概述 1.什么是持久化类 持久化:将内存中的一个对象持久化到数据库中的过程. Hibernate框架就是用来进行持久化的框架. 持久化类:一个Java对象与数据库中的 ...

  2. 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架

    这篇博客是hibernate学习的第一篇,主要简单介绍hibernate框架,之后简单说一下hibernate的目录结构,最后写一个简单的hibernate实例.通过这三步来简单的认识一下hibern ...

  3. 深入浅出学习Hibernate框架(二):JDBC基础操作

    上篇博客<深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架>简单介绍了一下Hibernate框架,并且举了一个实例来了解Hibernate.这篇博客将介绍JD ...

  4. Hibernate框架基础——Hibernate入门

    Hibernate入门 Hibernate介绍 Hibernate是一个基于jdbc的开源的持久化框架,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作.Hibernate对JDBC访问数据 ...

  5. Hibernate框架--学习笔记(上):hibernate项目的搭建和常用接口方法、对象的使用

    一.什么是Hibernate框架: 1.Hibernate是一个操作数据库的框架,实现了对JDBC的封装: 2.Hibernate是一个ORM(对象关系映射)框架,我们在写程序时 ,用的是面向对象的方 ...

  6. hibernate框架学习笔记2:配置文件详解

    实体类: package domain;public class Customer {private Long cust_id;private String cust_name;private Str ...

  7. AI学习笔记(九)从零开始训练神经网络、深度学习开源框架

    AI学习笔记之从零开始训练神经网络.深度学习开源框架 从零开始训练神经网络 构建网络的基本框架 启动训练网络并测试数据 深度学习开源框架 深度学习框架 组件--张量 组件--基于张量的各种操作 组件- ...

  8. 吴恩达老师深度学习视频课笔记:超参数调试、Batch正则化和程序框架

            Tuning process(调试处理):神经网络的调整会涉及到许多不同超参数的设置.需要调试的重要超参数一般包括:学习率.momentum.mini-batch size.隐藏单元( ...

  9. Java常用框架笔记(1)

    Linux操作系统 重点在于使用,理论可以几乎忽略 学习原因: 我们一般是在Windows上开发,Linux上去做部署 市面上的常见的操作系统 Windows系列,unix系统,Linux系统,mac ...

  10. Hibernate课堂笔记

    Hibernate课堂笔记 Hibernate第一天 一:hibernate的基础知识 Hibernate的整体思想就是"操作对象的过程,就是操作数据库表的过程".如图: 1:Hi ...

最新文章

  1. 【C#实践】三层实例:登录过程
  2. Linux 线程的创建与同步
  3. CocoaPods was not found 解决
  4. 程序员,你是真的该养生了
  5. 条件 推导 迭代 并行
  6. java安全初始化_java安全编码指南之:声明和初始化
  7. 数字光端机和模拟视频光端机的六个不同点
  8. windows下SBT的安装与使用
  9. ImportError : No module named graphics
  10. binary 和 varbinary 用法全解
  11. Magick 使用注意
  12. srs信道估计_SRS 上行信道质量测量
  13. cmake的使用(cmake不是内部或外部命令)
  14. input输入框添加键盘事件
  15. dns服务器异常不能上网怎么修复,DNS错误无法正常上网怎么办?
  16. 一世人中,最黑仔嘅一日
  17. 心得|Python新手如何渡过小白期,不再当菜鸟程序员?
  18. postgresql 表分区
  19. 如何恢复小强中被修改的软件包
  20. Python的模式匹配

热门文章

  1. 计算机图形学的边表教学ppt,计算机图形学(多边形的扫描转换).ppt
  2. 高效能人士的七个习惯-第二章-阅读
  3. MySQL的json查询之->、->>、json_extract、json_unquote
  4. 石墨烯在生物医学上应用的研究进展_石墨烯在润滑油中的应用
  5. hget和get redis_redis hget阻塞 使用redis时遇到的问题 - Redis - 服务器之家
  6. 离散作业--求左陪集
  7. 网易云易盾发布多国家多语种内容安全服务,助力中国互联网出海
  8. MCE | 外泌体的检测提取机制
  9. Docker 启动报错 Error starting daemon: SELinux is not supported with the overlay2 ...alse)
  10. 宝塔面板网站解决跨域问题