Hibernate入门2
实体类的编写规则
- 要求实体类的属性是私有的
- 要求实体类中的私有属性有公开的get和set方法(设置器和访问器)
- 要求实体类有一个属性作为唯一值(一般使用id值)
- 实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类(原因:假如使用int表示学生分数,当学生的分数为0的时候,可以使用int score=0,但是如果学生没有参加考试的话,那么如何表示,这样的话,相对于使用int来表示,可能会有点局限性,那么我们可以使用int的包装类型Integer来表示的话,就相对于比较的方便,如学生成绩为0的话,可以用0进行表示,学生没有参加考试的话,可以使用null值进行表示)
Hibernate主键的生成策略
- Hibernate要求实体类里面有一个属性作为唯一值,对应表主键,主键可以有不同的生成策略
- Hibernate主键的生成策略又很多的值,最主要的是(native和uuid)
实体类操作
对实体类的crud(增删改查)操作
添加操作: Session的save()方法
public void add() {
SessionFactory sf = Tools.getSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
/**
* 创建对象
*/
User user = new User();
user.setPassword("123");
user.setUsername("Alleys");
session.save(user);
tx.commit();
/**
* 释放资源
*/
session.close();
sf.close();
}
查询操作(根据id查询):Session的get()方法get方法的第一个参数是实体类的Class对象,第二个参数是id值
public void select() {
SessionFactory sf = Tools.getSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
User user = session.get(User.class, 1);
System.out.println(user);
tx.commit();
/**
* 释放资源
*/
session.close();
sf.close();
}
修改操作:使用Session的update()方法,一般是先查询看是否存在此条记录,然后在修改
public void update() {
SessionFactory factory = Tools.getSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
// 先查询,id为1的记录是否存在,将密码修改为456
User user = session.get(User.class, 1);
if(user==null) {
System.out.println("此记录不存在...");
return;
}
// 更新数据
user.setPassword("456");
session.update(user);
tx.commit();
session.close();
factory.close();
}
删除操作:Session的delete()方法,传参数,就是传递一个对象
public void delete() {
SessionFactory factory = Tools.getSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
// 先查询,id为1的记录是否存在,存在的话删除
User user = session.get(User.class, 1);
if(user==null) {
System.out.println("此记录不存在...");
return;
}
session.delete(user);
tx.commit();
session.close();
factory.close();
}
public void delete2() {
SessionFactory factory = Tools.getSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
// 先查询,id为1的记录是否存在,存在的话删除
User user = new User();
user.setUid(6);
session.delete(user);
tx.commit();
session.close();
factory.close();
}
实体类的对象的三种状态:
瞬时态:对象里面没有id值,对象与session没有关联

持久态:对象中有id值,对象与session有关联
对象通过session查出来,与session有关,且user中有id值
托管态:对象中有id值,但是对象和session没有关联

saveOrUpdate()方法,此方法即能进行保存也能进行更新操作。
对于这个方法而言,如果实体类的对象是瞬时态的时候,做的是添加的操作
public void show_saveOrUpdate_method() {
/**
* 瞬时态
*/
SessionFactory factory = Tools.getSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
// 先查询,id为1的记录是否存在,存在的话删除
User user = new User();
user.setPassword("123456789");
user.setUsername("Lily");
session.saveOrUpdate(user);
tx.commit();
session.close();
factory.close();
}
如果实体类的对象是持久态或者托管态的话,做的是更新操作
public void show_saveOrUpdate_method() {
/**
* 瞬时态
*/
SessionFactory factory = Tools.getSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
User user = session.get(User.class, 7);
user.setPassword("5446546");
session.saveOrUpdate(user);
tx.commit();
session.close();
factory.close();
}
public void show_saveOrUpdate_method() {
/**
* 瞬时态
*/
SessionFactory factory = Tools.getSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
/*// 先查询,id为1的记录是否存在,存在的话删除
User user = new User();
user.setPassword("123456789");
user.setUsername("Lily");
session.saveOrUpdate(user);
tx.commit();*/
/*User user = session.get(User.class, 7);
user.setPassword("5446546");
session.saveOrUpdate(user);*/
User user = new User();
user.setUid(7);
user.setPassword("8888888");
session.saveOrUpdate(user);
tx.commit();
session.close();
factory.close();
}
Hibernate的一级缓存
什么是缓存?
数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
- 把数据存到内存中,就不需要使用流的方式,可以直接读取内存中数据
- 把数据放到内存中,提高读取效率
而在Hibernate中为我们提供了很多的优化的方式,其中一个就是Hibernate缓存
Hibernate的缓存的特点:
(1) hibernate的一级缓存
- hibernate的一级缓存默认是开启的
- hibernate的一级缓存使用范围,是session范围,从session的创建到session的关闭为止
- hibernate的一级缓存中,要求实体类对象的保存数据的状态必须是持久态数据
(2) hibernate的二级缓存
- hibernate的二级缓存目前已经不使用了,替代技术redis
- hibernate的二级缓存默认是不用打开的,需要进行配置
- hibernate的二级缓存的使用范围,就是sessionFactory的范围,也就是整个项目的范围
一级缓存会自动更新数据库,在没有调用update方法的时候
public void testCache() {
SessionFactory factory = Tools.getSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
User user = session.get(User.class, 7);
user.setPassword("5446546");
tx.commit();
session.close();
factory.close();
}
Hibernate的事务操作
什么是事务?
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。
事务的特性
原子性(Atomicity):
事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。
一致性(Consistemcy):
事务前后,数据库的状态都满足所有的完整性约束。
隔离性(Isolation):
并发执行的事务是隔离的,一个不影响一个。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。通过设置数据库的隔离级别,可以达到不同的隔离效果。
持久性(Durability):
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
不考虑隔离性产生的问题
脏读
不可重复读
虚读或者幻读
设置事务的隔离级别
Mysql的默认隔离级别为repeatable read
事务代码的标准写法:
public void testTx() {
// 事务代码的规范写法
Transaction tx = null;
SessionFactory factory = null;
Session session = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
tx = session.beginTransaction();
User user = session.get(User.class, 7);
user.setPassword("5446546");
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
factory.close();
}
}
Hibernate绑定Session:
在进行事务的处理的时候,要保证事务的正确的执行,那么我们需要保证进行事务处理的数据库连接对象是同一个链接对象。在以前可以使用Java提供的ThredLocal本地线程进行绑定,保证在事务处理的时候,使用的是同一个Connection对象。而在Hibernate中我们进行事务的处理,也必须要保证session对象是同一个Session。但是在Hibernate中我们不需要自己进行实现了,因为Hibernate已经帮我们全部封装好了,但是Hibernate使用的底层原理,也是用的ThreadLocal。
要在Hibernate中进行事务处理,那么就要使Session绑定本地线程,要绑定Session的话,那么我们就需要在Hibernate的核心配置文件中进行配置处理,然后在调用SessionFactory中的方法得到:
核心配置文件的配置:
<!-- 配置数据库的事务处理绑定到本地线程 -->
<property name="hibernate.current_session_context_class">thread</property>
调用Session方法进行使用:(要得到本地线程,那么必须先配置核心文件,否则得不到)
factory.getCurrentSession();
Hibernate的其他API
Query类查询所有记录:
使用Query类进行查询操作,我们需要些sql语句,但是需要些hql语句。
Hql:hibernate query language,hibernate提供的查询语句,这个hql语句和sql语句很相似
Hql和sql的区别:
使用sql操作的是表和表的字段
使用hql操作的是实体类和属性
Hql语句规范:form 实体类名称
使用Query查询的步骤:
先创建Query对象
通过Query类的对象调用Query类中的方法进行操作
代码:
public void testQueryClass() {
Transaction tx = null;
SessionFactory factory = null;
Session session = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
tx = session.beginTransaction();
/**
* 第一步:创建Query对象
*/
Query query = session.createQuery("from User");
List<User> users = query.list();
System.out.println(users);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
factory.close();
}
}
Criteria类查询所有记录:
使用Criteria类进行查询操作,不需要写查询语句,直接调用方法实现即可
使用步骤:
创建Criteria对象
调用对象里面的方法得到结果集
代码:
public void testCriteriaClass() {
Transaction tx = null;
SessionFactory factory = null;
Session session = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
tx = session.beginTransaction();
/**
* 第一步:创建Criteria对象
*/
Criteria criteria = session.createCriteria(User.class);
/**
* 查询
*/
List<User> users = criteria.list();
System.out.println(users);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
factory.close();
}
}
SQLQuery类查询所有记录:
使用SQLQuery时候,调用底层的sql实现
实现步骤:
创建对象
调用对象的方法
代码:
public void testQueryClass() {
Transaction tx = null;
SessionFactory factory = null;
Session session = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
tx = session.beginTransaction();
/**
* 第一步:创建Query对象
*/
Query query = session.createQuery("from User");
List<User> users = query.list();
System.out.println(users);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
factory.close();
}
}
Hibernate入门2的更多相关文章
- 三大框架之hibernate入门
hibernate入门 1.orm hibernate是一个经典的开源的orm[数据访问中间件]框架 ORM( Object Relation Mapping)对象关 ...
- Hibernate入门案例及增删改查
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...
- Hibernate入门案例 增删改
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...
- Hibernate入门6.Hibernate检索方式
Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...
- Hibernate入门5持久化对象关系和批量处理技术
Hibernate入门5持久化对象关系和批量处理技术 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hiberna ...
- Hibernate入门4.核心技能
Hibernate入门4.核心技能 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hibernate3的基本知识, ...
- Hibernate入门3.配置映射文件深入
Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...
- 简单的Hibernate入门简介
其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西, ...
- Hibernate入门(1)-第一个Hibernate程序
Hibernate入门(1)-第一个Hibernate程序 Hibernate是最著名的ORM工具之一,本系列文章主要学习Hibernate的用法,不涉及Hibernate的原理.本文介绍第一个Hib ...
- hibernate入门之person表
下面的hibernate入门person表指的是:根据mysql数据库中的test表和其中的元素-->建立映射表==>进而创建持久化类的顺序来操作了,下面为步骤 1.配置MySQL驱动程序 ...
随机推荐
- 关于html5 video
获取视频长度 <video id="video" width="200px" height="auto" src="vide ...
- controller函数中参数列表使用多个@RequestBody
首先出现这种情况是因为有下面这种需求 $.ajax({ type: "POST", url: "${pageContext.request.contextPath}/co ...
- VISTA Enhancer Browser
微信公众号:生物信息学起步如果觉得对你有帮助,欢迎关注/转发/分享[1] 内容目录 1.目的2.实验数据2.1 候选增强子识别2.2 转基因小鼠分析2.3 注释3.搜索数据库3.1 概括3.2 高级搜 ...
- 自己实现一个Redux
Redux是一个可预测的状态容器,提供可预测的状态管理. 什么是状态?状态其实也就是数据,管理状态也就是对数据的管理.那么什么是可预测的状态管理呢?能够监听数据的变化,获取变化的来源,在发生变化时可以 ...
- 快速禁止Chrome浏览器缓存
在前端的开发中,最麻烦的莫过于浏览器的缓存,经常需要清理缓存文件,导致开发效率较低. 但Chrome可以一键禁止浏览器缓存,并且在后续的操作中,无论相同的资源请求多少次,都不会缓存到本地,一起来体验下 ...
- pg_controldata - 显示一个 PostgreSQL 集群的控制信息
SYNOPSIS pg_controldata [ datadir] DESCRIPTION 描述 pg_controldata 打印那些在 initdb 过程中初始化的信息,比如表版本和服务器的区域 ...
- CentOS7 设置电源选项,待机、睡眠、挂起
设置装有 CentOS7 的笔记本合盖后黑屏进入睡眠模式 systemd 能够处理某些电源相关的 ACPI事件,你可以通过从 /etc/systemd/logind.conf 以下选项进行配置: Ha ...
- Linux性能优化从入门到实战:03 CPU篇:CPU上下文切换
linux操作系统是将CPU轮流分配给任务,分时执行的.而每次执行任务时,CPU需要知道CPU寄存器(CPU内置的内存)和程序计数器PC(CPU正在执行指令和下一条指令的位置)值,这些值是CPU执 ...
- Linux下NFS服务器的搭建与配置(转)
一.NFS服务简介 NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的. 它最大的功能就是可以透过网络,让不同的机器.不同的操作系统.可以彼此分享个别 ...
- VPS Linux修改root密码
hosteons VPS 没有提供在网页控制面板里修改root密码的选项,但是可以通过Rescue模式吃查看root密码以及 有重置root密码为随机值的选项. 在重置root密码为随机值后,进入系统 ...