Hibernate

Created at 2019-03-24 Updated at 2019-03-24

Hibernate 介绍

完成数据持久的框架Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。它不仅提供了从Java类到数据表之间的映射,也提供了数据查询和恢复机制。相对于使用 JDBC 和 SQL来手工操作数据库,Hibernate可以大大减少操作数据库的工作量。另外,Hibernate可以利用代理模式来简化载入类的过程,这将大大减少利用 Hibernate从数据库提取数据的代码的编写量,从而节约开发时间和开发成本 Hibernat可以和多种Web 服务器或者应用服务器良好集成,如今已经支持几乎所有的流行的数据库服务器。

Orm 称对象关系映射

ORM(Object RelationalMapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式(注解方式),并且存放在专门的对象一映射文件中。

JPA

JPA概述

JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM规范,将得到所有Java EE服务器的支持。

Sun这次吸取了之前EJB规范惨痛失败的经历,在充分吸收现有ORM框架的基础上,得到了一个易于使用、伸缩性强的ORM规范。

从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,JPA作为ORM领域标准化整合者的目标应该不难实现。

JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

Sun引入新的JPA ORM规范出于两个原因:

其一,简化现有JavaEE和JavaSE应用的对象持久化的开发工作;

其二,Sun希望整合对ORM技术,实现天下归一。

openSession和getCurrentSession区别:

openSession:当调用SessionFactory的openSession方法时,它总是创建一个完全全新的session给你。你需要显示的刷新并且关闭session对象。

因为session对象不是线程安全的,在多线程环境中你
需要为每一个请求创建一个session对象(例如web应用的每一个请求)。

getCurrentSession: 当调用SessionFactory的getCurrentSession方法时,它会返回Hibernate上下文中的Session,并且有hibernate管理。它绑定到事物范围。

当调用SessionFactory的getCurrentSession方法时,如果不存在他会创建一个新的Session对象,如果在当前的hibernate上下文中存在,则返回同样的Session对象。

它会自动地flush和close,当事物结束的时候,所以无需多余处理。如果你在单线程环境下使用hibernate,你应该用getCurrentSession,它的性能比较好。

使用getCurrentSession时需要添加配置:

1
2
3
<property name="hibernate.current_session_context_class"> 
thread
</property>

通过session的api提供的增删改查相关操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public static void main(String[] args) {
//读取加载配置文件 获取核心配置信息
Configuration cfg = new Configuration().configure();
//创建一个链接工厂
SessionFactory sf = cfg.buildSessionFactory();
//获取链接
Session session = sf.openSession();
//增删改查 通过session的api提供
//查询一条数据
/*News news = (News) session.get(News.class, 1);
System.out.println(news.getTitle());
session.close();*/

//获取事务
Transaction tx = session.getTransaction();
//事务开启
tx.begin();

//先获取持久化对象
News news = (News) session.get(News.class, 2);
//delete数据
//session.delete(news);

news.setTitle("杀出重围");
//修改
session.update(news);


/*//创建news对象
News news = new News("qqq", new Timestamp(new Date().getTime()));
//保存到数据库
session.save(news);*/
//手动提交事务
tx.commit();
//关闭session 一定要关
session.close();
}

HQL语句

HQL语句的增删改查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public static void main(String[] args) throws ParseException {
// TODO Auto-generated method stub
Session session = HibernateSessionFactory.getSession();
HibernateSessionFactory.getSession().getTransaction().begin();
//session.getTransaction().begin();
//查询一条数据
//News news = (News) session.get(News.class, 1);
//session.getTransaction().commit();
//查询全部 hql语句
//String hql = "from News";//->select n from News n;
//hql语句:名称:from News n where n.id=:id; from News n where n.id=?;
//String hql = "from News n where n.id=:id";
/*Query query = session.createQuery(hql);
query.setInteger("id", 1);
List<News> ls = query.list();
for (News news2 : ls) {
System.out.println(news2.getTitle());
}*/
//System.out.println(news.getTitle());
//修改
/*String title = "update";
String hql = "update News n set n.title=:title where n.id=:id";
Query query = session.createQuery(hql);
query.setString("title", title);
query.setInteger("id", 1);
query.executeUpdate();
HibernateSessionFactory.getSession().getTransaction().commit();;
HibernateSessionFactory.closeSession();*/
//删除
String hql = "delete News n where n.id=:id";
Query query = session.createQuery(hql);
query.setInteger("id", 1);
query.executeUpdate();
HibernateSessionFactory.getSession().getTransaction().commit();;
HibernateSessionFactory.closeSession();


/*Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("");
new Timestamp(sdf.parse("2019-02-20 09:22:22").getTime());*/
//时间查询 大于等于 还需要将时间转换为long进行查询
}
Site by zl using Hexo & Random

Hide