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驱动程序 ...
随机推荐
- EF添加关联的提示问题:映射从第 260 行开始的片段时有问题:
一,EF添加关联的提示问题 严重性 代码 说明 项目 文件 行 禁止显示状态错误 错误 3004: 映射从第 260 行开始的片段时有问题:没有为 设置 T_xx_xxRelation 中的属性 T_ ...
- javascript中的对象字面量为啥这么酷
原文链接 : Why object literals in JavaScript are cool 原文作者 : Dmitri Pavlutin 译者 : neal1991 个人主页:http://n ...
- Solr的学习使用之(六)获取数据列表-SolrDocumentList
以下是我项目中获取新闻数据列表的写法,包括数据总量.数据列表,接下来会贴出分片查询(facet)等高级查询 基本的注释都有了: private ListPage<News> queryFr ...
- Simple Live System Using Nginx
1. Install nginx #Preinstalled directory install=/usr/local/nginx #Delete installed directory rm -rf ...
- tmux 操作简版
操作session: 操作window: 操作pane: 原文
- selenium鼠标悬停失效,用js语句模拟
写脚本时,有很多case需要要用的鼠标悬停出菜单 用到了ActionChains(self.driver).move_to_element(el).perform(),但是脚本写完以后,单个case执 ...
- 记录一次 Linux crontab 执行django 脚本 失败 的经历和解决办法
目的是想通过定时任务来执行一次数据统计,本来可以用celery来做,但是想着这个项目整个就没用到异步的地方,所以决定用crontab来做.之前做过数据库的热备份,想来用该没啥问题,但是现实打脸啪啪响. ...
- man(2) W
wait(2) wait3(2) wait4(2) waitpid(2) waitid(2) SEE ALSO _exit(2), clone(2), fork(2), kill(2), ptrace ...
- Vue 学习之 vue-router2
---恢复内容开始--- 一.路由的安装: npm安装 npm install vue-router --save 执行命令完成vue-router的安装,并在package.json中添加了vue- ...
- 学习旧岛小程序 (1) flex 布局
css : view 相当于 div 块级元素 display 默认设置 block display:inline 设置后 设置宽度高度是无效的 要设置宽度高度 又要设置为行内元素 我们设置: (1) ...