hibernate.docx
《hibernate.docx》由会员分享,可在线阅读,更多相关《hibernate.docx(31页珍藏版)》请在冰豆网上搜索。
hibernate
1什么是Hibernate
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate可以应用在任何使用JDBC的场合
,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任
2Hibernate的核心类和接口:
<1>Configuration
负责管理Hibernate的配置信息,这些配置信息都是从配置文件hibernate.cfg.xml或者
Hibernate.properties读取的,当然也可以自定义文件名称,只要在实例化Configuration
的时候指定具体的路径就可以了
<2>SessionFactory
Configuration的实例会根据当前的配置信息,构造SessionFactory实例。
SessionFactory是线程安全的,一般情况下一个应用中一个数据库共享一个SessionFactory实例。
<3>Session
一般的持久化方法(CRUD)都是通过Session来调用的,Session是非线程安全的
<4>Transaction
事务管理
<5>Query
查询的接口
3Hibernate的原理及步骤
1.读取并解析配置文件
//采用默认的hibernate.cfg.xml来启动一个Configuration的实例
例:
Configurationconfiguration=newConfiguration().configure();
//如要修改默认配置文件名当然你可以选择不修改
Configurationconfiguration=newConfiguration().configure(newFile("src/xxx.xml"));
2.读取并解析映射信息,创建SessionFactory
例:
SessionFactory sessionFactory=configuration.buildSessionFactory();
3.打开Session实例(它是线程不安全的,是共享同一个session,所以要ThreadLocal模式来控制)
例:
Sessionsession=sessionFactory.openSession();
4.创建事务Transaction
例:
Transactiontransaction=(Transaction)session.beginTransaction();
5.CRUD操作(执行数据操作CRUD增删查改)
例:
增加
session.save(pojo对象);
增加或者修改
session.saveOrOpdate(pojo对象)//当修改时候,id不存在将被抛出异常
删除
session.delete(pojo对象)
//根据主键加载
p1=(Person)session.load(pojo类.class,主键值);
6.提交事务
例:
mit();
7.关闭Session实例及SessionFactory
例:
session.close();
sessionFactory.close();
4.Session的管理
Session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取,都与Session息息相关,
就如同在编写JDBC时需关心Connection的管理,以有效的方法创建、利用与回收Connection,以减少资源的消耗,
增加系统执行效能一样,有效的Session管理,也是Hibernate应用时需关注的焦点。
Session是由SessionFactory所创建,SessionFactory是线程安全的(Thread-Safe),您可以让多个
线程同时存取SessionFactory而不会有数据共享的问题,然而Session则不是设计为线程安全的,所以试图让
多个线程共享一个Session,将会发生数据共享而发生混乱的问题。
在各种Session管理方案中,ThreadLocal模式得到了大量使用。
ThreadLocal是Java中一种较为特殊的
线程绑定机制。
通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM为每个运行的线程,
绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。
首先,我们需要知道,SessionFactory负责创建Session,SessionFactory是线程安全的,多个并发线程
可以同时访问一个SessionFactory并从中获取Session实例。
而Session并非线程安全,也就是说,如果
多个线程同时使用一个Session实例进行数据存取,则将会导致Session数据存取逻辑混乱
5 Hibernate三种查询方式1hql2qbc《qbe ---querybyexample》3sql
1.hql
1.1冒号法
Queryquery=session.createQuery("fromPersonpwherename=:
xxx");//from后面跟的是PO对象名,而不是表名
query.setString("xxx","ttt");
Listlist=query.list();
for(Personp:
list)
System.out.println(p.getName())
1.2问号法
Queryquery=session.createQuery("fromPersonpwherename=?
");
query.setString(0,"ttt");
Listlist=query.list();
for(Personp:
list)
System.out.println(p.getName())
模糊查询举例
问号法
Queryquery=session.createQuery("fromPersonpwherenamelike?
");
query.setString(0,"%a%");
冒号法
Queryquery=session.createQuery("fromPersonpwherenamelike:
xxx");
query.setString("xxx","%w%");
2.QBC( querybyCriteria)
Criteria接口与DetachedCriteria(二者的区别就是DetachedCriteria可以离线操作,而Criteria不可以)
<1>利用Restrictions进行条件筛选
方法 說明
Restrictions.eq等於
Restrictions.allEq使用Map,使用key/value進行多個等於的比對
Restrictions.gt大於>
Restrictions.ge大於等於>=
Restrictions.lt小於<
Restrictions.le小於等於<=
Restrictions.between對應SQL的BETWEEN子句
Restrictions.like對應SQL的LIKE子句
Restrictions.in對應SQL的in子句
Restrictions.andand關係
Restrictions.oror關係
Restrictions.sqlRestrictionSQL限定查詢
<2>criteria.addOrder(Order.asc("id"));//排序
举例1
Criteriacriteria=session.createCriteria(Person.class);
criteria.add(Restrictions.like("name","ad%")); //模糊查询,姓名以ad开头,注意要加%号
criteria.add(Restrictions.between("age",20,30)); //年龄在20到30之间
criteria.addOrder(Order.asc("id"));//
Listlist=criteria.list();
for(Personp:
list){
System.out.println(p);
}
上面是与查询,如果是或查询 查询等于20或者或者年龄为空的记录
Criteriacriteria=session.createCriteria(User.class);
criteria.add(Restrictions.or(
Restrictions.eq("age",newInteger(20)),
Restrictions.isNull("age")
));
Listusers=criteria.list();
DetachedCriteria使用 //?
离线操作的意义何在?
DetachedCriteriadc=DetachedCriteria.forClass(Person.class);
dc.add(Restrictions.eq("name","aaa"));
Listlist=dc.getExecutableCriteria(session).list();
for(Personp:
list){
System.out.println(p.getId());
}
3.Sql
<