一、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
使用命名查询的源码如下:
1package com.zzn.hibernate;
2import java.util.List;
3import org.hibernate.Query;
4import org.hibernate.Session;
5import org.hibernate.SessionFactory;
6import org.hibernate.Transaction;
7import org.hibernate.cfg.Configuration;
8
9public 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)。
1Students 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,开启事务
2for(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()等大家有兴趣也可以自己去看看。