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的几个主要方法:
- save,persist保存数据,persist在事务外不会产生insert语句;
- delete,删除对象;
- update,更新对象,如果数据库中没有记录,会出现异常;
- get,根据ID查,会立即访问数据库;
- load,根据ID查,(返回的是代理,不会立即访问数据库)
- saveOrUpdate,merge( 根据ID和version的值来确定是save或update ),调用merge你的对象还是托管的。//后续讲解托管
- 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 秒)
![](http://img.zemanta.com/pixy.gif?x-id=6116fb60-8399-80c8-aeac-6b3c8af7c2d8)