学习Hibernate框架笔记-第1天
Hibernate框架的概述
一、框架的概述
1、初次接触框架,那么问题来了,什么是框架?
框架:指的是软件的半成品,已经完成了部分功能。
二、EE的三层架构
1、EE的经典三层结构
三、Hibernate的概述
1、什么是Hhibernate
Hibernate :Hibernate是一个持久层的ORM框架。
2、什么是ORM
ORM : Object Relational Mapping (对象关系映射)。
指的是将一个Java中的对象与关系型数据库中的表建立一种映射关系,从而实现操作对象就可以操作数据库中的表。
3、Hibernate的优点
与其他操作数据库的技术相比,Hibernate具有以下几点优势:
Hibernate对JDBC访问数据的代码做了轻量级封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存消耗,加快运行效率;
Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO(Data Access Object)层编码工作;
Hibernate的性能非常好,映射的凌华星很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系;
Hibernate的扩展性很强,由于源代码的开源以及API的开放,当本身功能不够用是,可以自行编码进行扩展。
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
documentation :Hibernate开发的文档
lib :Hibernate开发包
required :Hibernate开发的必须的依赖包
optional :Hibernate开发的可选的jar包
project :Hibernate提供的项目
3、创建一个项目,引入jar包:
数据库驱动包
Hibernate开发的必须的jar包
Hibernate引入日志记录包
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、核心的配置
必选配置
可选配置
显示SQL :hibernate.show_sql
格式化SQL :hibernate.format_sql
自动建表 :hibernate.hbm2ddl.auto
none :不使用hibernate的自动建表
create :如果数据库中已经有表,删除原有表,重新创建,如果没有表,新建表。(测试)
create-drop :如果数据库中已经有表,删除原有表,执行操作,删除这个表。如果没有表,新建一个,使用完之后删除该表。(测试)
update :如果数据库中有表,使用原有表,如果没有表,创建新表(更新表结构),推荐使用
validate :如果没有表,不会创建表。只会使用数据库中原有的表。(校验映射和表结构)。
映射文件的加载
引入映射文件的位置(在配置文件的最下面的一行写):
Hibernate的核心API
一、Hibernate的API
1、Configuration :Hibernate的配置对象
作用:
加载核心配置文件
hibernate.properties
Configuration cfg = new Configuration();
hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
加载映射文件
// 手动加载映射configuration.addResource("com/itheima/hibernate/demo1/Customer.hbm.xml");
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天相关推荐
- 学习Hibernate框架笔记-第2天
持久化类的编写规则 一.持久化类的概述 1.什么是持久化类 持久化:将内存中的一个对象持久化到数据库中的过程. Hibernate框架就是用来进行持久化的框架. 持久化类:一个Java对象与数据库中的 ...
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
这篇博客是hibernate学习的第一篇,主要简单介绍hibernate框架,之后简单说一下hibernate的目录结构,最后写一个简单的hibernate实例.通过这三步来简单的认识一下hibern ...
- 深入浅出学习Hibernate框架(二):JDBC基础操作
上篇博客<深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架>简单介绍了一下Hibernate框架,并且举了一个实例来了解Hibernate.这篇博客将介绍JD ...
- Hibernate框架基础——Hibernate入门
Hibernate入门 Hibernate介绍 Hibernate是一个基于jdbc的开源的持久化框架,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作.Hibernate对JDBC访问数据 ...
- Hibernate框架--学习笔记(上):hibernate项目的搭建和常用接口方法、对象的使用
一.什么是Hibernate框架: 1.Hibernate是一个操作数据库的框架,实现了对JDBC的封装: 2.Hibernate是一个ORM(对象关系映射)框架,我们在写程序时 ,用的是面向对象的方 ...
- hibernate框架学习笔记2:配置文件详解
实体类: package domain;public class Customer {private Long cust_id;private String cust_name;private Str ...
- AI学习笔记(九)从零开始训练神经网络、深度学习开源框架
AI学习笔记之从零开始训练神经网络.深度学习开源框架 从零开始训练神经网络 构建网络的基本框架 启动训练网络并测试数据 深度学习开源框架 深度学习框架 组件--张量 组件--基于张量的各种操作 组件- ...
- 吴恩达老师深度学习视频课笔记:超参数调试、Batch正则化和程序框架
Tuning process(调试处理):神经网络的调整会涉及到许多不同超参数的设置.需要调试的重要超参数一般包括:学习率.momentum.mini-batch size.隐藏单元( ...
- Java常用框架笔记(1)
Linux操作系统 重点在于使用,理论可以几乎忽略 学习原因: 我们一般是在Windows上开发,Linux上去做部署 市面上的常见的操作系统 Windows系列,unix系统,Linux系统,mac ...
- Hibernate课堂笔记
Hibernate课堂笔记 Hibernate第一天 一:hibernate的基础知识 Hibernate的整体思想就是"操作对象的过程,就是操作数据库表的过程".如图: 1:Hi ...
最新文章
- 【C#实践】三层实例:登录过程
- Linux 线程的创建与同步
- CocoaPods was not found 解决
- 程序员,你是真的该养生了
- 条件 推导 迭代 并行
- java安全初始化_java安全编码指南之:声明和初始化
- 数字光端机和模拟视频光端机的六个不同点
- windows下SBT的安装与使用
- ImportError : No module named graphics
- binary 和 varbinary 用法全解
- Magick 使用注意
- srs信道估计_SRS 上行信道质量测量
- cmake的使用(cmake不是内部或外部命令)
- input输入框添加键盘事件
- dns服务器异常不能上网怎么修复,DNS错误无法正常上网怎么办?
- 一世人中,最黑仔嘅一日
- 心得|Python新手如何渡过小白期,不再当菜鸟程序员?
- postgresql 表分区
- 如何恢复小强中被修改的软件包
- Python的模式匹配
热门文章
- 计算机图形学的边表教学ppt,计算机图形学(多边形的扫描转换).ppt
- 高效能人士的七个习惯-第二章-阅读
- MySQL的json查询之->、->>、json_extract、json_unquote
- 石墨烯在生物医学上应用的研究进展_石墨烯在润滑油中的应用
- hget和get redis_redis hget阻塞 使用redis时遇到的问题 - Redis - 服务器之家
- 离散作业--求左陪集
- 网易云易盾发布多国家多语种内容安全服务,助力中国互联网出海
- MCE | 外泌体的检测提取机制
- Docker 启动报错 Error starting daemon: SELinux is not supported with the overlay2 ...alse)
- 宝塔面板网站解决跨域问题