1.什么是Hibernate框架?

Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象

2.ORM概述

在介绍Hibernate的时候,说了Hibernate是一种ORM的框架。那什么是ORM呢?ORM是一种思想

  • O代表的是Objcet
  • R代表的是Relative
  • M代表的是Mapping

ORM->对象关系映射....ORM关注是对象与数据库中的列的关系

3.编写对象和对象映射

customer对象

@Data
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;
}

customrt对象映射文件Customer.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="com.work.entity.Customer" table="cst_customer">
<id name="cust_id" type="java.lang.Long">
<column name="cust_id" length="20"></column>
<generator class="native"></generator>
</id>
<!-- 建立类中的普通-的属性和表的字段的对应 -->
<property name="cust_name" type="java.lang.String">
<column name="cust_name" length="32"></column>
</property> <property name="cust_source" type="java.lang.String">
<column name="cust_source" length="32"></column>
</property> <property name="cust_industry" type="java.lang.String">
<column name="cust_industry" length="255"></column>
</property> <property name="cust_level" type="java.lang.String">
<column name="cust_level" length="255"></column>
</property> <property name="cust_phone" type="java.lang.String">
<column name="cust_phone" length="255"></column>
</property> <property name="cust_mobile" type="java.lang.String">
<column name="cust_mobile" length="255"></column>
</property>
</class>
</hibernate-mapping>

4. 主键的生成策略

1.increment :hibernate提供自动增长机制,适用于short、int、long类型的主键。在单线程中使用他会发送一条sql语句 select max(id) from 然后id+1为下一个主键的值
2.identity :适用于short、int、long类型的主键。适用于mysql
3.sequence :适用于short、int、long类型的主键。适用于orcal
4.uuid :适用于字符串主键。使用hibernate中的随机方式生成字符串主键
5.native :本地策略 自动切换identity和sequence
6.assigned :hibernate放弃外键的管理,程序员需要自己手动编写主键
7.foreign : 外部的一对一关联映射
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>
<!-- 连接数据库的基本参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///ssh?serverTimeZone=UTC</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">12345</property>
<!-- 配置Hibernate的方言 可以使用mysql语句-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 可选配置================ -->
<!-- 打印SQL -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL -->
<property name="hibernate.format_sql">true</property>
<!-- 自动创建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--设置事务的隔离级别-->
<property name="hibernate.connection.isolation">4</property>
<!--配置当前线程绑定的session-->
<property name="hibernate.current_session_context_class">thread</property> <mapping resource="com/work/entity/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>

5.使用hibernateUtils完成CURD

public class HibernateTest2 {

    @Test
public void save() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction(); Customer customer = new Customer();
customer.setCust_name("hdh");
//返回保存记录的id
Serializable id = session.save(customer);
System.out.println(id); transaction.commit();
session.close();
} @Test
/**
* get和load的区别
* load事延迟加载在使用的是时候才会发送sql语句 ;查询一个找不到的对象时抛异常
* get是立即加载;查询一个找不到的对象时返回null
*/
public void select() { Session session = HibernateUtils.openSession();
//get方法查询
Customer customer = session.get(Customer.class, 1L);
System.out.println(customer); //load方法查询
Customer load = session.load(customer.getClass(), 1L);
// System.out.println(load); session.close();
} @Test
public void update() { Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction(); //创建对象在修改
Customer customer = new Customer();
customer.setCust_id(1L);
customer.setCust_name("xj");
session.update(customer); //查询后在修改
Customer customer1 = session.get(Customer.class, 2L);
customer1.setCust_name("xj");
session.update(customer1); transaction.commit();
session.close();
} @Test
public void delete() { Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction(); //创建对象在修改
Customer customer = new Customer();
customer.setCust_id(3L);
session.delete(customer); //查询后在修改(可以级联删除 使用这个)
Customer customer1 = session.get(Customer.class, 4L);
session.delete(customer1);
transaction.commit();
session.close();
} @Test
public void saveOrupdate() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//saveorupdate 保存或更新操作 取决于是否有主键(id) Customer customer = session.get(Customer.class, 1L);
customer.setCust_level("vip");
session.saveOrUpdate(customer); transaction.commit();
session.close();
} }
hibernateUtils.java
**
* Hibernate的工具类
*
*/
public class HibernateUtils { //configuation:配置对象 加载核心配置 加载映射文件
public static final Configuration cfg;
//sessionFactory:内部维护连接池和二级缓存,线程安全的
public static final SessionFactory sf; static{
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
}
//session内部维护了一级缓存,是连接对象 线程不安全的
public static Session openSession(){
return sf.openSession();
} public static Session getCurrentSession(){
return sf.getCurrentSession();
}
}

6.hibernate的持久化的三种状态之间的切换

瞬时状态对象:没有唯一标识的id,没有被session管理
持久化状态对象:有唯一标识的id,被session管理
游离状态对象:有唯一标识的id,没有被session管理 
public class HibernateTest3 {
@Test
public void demo1() { Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction(); Customer customer = new Customer(); //瞬时状态对象:没有唯一标识的id,没有被session管理
customer.setCust_name("hdh"); //持久化状态对象:有唯一标识的id,被session管理
//返回保存记录的id
Serializable id = session.save(customer);
System.out.println(id);
transaction.commit();
session.close(); System.out.println(customer.getCust_id()); //游离状态对象:有唯一标识的id,没有被session管理
} /**
* 三种状态之间的转换
* 瞬时状态
* 获得瞬时状态:Customer customer =new Costomer()
* 状态转换:瞬时->持久
* save(Object obj ) saveOrUpdate(Object obj)
* 瞬时->游离
* customer.setCust_id(1L)
*
* 持久化状态
* 获得持久化状态:get() load() find() iterate()
* session.get(Customer.class,1L)
* 状态转换:持久->瞬时
* delete()
* 持久->游离
* sesssion.close(),clear(),evict(Object obj)
*
* 游离化状态
* 获得持久化状态:Customer customer = new Customer();
* 状态转换:游离->瞬时
* customer.setCust_id(null)
* 游离->持久
* update() saveOrUpdate()
*/ }

7.hibernatenate的一级缓存和一级缓存的快照

hibernate持久化状态的数据会自动持久化到数据库

1、通过session查询出的customer对象为持久态对象,同时该持久态对象会放到session一级缓存和快照区(副本)中
2、当修改了customer也即持久态对象中属性的值,一级缓存中的内容也会随着修改,但一级缓存对应的快照区内容不会修改,
3、最后提交事务时,比较它们的内容,如果不相同,把一级缓存内容更新到数据库,如果相同,不会更新到数据库。

hibernate的一级缓存:称为Session级别的缓存,一级缓存的生命周期与Session一致,且一级缓存是hibernate自带的不可卸载的
/**
* hibernate的一级缓存:称为Session级别的缓存,一级缓存的生命周期与Session一致,且一级缓存是hibernate自带的不可卸载的
*
*/
public class HibernateTest4 { @Test
public void test() { Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction(); //只会发送一次查询语句
Customer customer1 = session.get(Customer.class, 1L);
System.out.println(customer1);
Customer customer2 = session.get(Customer.class, 1L);
System.out.println(customer2); transaction.commit();
session.close();
} @Test
/**
* 持久化状态的数据会自动更新
* 利用了一级缓存的快照区
* 当事务提交的时候,hibernate会比较缓存区和快照区如果不一致会更新缓存,发送update语句
*/
public void test1() { Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction(); Customer customer1 = session.get(Customer.class, 1L);
customer1.setCust_name("lq"); transaction.commit();
session.close();
} }

8.hibernate主配置文件中指定session与当前线程绑定

**
* 测试当前线程绑定的Session,需要在配置文件种开启CurrentSession
* <!--配置当前线程绑定的session-->
* <property name="hibernate.current_session_context_class">thread</property>
*/
public class HibernateTest5 { @Test
public void test() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction(); Customer customer = new Customer();
customer.setCust_id(1L);
customer.setCust_name("lq");
session.save(customer);
//不需要关闭session
transaction.commit(); } }

9.事务

  原子性(Atomicity)操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。

  一致性(Consistency)事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。

  隔离性(Isolation)隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

  持久性(Durability)当事务正确完成后,它对于数据的改变是永久性的。

如果不考虑隔离性,引发安全性问题

读问题:

脏读一个事务读到另一个事务未提交的数据,不可重复读一个事务读到另一个事务已经提交的 update数据,导致在一个事务多次查询结果不一致。

虚读一个事务读到另一个事务已经提交的 insert数据,导致在前一个事务多次查询结果不一致,·

不可重复读:一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该数据,两次结果相异,不可被信任。

设置事务的隔离级别:

1>Read uncommitted:以上读问题都会发生

2>Read committed:解决脏读,但是不可重复读和虚读有可能发生

3>Repeatable read解决脏读和不可重复读,但是虛读有可能发生

4>Serializable解决所有读问题

												

hibernate_02_hibernate的入门的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  3. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  4. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  5. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  6. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  7. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  8. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  9. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

随机推荐

  1. GIT 部分记录

    关于版本回退 git reset HEAD^  #回退a.py这个文件的版本到上一个版本  git reset HEAD^ a.py  git reset HEAD a.py  我试了一下以上2种方式 ...

  2. Stack&Heap的理解

    Heap(堆):在英文中有杂乱的堆意思,意译中文为堆:其特点为先进先出. 堆空间分配:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表. Stack(栈):在英 ...

  3. Android android studio常用的一些快捷键以及常用权限

    android studio的常用快捷键:一.打印log:1.输入logt回车:  自动生成TAG的全局变量:private static final String TAG = "MainA ...

  4. composer(作曲家)安装php-ml

    刚开始我用的是up5.6版本php命令安装composer 后来使用composer时发现命令行会提示php版本太低 于是我下载了wamp,使用7.1版本的php重新安装了composer,因为php ...

  5. linux环境下创建domain

    首先进入weblogic的安装目录,具体如下: cd /wls/Oracle/Middleware/Oracle_Home/wlserver/common/bin 图形化创建 1.下载xmanager ...

  6. CentOS 启动提示unexpected inconsistency;RUN fsck MANUALLY, ntfs的input/output Error,InPageError c000009c使用chkdsk修复磁盘,12款Linux系统恢复工具

    CentOS这两天服务器出了问题了,提示如下: unexpected inconsistency;RUN fsck MANUALLY An error occurred during the file ...

  7. sqlalchemy session

    Cookie cookie是浏览器保存在用户电脑上的一小段文本,用来保存用户在网站上的必要的信息.Web页面或服务器告诉浏览器按照一定的规范存储这些信息,并且在以后的所有请求中,这些信息就会自动加在h ...

  8. WinDbg解决BHO不加载

    昨天zhengwei同学说他机器上的一个BHO不能正常加载,我把BHO的代码拿过来,在我的两台机器上都验证了一下,一台是Win7+IE8的环境,一台是XP+IE7的环境,都能正常加载.zhengwei ...

  9. getmapping等无法解析

    版本要改一下,4.1.6没有<dependency> <groupId>org.springframework</groupId> <artifactId&g ...

  10. JavaScript笔记 - Object对象特性的应用

    可以依据js对象中key是永远不会重复的原则,来模拟Map类型以及去除数组重复项. 1.模拟Map类型 (1)构造Map对象 function Map(){ //private var obj = { ...