Hibernate--Day01
Hibernate是一个面向对象的持久化框架
持久化:
1,把内存中的Java对象保存到存储设备上面;
2,最好的解诀方案:把对象持久化到数据库里面;
3, 在Java里面,把对象持久化到数据库只能使用JDBC;
框架:
1,框架是一个半成品,是一个脚手架,它可以方便的,快速的辅助开发人员针对某一领域进行快速开发;
2,使用框架,提高开发效率,减少重复代码,提高应用安全性,减少应用的bug;
3,框架一定是按照开发人员告诉他的方式去运行,交流的工具就是框架的配置文件或者约定;
框架怎么使用?
1,框架一般有配置文件(如果没有配置文件,也有注解或者规定的一套约定),所以这些内容规定了开发人员和框架的交互;
2,框架一定要通过某种方式启动;
学习框架的误区:
1,过于依赖记忆;
2, 过于纠结于框架的细节使用方式;
面向对象:
一个面向对象的持久化框架,在代码当中一定不可能出现关系的概念;
Hibernate的使用
hibernate项目结构:

1, documentation:hibernate的文档;
1), quickstart:快速开发指南;
2), manual :使用者手册(user gui de)
3), devgui de:开发者指南

2, lib: jar包
1), required:hibernate使用必须的包
2), optional :可选择的包:
3), jpa:hibernate完成JPA规范的包
4), envers:hibernate的一一个子项目;

3, project :hibernate项目相关的内容;
1),包括了代码,测试代码
2),包括了实例代码:
Hibernate环境搭建:
1,把所有required里面的jar包放到classpath中;
2,把mysql驱动放到classpath中;
hibermate的配置文件:
<session-factory> :session-factory:暂时理解为一一个DataSource;
<property>:配置sessi on-factory相关信息:
1,连接信息
connection driver_ class :驱动
connection url :url
connection userame:用户名
connection password:密码
2,其他信息
dialect:数据库方言:方言在告诉hibermate我现在使用的是什么数据库,你需要生成什么样的SQL
show_ sql :显示hibernate执行的SQL;
<mapping>:引入对象的映射文件;
hibernate的对象映射文件:
1,映射文件一般起名:类名.hbm.xml;一般放在对应的类型同一个包中;
2,hibernate-mapping.package:包名,
3,class:配置一个类型的映射
     1),name:类型的名称;
     2),table:该类型对应的表名;
4,id:配置主键
     1),name:在类型中哪个属性作为主键;
     2),column:在表中,哪个列作为主键;
     3),generator:配置主键的生成策略;告诉hibernate怎么去处理我们的主键,不同的主键生成策略对应着不同的SQL和不同的主键处理方式;
5,property:配置属性映射
     1),name:属性的名称;
     2),column:属性对应列的名称;
问题:
1,去掉sessionfactory上的name属性,可以去掉启动时候的错误;
2,可以通过配置show_sql来打印hibernate执行的SQL;
3,配置数据库方言信息,方言在告诉hibernate我现在使用的是什么数据库,你需要生成什么样的SQL
(方言信息屏蔽了数据库SQL的实现细节)
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
1,save方法的执行流程;

2,get方法的执行流程;

3,抽象HibernateUtil;
//hibernate工具类
public class HibernateUtil { private static final HibernateUtil instance = new HibernateUtil(); private SessionFactory sessionFactory; public HibernateUtil(){
//启动框架,读取配置文件
//Configuration:hibernate的配置对象;
//先创建一个配置对象,再调用configure方法执行配置;
//configure()方法实际上是调用了configure("/hibernate.hbm.xml");
Configuration cfg = new Configuration().configure();
//创建sessionFactory对象
//sessionFactory = cfg.buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry());
sessionFactory = cfg.buildSessionFactory();
} public static HibernateUtil getInstance(){
return instance;
} public Session openSession(){
return sessionFactory.openSession();
}
}
hibernate是一个ORM(对象-关系映射)框架;
面向对象概念 ------- 关系模型
类型                           表
      对象实例       表中的行
        属性         列
hibernate的ORM主要体现在hbm.xml文件中;
hibernate在我们应用当中的位置:

Hibernate的主要对象
Configuration:主要用来加载配置,解析配置;
通过Configuration对象获取SessionFactory对象;
1,Configuration对象提供了很多额外的通过API配置hibernate的方式;
2,buildSessionFactory虽然已经过期了,但是仍然是使用最广泛的得到sessionfactory的方法(大家平时就用这个)
3,新的sessionFactory方法:
sessionFactory =cfg.buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry());(不要求)
sessionFactory:
sessionFactory是一个线程安全的对象,所以,一般一个应用针对一个数据源只需要一个sessionfactory对象就可以了;
sessionFactory是用来创建session对象的;
openSession:开启一个全新的Session;
1,全新的Connection对象;
2,全新的事务;
Session对象:
session对象提供了对象持久化的各种方法:
1,beginTransaction:开启一个事务;
2,save(object):保存一个对象;
3,get(Class,Serializable):根据主键加载一个指定类型的对象实例;
4,update(object):修改一个对象,要求对象需要有id等值;
5,delete(object):删除一个对象,要求对象必须有id;
6,createQuery(String hql):创建一个查询对象;
7,close():关闭一个session;
8,session的生命周期有多长?session是线程不安全的,所以session的生命周期最长为一个线程;
在web应用里面,一个session的生命周期有多长?一次请求;
在Session对象上面有一个缓存;这个缓存在hibernate里面叫做一级缓存;
一级缓存能够保证:
1,在一个session中拿到的多个相同类型,相同id的对象实例是同一个实例;
2,一级缓存的生命周期?和session相同;在web应用中,一级缓存的生命周期一次请求;
3,一级缓存能够提高一定的性能,但是非常有限;
4,一级缓存提供了对该session加载出来的对象的一个管理的区域;(session加载出来的对象都放在一级缓存里面进行管理)
5,sessionFactory.openSession还代表开启一个全新的一级缓存空间;
6,session.clear方法:清空一级缓存所有对象;
7,session.evict(object)方法:从一级缓存中去掉一个指定的对象;
Hibernate中session的作用如下图:

Transaction对象:对事务的一个封装,事务的提交或者回滚由这个对象管理;
session.getTransaction:得到当前会话上绑定的事务对象;
session.beginTransaction:在标记当前session的事务正常开始了;
transaction.isActive:判断当前事务是否是活动的;
session.isOpen:判断当前session处于打开状态;
@Test
public void testTranscation() throws Exception {
Employee e = new Employee();
e.setName("Alice");
e.setAge(11); Session session = null; try {
session = HibernateUtil.getInstance().openSession();
session.beginTransaction();//开启事务
session.save(e);
session.getTransaction().commit();
} catch (HibernateException he) {
//在Hibernate中所有JDBC相关异常都被封装成HibernateException
he.printStackTrace();
if(session != null && session.getTransaction().isActive()){
session.getTransaction().rollback();
}
} finally {
if(session != null && session.isOpen()){
session.close();
}
}
}
Hibernate单对象的映射细节
1,在一个映射文件中可以写多个实体的映射;但是必须在同一个包内;一般在开发中,还是一个实例对应一个映射文件;
2,table和column属性都是可以省略的,
     1),如果省略table,就会使用类名作为表名;(注意大小写敏感问题)
     2),如果省略column,就会使用属性名称作为列名;
3,id和property的name属性代表的是对象中的属性:
     1),hibernate什么时候用getter;getter方法返回的值就是要存到数据库中的值;
     2),hibernate什么时候用setter;setter方法传入的参数值,就是数据库中的值;
4,hibernate不关心getter和setter方法的可见性;
5,property和id上可以通过access属性来设置访问的方式,默认是property,可以设置为field,代表直接使用字段访问;
6,type属性用于配置java类型到列类型的映射;
7,在属性上面添加Insert=false,那么这个属性永远不会出现在insert语句中;
8,在属性上面添加update=false,那么这个属性永远不会出现在update语句中;
9,在class上面添加dynamic-insert=true,那么在insert的时候,只会insert这个类上不为空的属性;
hibernate表的自动生成:
#hibernate.hbm2ddl.auto create-drop
在hibernate启动的时候,创建表,在hibernate正常关闭的时候删除表;
1,删除那些表?创建那些表:hibernate只会去删除/创建这次让他管理的对象对应的表;
2,如果新加一个domain会怎么处理:重新创建;
3,如果删除一个domain会怎么处理:不管
4,一定要正常关闭SessionFactory(正常的关闭hibernate),
使用:一般不会使用create-drop;
#hibernate.hbm2ddl.auto create
在hibernate启动的时候,创建表;
1,删除那些表?hibernate只会去删除/创建这次让他管理的对象对应的表;
2,如果新加一个domain会怎么处理:重新创建
3,如果删除一个domain会怎么处理:不管
使用:
1,一般我们程序员在做白盒测试的时候,会使用create;(每次测试的主键都是从1 开始)
2,在测试的时候,注意使用@Before标签;
#hibernate.hbm2ddl.auto update
在hibernate启动的时候,去检查并修改表结构;
1,检查并修改那些表?这次让hibernate管理的对象对应的表;
2,如果表已经存在,怎么处理?检查这个表,如果有变化,尝试做适当的修改;
3,如果表不存在,怎么处理:创建表;
4,如果对象的结构有变化,怎么更新
1,添加一个属性:在表里面增加一列;
2,删除一个属性:不管;
3,修改一个属性:尝试去修改这个列的类型;如果修改不成功,hibernate会在启动的时候给一个警告;
使用:
1,一般在黑盒测试的时候使用update;
2,注意,一定不要在生产环境中使用update;
#hibernate.hbm2ddl.auto validate
在hibernate启动的时候,去检查表结构;
如果检查发现表结构不对,怎么处理;hibernate不能正常启动;
在生产环境一般使用validate去检查数据库版本和代码版本是否一致;
#hibernate.hbm2ddl.auto none:就是什么都不管;
Hibernate--Day01的更多相关文章
- Hibernate day01笔记
		框架体系结构 hibernate入门 ORM框架 Hibernate是一个数据持久化层的ORM框架. Object:对象,java对象,此处特指JavaBean Relational:关系,二维表 ... 
- Exception 07 : org.hibernate.LazyInitializationException: could not initialize proxy - no Session
		异常名称: org.hibernate.LazyInitializationException: could not initialize proxy - no Session 异常截图: 异常详情: ... 
- Exception 06 : org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session :
		异常名称: org.hibernate.NonUniqueObjectException: A different object with the same identifier value was ... 
- Exception 03 : org.hibernate.MappingException: Unknown entity: org.hibernate.cfg.Configuration
		异常名称 org.hibernate.MappingException: Unknown entity: org.hibernate.cfg.Configuration 异常详细信息 org.hibe ... 
- hibernate框架入门配置
		1.新建一个项目(可以是java项目,也可以是webapp) 2.导入jar包,包括日志,mysql驱动,必备request包,jpa配置规范包 3.创建实体类 1.创建数据库,使用hibernate ... 
- ssh架构之hibernate(四)二级缓存
		二级缓存使用步骤: 1.拷贝jar包 2.配置Hibernate.cfg.xml文件 a.#开启二级缓存 hibernate.cache.use_second_level_cache=true b.# ... 
- ssh架构之hibernate(二)进阶学习
		1.JPA入门 JPA的认识:JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中Java持久层AP ... 
- ssh架构之hibernate(一)简单使用hibernate完成CRUD
		1.Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,h ... 
- Hibernate 学习(三)
		一.关系映射 实体类之间的关联映射以及表之间的关系是 ORM 的灵魂之处.对象间的关系的子集可以用下列四种方式解释.关联映射可以是单向的也可以是双向的. 映射类型 描述 Many-to-One 使用 ... 
- Hibernate 学习(二)
		一.Hibernate 核心 API 1.Configuration 对象(配置) 配置对象是你在任何 Hibernate 应用程序中创造的第一个 Hibernate 对象,并且经常只在应用程序初始化 ... 
随机推荐
- ue4 材质表达式分类
			绿色节点 颜色 Color Desaturation 数学 Math GO 字体 Font FontSample,FontSampleParameter 实用程序 Utility 常用: Desatu ... 
- 用Navicat连接阿里云ECS服务器上的MySQL数据库
			今天用navtive连接阿里云服务器(Linux)的数据库时,老是连接不上,并且报10060错误,要通过以下两个步骤解决: 1.先进入linux连接数据库并输入密码: mysql -uroot -p ... 
- Centos-6服务器源配置(使用阿里云的源镜像)
			首先在VM中安装从 https://mirrors.aliyun.com/centos/ 中下载好的centos镜像(这里以centos6.9 64 为例). 安装完成后先要进行备份 mv /etc ... 
- Django 反向解析
			#1,定义: #随着功能的增加会出现更多的视图,可能之前配置的正则表达式不够准确,于是就要修改正则表达式,但是正则表达式一旦修改了,之前所有对应的超链接都要修改,真是一件麻烦的事情,而且可能还会漏掉一 ... 
- 34. Find First and Last Position of Element in Sorted Array
			1. 原始题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在 ... 
- perl 之 正则表达式 (简)
			正则表达式,简单介绍: 元字符 匹配项 字符类:单字符与数字 . 匹配除换行符之外的任意字符 [a-z0-9] 匹配集中任意单字符 [^a-z0-9] 匹配不在集合中的任意单字符 \d 匹配单个数 ... 
- 第二周 数据分析之展示 Matplotlib基础绘图函数实例
			Pyplot基础图表函数 Pyplot饼图的绘制: Pyplot直方图的绘制: Pyplot极坐标图的绘制: Pyplot散点图的绘制: 单元小结: import numpy as np import ... 
- python excel的操作
			1.在测试用例中生成的数据报错到已存在的excel里面 1 import xlrd 2 from xlutils.copy import copy 3 class test: 4 def write_ ... 
- LNMP一键包安装后解决MySQL无法远程连接问题
			MySQL/MariaDB无法远程连接,如何开启? 1,没有给root对应的权限 -- @'192.168.1.123'可以替换为@‘%’就可任意ip访问 mysql> GRANT ALL PR ... 
- ASP.NET Core之中间件
			本文翻译自:http://www.tutorialsteacher.com/core/aspnet-core-middleware 基本概念 ASP.NET Core引入了中间件的概念,中间件是在AS ... 
