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. HttpURLConnection模拟登录学校的正方教务系统

    教务系统登录界面 如图1-1 1-1 F12-->network查看登录教务系统需要参数: __VIEWSTAT txtUserName TextBox2 txtSecretCode Radio ...

  2. 在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr。

    在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr. $("#checkAll").prop("checked", true ...

  3. C/C++ warning C4251: class ... 需要有 dll 接口由 class“..” 的客户端使用

    { 在DLL编程中, 如果调用模版类, 则可能出现类似以下的错误: 1>xclock.h(29): warning C4251: “XClock::m_FileName”: class“std: ...

  4. MySQL主从复制&读写分离&分库分表

    MySQL主从复制 MySQL的主从复制只能保证主机对外提供服务,从机是不提供服务的,只是在后台为主机进行备份数据 首先我们说说主从复制的原理,这个是必须要理解的玩意儿: 理解: MySQL之间的数据 ...

  5. js条件语句,用if...else if....else方程ax2+bx+c=0一元二次方程。求根

    if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if...else if... ...

  6. ST表 (模板) 洛谷3865

    题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) O(1) 题目描述 给定一个长度为 N N 的数列,和 M M ...

  7. Linux命令(1):date

    查看时间: date "+%Y-%m-%d %H:%M:%S" 参数说明: %n : 下一行 %t : 跳格 %H : 小时(00..23) %I : 小时(01..12) %k ...

  8. Core Data could not fulfill a fault

    做项目的时候在iOS4系统遇到过这样一个crash,console显示的错误信息是"Core Data could not fulfill a fault". 字面意思是什么?&q ...

  9. Python中的动态类

    Python中的动态类 有这样一个需求,我有SegmentReader.PostagReader.ConllReader这三个Reader,他们都继承于一个Reader类.在程序运行中,由用户通过se ...

  10. kafka集群配置总结

    虽然很简单,但会遇到很多奇怪的坑,而且网上解决方法搜不到. 首先下载kafka包,解压缩后,修改conf/server.properties文件,基本配置项如下(省略了部分默认配置项 : broker ...