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();
Transaction tx = session.getTransaction(); tx.begin(); News news = (News) session.get(News.class, 2); news.setTitle("杀出重围"); session.update(news);
tx.commit(); 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进行查询 }
|