想飞就别怕摔

大爷的并TM骂人

Hibernate中操纵实体对象

一、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.class1);
    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(
027);
        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()等大家有兴趣也可以自己去看看。

posted on 2008-09-28 12:20 生命的绽放 阅读(409) 评论(0)  编辑  收藏 所属分类: Hibernate


只有注册用户登录后才能发表评论。


网站导航:
 
<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(5)

随笔分类(94)

随笔档案(93)

文章分类(5)

文章档案(5)

相册

JAVA之桥

SQL之音

兄弟之窗

常用工具下载

积分与排名

最新评论

阅读排行榜