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的更多相关文章

  1. Hibernate day01笔记

    框架体系结构   hibernate入门 ORM框架 Hibernate是一个数据持久化层的ORM框架. Object:对象,java对象,此处特指JavaBean Relational:关系,二维表 ...

  2. Exception 07 : org.hibernate.LazyInitializationException: could not initialize proxy - no Session

    异常名称: org.hibernate.LazyInitializationException: could not initialize proxy - no Session 异常截图: 异常详情: ...

  3. 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 ...

  4. Exception 03 : org.hibernate.MappingException: Unknown entity: org.hibernate.cfg.Configuration

    异常名称 org.hibernate.MappingException: Unknown entity: org.hibernate.cfg.Configuration 异常详细信息 org.hibe ...

  5. hibernate框架入门配置

    1.新建一个项目(可以是java项目,也可以是webapp) 2.导入jar包,包括日志,mysql驱动,必备request包,jpa配置规范包 3.创建实体类 1.创建数据库,使用hibernate ...

  6. ssh架构之hibernate(四)二级缓存

    二级缓存使用步骤: 1.拷贝jar包 2.配置Hibernate.cfg.xml文件 a.#开启二级缓存 hibernate.cache.use_second_level_cache=true b.# ...

  7. ssh架构之hibernate(二)进阶学习

    1.JPA入门 JPA的认识:JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中Java持久层AP ...

  8. ssh架构之hibernate(一)简单使用hibernate完成CRUD

    1.Hibernate简介   Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,h ...

  9. Hibernate 学习(三)

    一.关系映射 实体类之间的关联映射以及表之间的关系是 ORM 的灵魂之处.对象间的关系的子集可以用下列四种方式解释.关联映射可以是单向的也可以是双向的.  映射类型 描述 Many-to-One 使用 ...

  10. Hibernate 学习(二)

    一.Hibernate 核心 API 1.Configuration 对象(配置) 配置对象是你在任何 Hibernate 应用程序中创造的第一个 Hibernate 对象,并且经常只在应用程序初始化 ...

随机推荐

  1. ue4 材质表达式分类

    绿色节点 颜色 Color Desaturation 数学 Math GO 字体 Font FontSample,FontSampleParameter 实用程序 Utility 常用: Desatu ...

  2. 用Navicat连接阿里云ECS服务器上的MySQL数据库

    今天用navtive连接阿里云服务器(Linux)的数据库时,老是连接不上,并且报10060错误,要通过以下两个步骤解决: 1.先进入linux连接数据库并输入密码: mysql -uroot -p ...

  3. Centos-6服务器源配置(使用阿里云的源镜像)

    首先在VM中安装从 https://mirrors.aliyun.com/centos/ 中下载好的centos镜像(这里以centos6.9 64 为例). 安装完成后先要进行备份  mv /etc ...

  4. Django 反向解析

    #1,定义: #随着功能的增加会出现更多的视图,可能之前配置的正则表达式不够准确,于是就要修改正则表达式,但是正则表达式一旦修改了,之前所有对应的超链接都要修改,真是一件麻烦的事情,而且可能还会漏掉一 ...

  5. 34. Find First and Last Position of Element in Sorted Array

    1. 原始题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在 ...

  6. perl 之 正则表达式 (简)

    正则表达式,简单介绍: 元字符 匹配项 字符类:单字符与数字   . 匹配除换行符之外的任意字符 [a-z0-9] 匹配集中任意单字符 [^a-z0-9] 匹配不在集合中的任意单字符 \d 匹配单个数 ...

  7. 第二周 数据分析之展示 Matplotlib基础绘图函数实例

    Pyplot基础图表函数 Pyplot饼图的绘制: Pyplot直方图的绘制: Pyplot极坐标图的绘制: Pyplot散点图的绘制: 单元小结: import numpy as np import ...

  8. python excel的操作

    1.在测试用例中生成的数据报错到已存在的excel里面 1 import xlrd 2 from xlutils.copy import copy 3 class test: 4 def write_ ...

  9. LNMP一键包安装后解决MySQL无法远程连接问题

    MySQL/MariaDB无法远程连接,如何开启? 1,没有给root对应的权限 -- @'192.168.1.123'可以替换为@‘%’就可任意ip访问 mysql> GRANT ALL PR ...

  10. ASP.NET Core之中间件

    本文翻译自:http://www.tutorialsteacher.com/core/aspnet-core-middleware 基本概念 ASP.NET Core引入了中间件的概念,中间件是在AS ...