一、Configuration类
一个应用程序只创建一个Configuration对象,只存在于系统的初始化阶段。
1.常用的Configuration操作方法
…
若要加载多个自定义的XML文件,可采用Configuration中提供的addResource方法实现:
//多次调用addResource方法,加载xml映射文件
Configuration cfg=new
Configuration().addResource("xml1.hbm.xml").addresource("xml2.hbm.xml");
//多次调用addClass方法,直接添加被映射的类,消除对文件名的硬编码
//在/com/model下寻找xml1.hbm.xml和xml2.hbm.xml文件,并加载进来
Configuration cfg=new
Configuration().addClass(com.model.xml1.class).addClass(com.model.xml2.class);
//调用setProperty方法动态配置属性值
Configuration cfg=new
Configuration().addClass(com.model.xml1.class).addClass(com.model.xml2.class).
setProperty("hibernate.dialect","org.hibernate.dialect.MySQLDialect").
setProperty("hibernate.connection.datasource","java:comp/env/jdbc/test");
二、SessionFactory接口
一个应用程序中只有一个SessionFactory实例,且不能改变。
!!但当项目中要操作多个数据库时,必须为每个数据库指定一个SessionFactory。
1.常用操作方法
Configuration config = new Configuration().configure();
SessionFactory sessionFactory=config.buildSessionFactory();
//采用openSession()方法创建Session
Session session1=sessionFactory.openSession();
//采用getCurrentSession()方法创建Session
Session session2=sessionFactory.getCurrentSession();
采用openSession()方法创建Session实例时,SessionFactory直接创建一个新的Session实例,使用完成后调用
close()方法手动关闭。
采用getCurrentSession()方法创建的Session实例会被绑定到当前线程中,在提交(commit)或回滚(rollback)操
作时自动关闭。!!需在hibernate.cfg.xml配置文件中添加如下配置:
//使用本地事务
<property name="hibernate.current_session_context_class">thread</property>
//使用全局事务
<property name="hibernate.current_session_context_class">jta</property>
三、Session接口
Session对象生命周期以Transaction对象的事务开始和结束为边界。
特点:
(1)非线程安全
(2)实例是轻量级的,创建和销毁不需太多资源
(3)有一个缓存(Hibernate的第一级缓存),用于存放当前工作单元加载的对象。
对象在生命周期中有三种状态:瞬时态(Transient)、持久态(Persistent)、游离态(Detached)
能够使对象进入持久态的方法包括:
save() :由瞬时态变为持久态;
load()或get() :返回的总是持久态对象;
find() :返回List集合,集合中的对象都是处于持久态;
update()、saveOrUpdate()和lock() :将游离态对象转换为持久态对象。
若一个持久态对象与一个瞬时态对象关联,在允许级联保存的情况下,Session会在清理缓存时将瞬时态对象
转换为持久态对象。
将一个对象由持久态转换为游离态方法:
close() :若程序中再没有变量来引用这些游离态对象,则这些对象就会被垃圾回收而结束其生命周期。
evict() :将缓存中的一个持久态对象删除,使其变为游离态。当Session的缓存中保存了大量的持久态对象时,
可调用evict()从中删除一些持久态对象以节省内存空间。
1.常用操作方法
1.1save()方法
完成以下任务:
(1)将对象加入到缓存中,同时标识为Persistent状态;
(2)根据映射文件中的配置信息生成实体对象的唯一标识符;
(3)生成计划执行的insert语句。(事务结束或此操作为后续操作的前提情况下,才会执行insert语
句)
save()方法持久化实体对象的代码:
User user = new User();//->瞬时态
user.setName("Tom");
user.setPassword("123456");
Session session=sessionFactory.openSession(); //创建Session实例
Transaction tx = session.beginTransaction(); //开启事务
session.save(user);//->持久态
tx.commit(); //提交事务
session.close(); //关闭Session
//->游离态
如果要对指定了/<generator>/元素的实体对象使用自定义的标识符作为记录的主键值,可利用Session实例中的
重载方法save(Object object,Serializable id)来实现。
对处于Persistent状态的实体对象,在此调用save()方法是没有意义的。
1.2update()方法
Session实例的update()方法主要完成以下任务:
(1)将user对象加入到缓存中,并标识为Persistent状态;
(2)生成计划执行的update语句。
update()方法更新数据库中记录的方法代码:
User user = new User();//->瞬时态
user.setName("Tom");
user.setPassword("123456");
user.setId("1"); //**必须设置主键**
Session session=sessionFactory.openSession(); //创建Session实例
Transaction tx = session.beginTransaction(); //开启事务
session.update(user);//->持久态
tx.commit(); //提交事务
session.close(); //关闭Session
//->游离态
1.3saveOrUpdate()方法
当传入Transient状态实体对象时,执行save()操作;当传入Detached状态实体对象时,执行update()操作;
传入Persistent状态实体对象时,直接返回,不进行任何操作。
当用户的id属性为空时,执行save()操作,此时user对象被当作是瞬时态的;当从数据库获取的user对象的id
属性不为空时,执行update()操作。
String hql="select new User(user name,user age)from User user";//定义HQL语句
Query query = session.createQuery(hql);//创建Query对象
List users = query.list();//返回结果集
//遍历结果集
for(int i=0;i<users.length();i++){
User user = (User) users.get(i);
user.setName("Jack");
session.saveOrUpdate(user);//id为null,执行save()
}
String hql = "from User user";
Query query = session.createQuery(hql);//创建Query对象
List users = query.list();//返回结果集
//遍历结果集
for(int i=0;i<users.length();i++){
User user = (User) users.get(i);
user.setName("Jack");
session.saveOrUpdate(user);//id不为null,执行update()
}
1.4delete()方法
主要完成以下任务:
(1)若传入的实体对象不是Persistent状态,则将需要删除的对象与Session实例相关联,使其转变为
Persistent状态;
(2)生成计划执行的delete语句;
delete()方法删除实体对象的过程代码:
User user = new User();
user.setId("1");//必须设置主键
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.delete(user);
tx.commit();
session.close();
执行删除操作时,应注意执行顺序,尤其是有外键关联情况下,要避免删除父对象而忘记删除子对象情况,否则会引发约
束冲突。
1.5get()方法
通过标识符得到指定类的持久化对象。如果对象不存在则返回空。
Session session = sessionFactory.getCurrentSession();//创建Session实例
Transaction tx = session.beginTransaction();
User user = (User)session.get(User.class,"1");//获取id为"1"的持久化对象
System.out.println(user.getId());
tx.commit();
session.close();
1.6load()方法
与get()方法一样,都是通过标识符得到指定类的持久化对象。但要求持久化对象一定存在,否则产生异
常。
Session session = sessionFactory.getCurrentSession();//创建Session实例
Transaction tx = session.beginTransaction();
User user = (User)session.load(User.class,"1");//获取id为"1"的持久化对象
System.out.println(user.getId());
tx.commit();
session.close();
get()和load()主要区别:
(1)查找记录不存在时,get()返回null,load()抛出异常;
(2)get()直接返回实体类,load()可以返回实体的代理类实例(当xxx.hbm.xml中的<class>元素的lazy属性值为
true时)
(3)load()和get()都是先从Session内部缓存中查找实体对象,如果没找到,load()会查询Hibernate的二级缓存
(get()会越过二级缓存),若还未找到则发送一条SQL语句到数据库中查询,根据查询结果生成相应的实体对象。
1.7contains()方法
判断一个实体对象是否与当前的Session对象相关联,也可判断是否处于Persistent状态。
1.8evict()方法
通过移除缓存中实体对象与Session实例之间的关联关系来清除指定的对象,执行evict()后,实体对象由
Persistent状态转变为Detached状态。
if(session.contains(user))
session.evict(user);
1.9clear()方法
清空session的缓存。
下面介绍的几种Sessionf方法分别创建了Query、Criteria以及SQLQuery查询接口的实例,再通过这些实例来获
取持久化对象。
1.10createQuery()方法
建立Query查询接口实例,该实例可以使用HQL语言进行数据库查询操作。
Session session = sessionFactory.getCurrentSession();//创建Session实例
Transaction tx = session.beginTransaction();
Query query = session.createQuery("from User");//创建Query实例
List list = query.list();
tx.commit();
session.close();
1.11createCriteria()方法
建立Criteria查询接口实例,可通过设置条件来执行数据库查询操作。
Session session = sessionFactory.getCurrentSession();//创建Session实例
Transaction tx = session.beginTransaction();
Criteria crit = session.createCriteria(User.class);//创建Criteria实例
crit.setMaxResults(50);
List users = crit.list();
tx.commit();
session.close();
1.12createSQLQuery()方法
建立SQLQuery查询接口实例。查询接口通过标准SQL语句执行数据查询操作。
Session session = sessionFactory.getCurrentSession();//创建Session实例
List users = session.createSQLQuery("select {user.*} from User {user}",
"user",User.class).list();
session.close();
1.13createFilter()方法
用于一个持久化集合或数组的特殊查询。查询字符串中可以使用this关键字引用集合中当前元素。
//查询班级team中成绩高于80分的学生集合。
Collection StudentScore = session.createFilter(team.getStudents(),("where
this.score>?").setParameter(1,new Integer(80)).list());
四、Transaction接口
事务提交:
事务回滚:
事务隔离和隔离级别关系表:
配置文件中可对隔离级别进行设置:
<property name="hibernate.connection.isolation">4</property>
五、Query接口
接口在使用HQL语句对数据库进行操作时,主要包括以下三个步骤:
(1)创建Query实例。Query query=session.createQuery(hql)
(2)设置动态参数。setter方法
(3)执行查询语句,返回查询结果。既可以返回List类型的结果,也可返回唯一的对象。
1.常用Query操作方法
1.1setter方法
设置参数时,既可以根据参数名称来设置,也可根据参数位置来设置。
Session session = sessionFactory.openSession();//创建Session实例
Query query = session.createQuery("from user where age>**:userAge**");
query.setInteger("userAge",25); //根据名称设置
List users = query.list();
//
Query query = session.createQuery("from user where age>**?**");
query.setInteger(0,25); //根据位置设置
List users = query.list();
session.close();
1.2list()方法
执行查询语句,以List类型返回。Hibernaet会将所有结果集中数据转换成Java实体对象。
1.3iterator()方法
执行查询语句返回Iterator对象。读取时只能按顺序方式读取(不知道结果集中记录的数目),仅把使用到的
数据转换成Java实体对象。
Session session = sessionFactory.openSession();//创建Session实例
Query query = session.createQuery("from user");
Iterator iter = query.iterator();
//遍历结果集
while(iter.hasNext()){
...
}
session.close();
1.4uniqueResult()方法
返回唯一结果,可将返回结果直接转换成相应的对象。
Session session = sessionFactory.openSession();//创建Session实例
Query query = session.createQuery("from User where id="1" ");
User user = (User)query.uniqueResult();
session.close();
1.5executeUpdate()方法
可支持HQL语句的更新和删除操作,建议更新时采用。
Session session = sessionFactory.openSession();//创建Session实例
Transaction tx = session.beginTransaction();
Query query = session.createQuery("update User set password='123' ");
query.executeUpdate();
tx.commit();
session.close();
1.6setFirstResult()方法
设置所获取的第一个记录的位置,从0(第1个)开始计算.
1.7setMaxResults()方法
设置结果集的最大记录数,实现分页功能时非常有用。
Session session = sessionFactory.openSession();//创建Session实例
Transaction tx = session.beginTransaction();
Query query = session.createQuery("from User");
int currentPage = xxx;//当前页数,第1页开始计算
int pageSize = xx;//每页记录数
query.setFirstResult((currentPage-1)*pageSize);
query.setMaxResults(pageSize);
List users = query.list();
tx.commit();
session.close();
2.1实体查询
2.2属性查询
2.3实体的更新和删除
2.4HQL的聚集函数
2.5分组和排序
2.6子查询
六、Criteria接口