hibernate_02_hibernate的入门
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的入门的更多相关文章
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Oracle分析函数入门
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
- wepack+sass+vue 入门教程(一)
一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...
随机推荐
- Vue之自建管理后台(二)Vue端设计
我们先设计Vue的文件夹分布. 在此之前,我们先了解下初始化创建的Vue的文件夹 https://www.cnblogs.com/luoxuemei/p/9812151.html (我引用了这哥们写的 ...
- java ThreadPoolExecutor 异常捕获
一,创建一个线程池 其中: public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) 饱和策略执行时的具体逻辑. p ...
- Vue for循环 例子
demo <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf- ...
- shell脚本中:单引号和双引号的区别
单引号和双引号的区别 前面我们还留下一个疑问,定义变量时,变量的值可以由单引号' '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明: #!/bin ...
- net core静态文件 访问除默认目录文件配置
在我们项目的实际应用中,不光是需要访问默认静态文件夹 wwwroot ,还有可能要要去访问除默认目录以外的文件夹,接下来我们进行配置 1.在根目录创建一个文件夹,继续创建它的子文件夹Images,在I ...
- C中空指针、NULL与0
空指针是指确保可以没有指向任何一个对象的指针.空指针常量值通常使用宏定义NULL来表示. 空指针和任何非空指针比较都不相等,因此经常作为函数异常时的返回值使用. 链表也经常在数据末尾放一个空指针提示后 ...
- 8-26接口压力测试-3Jmeter-Java请求
1.新建maven工程 2.导入依赖,并使用shade将所需的依赖打入jar包 <?xml version="1.0" encoding="UTF-8"? ...
- delphi xe10 网络文件传送
//网络传送文件(类似Server/Client) TTetheringManager|设备管理.TTetheringAppProfile|文件发送 待补充
- Java——Eclipse使用
从这开始使用IDE啦~ ①File → New → Java Project →填写工程名字,选择jdk版本,其他默认,单击finish. ②在Src(源文件)上鼠标右键 → new → packag ...
- CSS案例2(一个简单的新闻网页)
知识点: 1.一般网页不用纯黑,用淡灰色 3c3c3c 2.text-align: center; /* 文字水平居中 */ 3.font-weight: normal; /* 清除加粗效果 ...