04_传智播客hibernate教程_Session接口及get,load,persist方法

Session接口的一些常用方法:

  • beginTransation(); //
  • cancelQuery(); //
  • clear();  // 请缓存
  • close();  // 关闭session
  • connection(); // 过时的,废弃的方法;不再推荐使用;
  • contains( Object object ); //判断缓存中是否包含对象;
  • createCriteria( ... );  // 共有四种重载,后续会介绍;
  • createQuery( String ); // 后续会介绍;
  • delete( Object ); // 删除某个对象;
  • evict ( Object ); // 从缓存中清理数据;
  • flush(); // 同步Session和数据库进行同步;
  • get( ... ); // 用的最多的方法;

写一个demo来讲解:

static User getUser( int id ){
    Session s = null;
    try{
        s = HibernateUtil.getSession();
        Class userClass = User.class;
        User user = ( User ) s.get( userClass , id );
        return user;
    } finally {
        if (s != null ) {
            s.close();
        }
    }
}

写完方法了,我们可以在main函数中这样调用:

User u = getUser( user.getId() );
System.out.println("name:" + u.getName());

一个有用的参数showsql
看了以上代码,可能还是不清楚Hibernate是怎么工作的。我们可以(参考hibernate.properties)在hibernate.cfg.xml中添加如下参数以打印Hibernate产生的sql语句:

<property name="show_sql">true</property>

继续,session的api:

  • load(); // 直到访问时才加载。传说中的"懒加载"

User user1 = ( User ) s.load( userClass , id ); //不要再load后去判断对象是否为null,他永远都不会为空,会自动生成一个实例;
User user = ( User ) s.get( userClass , id ); //  对比这个貌似立即加载;
//传智博客友情提示:大家可以在这里增加一条打印出user1的类名的代码,就可以看到load方法所返回的User子类的名称了,该语句如下:
System.out.println( user1.getClass().getName() );

  • merge( Object ),merge( String , Object ) // 对象和数据进行一次更新;????
  • persist( Object ) ; // 就是和save(...)保存效果一致;唯一区别:没开启事务出错时,save会先插入再回滚删除,而persist根本就不会插入
  • refresh( ... );  // 重新读取一次;???
  • save(...) ; // 保存
  • saveOrUpdate( ... );  // 后续会讲解,到底是保存还是更新,很模糊的一个方法;
  • update( ... ) // 更新;产生一条update语句;

PPT讲义
Session的几个主要方法:

  1. save,persist保存数据,persist在事务外不会产生insert语句;
  2. delete,删除对象;
  3. update,更新对象,如果数据库中没有记录,会出现异常;
  4. get,根据ID查,会立即访问数据库;
  5. load,根据ID查,(返回的是代理,不会立即访问数据库)
  6. saveOrUpdate,merge( 根据ID和version的值来确定是save或update ),调用merge你的对象还是托管的。//后续讲解托管
  7. lock(把对象变成持久对象,但不会同步对象的状态)

源码列表:
对比上一讲,仅更新了hibernate.cfg.xml和Main.java
hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory name="foo">
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Demo_Hibernate</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <mapping resource="cn/itcast/hibernate/domain/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Main.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cn.itcast.hibernate.domain;
import cn.itcast.hibernate.HibernateUtil;
import java.util.Date;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author kang.cunhua
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        User user = new User();
        user.setBirthday(new Date());
        user.setName("谷歌");

        System.out.println("----- Hibernate标准调用模板演示 -----");
        addUser(user);
        //addUser1(user); // Hibernate简介调用模板演示
        System.out.println("id:" + user.getId());

        System.out.println("----- 根据ID得到对象:演示get方法; -----");

        User u = getUser(user.getId());
        System.out.println("name:" + u.getName());

        System.out.println("----- 根据ID得到对象:演示load方法; -----");

        u = getUserByLoad(user.getId());
        // System.out.println("name:" + u.getName()); // 此处调用会报错。和懒加载有关系;且看后续讲解
        System.out.println(u.getClass().getName());

    }

    /**
     * Hibernate标准调用模板
     * @param user
     */
    static void addUser(User user) {
        Session s = null;
        Transaction tx = null;
        try {
            s = HibernateUtil.getSession();
            tx = s.beginTransaction();
            s.save(user);
            tx.commit();
        } catch (HibernateException e) {  //catch部分可以省略。效果一致;
            if (tx != null) {
                tx.rollback();
            }
            throw e; //注意,此处必须抛出异常,而不能捕获异常却不处理!
        } finally {
            if (s != null) {
                s.close();
            }
        }
    }

    /**
     * Hibernate简洁调用模板
     * @param user
     */
    static void addUser1(User user) {
        Session s = null;
        Transaction tx = null;
        try {
            s = HibernateUtil.getSession();
            tx = s.beginTransaction();
            s.save(user);
            tx.commit();
        } finally {
            if (s != null) {
                s.close();
            }
        }
    }

    /**
     * 根据ID得到对象:演示get方法;
     * @param id
     * @return
     */
    static User getUser(int id) {
        Session s = null;
        try {
            s = HibernateUtil.getSession();
            Class userClass = User.class;
            User user = (User) s.get(userClass, id);
            return user;
        } finally {
            if (s != null) {
                s.close();
            }
        }
    }

    /**
     * 根据ID得到对象:演示load方法;
     * @param id
     * @return
     */
    static User getUserByLoad(int id) {
        Session s = null;
        try {
            s = HibernateUtil.getSession();
            Class userClass = User.class;
            User user = (User) s.load(userClass, id);
            System.out.println("----- ##User getUserByLoad(int id)## start -----");
            System.out.println("name:" + user.getName());
            System.out.println("----- ##User getUserByLoad(int id)## end -----");
            return user;
        } finally {
            if (s != null) {
                s.close();
            }
        }
    }
}
//run:
//----- Hibernate标准调用模板演示 -----
//log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
//log4j:WARN Please initialize the log4j system properly.
//Hibernate: insert into User (name, birthday) values (?, ?)
//id:23
//----- 根据ID得到对象:演示get方法; -----
//Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.birthday as birthday0_0_ from User user0_ where user0_.id=?
//name:谷歌
//----- 根据ID得到对象:演示load方法; -----
//----- ##User getUserByLoad(int id)## start -----
//Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.birthday as birthday0_0_ from User user0_ where user0_.id=?
//name:谷歌
//----- ##User getUserByLoad(int id)## end -----
//cn.itcast.hibernate.domain.User$$EnhancerByCGLIB$$ddacf5c4
//成功生成(总时间:1 秒)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值