一、Session的保存、删除及更新
1.save()方法:将一个对象的属性取出放入PreparedStatement语句中,然后向数据库中插入n语句。
例:
//打开Session,开启事务
Students students = new Students();
students.setCardId(20080929);//设置学号
session.save(students);
System.out.println(students.getid());
//提交事务,关闭Session
2.update()方法:
例:
//打开Session,开启事务
students=(Students)session.get(Students.class,"1");
students.setName("123");
session.update(students);
//提交事务,关闭session
3.批量更新:在进行批量操作时,最好的方法是调用JDBC的API进行操作。
例:将所有学生的姓名前加上一个字符串“xiao”。
Connection conn = session.connection();
PreparedStatement stmt = conn.prepareStatement("update students set sname='xiao'+sname");
stmt.executeUpdate();
4.saveOrUpdate()方法:与save方法,update方法用法相同。只是处理的细节不同。
5.delete()方法:
负责删除一个对象例:
//打开Session,开启事务
students=(Students)session.get(Students.class,"1");
session.delete(students);
//提交事务,关闭Session
二、通过主键ID取得数据对象
1.get()方法:用立即加载的方式发送SQL语句,并得到已经初始化的对象。
//打开Session,开启事务
Students students=(Students)session.get(Students.class,"1")
//提交事务,关闭Session
2.load()方法:它返回一个代理对象,直到这个对象被访问,此代理对象才会被初始化。
students = (Students)session.load(Students.class, 1);
System.out.println(students.getSid());
三、Query接口(重点)
1.使用“?”绑定参数
例:查找age大于27,名字中有a的所有记录,打印姓名和年龄。
Students students = new Students();
Query query = session.createQuery("from Students where age>? and sname like ?");
query.setInteger(0, 27);
query.setString(1,"%a%");
List list= query.list();
for(int i=0;i<list.size();i++)

{
students = (Students)list.get(i);
System.out.print(students.getSname()+",");
System.out.println(students.getAge());
}
2使用“:”后跟变量的方法设置参数
Students students = new Students();
Query query = session.createQuery("from Students where age>:minAge and sname like:likeName");
query.setInteger(minAge, 27);
query.setString(likeName,"%a%");
List list= query.list();
for(int i=0;i<list.size();i++)

{
students = (Students)list.get(i);
System.out.print(students.getSname()+",");
System.out.println(students.getAge());
}
3.使用命名查询(namedQuery)
students.hbm.xml的源码如下:
1
<?xml version="1.0" encoding="utf-8"?>
2
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
3
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
4
<hibernate-mapping>
5
<class name="com.zzn.hibernate.Students" table="students" schema="dbo" catalog="hibernate">
6
<id name="sid" type="java.lang.Integer">
7
<column name="sid" />
8
<generator class="native"></generator>
9
</id>
10
<property name="sname" type="java.lang.String">
11
<column name="sname" length="10" not-null="true" />
12
</property>
13
<property name="age" type="java.lang.Integer">
14
<column name="age" not-null="true" />
15
</property>
16
</class>
17
<query name="queryStudents_byAgeAndName">
18
<![CDATA[
19
from Students where age>25:minAge and sname like:likeName
20
]]>
21
</query>
22
</hibernate-mapping>
23
使用命名查询的源码如下:
1
package com.zzn.hibernate;
2
import java.util.List;
3
import org.hibernate.Query;
4
import org.hibernate.Session;
5
import org.hibernate.SessionFactory;
6
import org.hibernate.Transaction;
7
import org.hibernate.cfg.Configuration;
8
9
public class Test3
{
10
@SuppressWarnings("unchecked")
11
public static void main (String[]args)
{
12
Configuration configuration = new Configuration().configure();
13
SessionFactory sessionFactory = configuration.buildSessionFactory();
14
Session session = sessionFactory.openSession();
15
Transaction transation = session.beginTransaction();
16
17
Students students = new Students();
18
Query query = session.getNamedQuery("queryStudents_byAgeAndName");
19
query.setInteger("minAge", 25);
20
query.setString("likeName", "%a%");
21
List list = query.list();
22
for(int i=0;i<list.size();i++)
23
{
24
students = (Students)list.get(i);
25
System.out.println(students.getSname());
26
System.out.println(students.getAge());
27
System.out.print(students.getSid());
28
}
29
transation.commit();
30
session.close();
31
}
32
}
33
四、查询缓存:对于有很多select语句,可insert、delete、update、语句较少的情况,使用查询缓存性能上有一定的改善作用。反之查询比较少的情况,这方法意义就不大了。
(1)在hibernate.cfg.xml中设定hibernate.cache.use_query_cache属性
1
<?xml version='1.0' encoding='UTF-8'?>
2
<!DOCTYPE hibernate-configuration PUBLIC
3
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
4
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
5
<hibernate-configuration>
6
<session-factory> 

7
<property name="hibernate.cache.use_query_cache">true</property>
8
</session-factory>
9
</hibernate-configuration>
(2)每次建立Query实例时,执行setCacheable(true)。
1
Students students= new Students();
2
Query query = session.createQuery("from Students");
3
query.setCacheable(true);//准许把查询放入查询缓存
4
List list=query.list();
5
for(int i=0;i<list.size();i++)
{
6
students =(Students) list.get(i);
7
System.out.println(students.getSname());
8
}
9
//一下是再次查询并打印
10
Query q = session.createQuery("from Students");
11
q.setCacheable(true);
12
List l=q.list();
13
for(int i=0;i<l.size();i++)
{
14
students =(Students) l.get(i);
15
System.out.println(students.getSname());
16
}
(3)从结果可以看出第一次查询是从数据库查询出来的,而第二次则是从缓存中将Query中的结果返回的。
五、清除缓存对象:如果在数据库中插入1000000条数据,再插入500000条时程序抛出例外OutOfMemoryException。因为Hibernate总是把新添加的对象加入到Session级别的缓存中。所以我们必须清除缓存。
(1)clear()方法:
在hibernate.cfg.xml中设置
1
<?xml version='1.0' encoding='UTF-8'?>
2
<!DOCTYPE hibernate-configuration PUBLIC
3
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
4
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
5
<hibernate-configuration>
6
<session-factory> 

7
<property name="hibernate.jdbc.batch_size">20</property>
8
</session-factory>
9
</hibernate-configuration>
然后在一个合适的频率下调用flush()清理缓存发送SQL语句,调用Session的clear()方法清空Session缓存。
1
//打开Session,开启事务
2
for(int i=0;i<1000000;i++)
{
3
Students students = new Students();
4
students.setCardid();
5
session.save(students);
6
if(i%20)
{
7
//第20个对象保存一次,之后马上清空Session
8
session.flush();
9
session.clear();
10
}
11
}
12
//提交事务,关闭session
(2)evict()方法:清除缓存中的某个对象
1
//打开事务Session,开启事务
2
for(int i=0;i<1000000;i++)
{
3
Students students = new Students();
4
students.getSid();
5
session.save(students);
6
session.evict(students);//把students对象 清除出Session缓存
7
SessionFactory.evict(Students.class,students.getSid());//把students对象清除出二级缓存
8
}
9
//提交事务,关闭Session
以上说的都是重点要掌握的,还有一些方法如:setEntity();setparameter();setPropertyies();uniqueResult();iterator()等大家有兴趣也可以自己去看看。