一、Hibernate中API详解
1、configuration对象详解
作用:
用于加载配置文件
常用方法:
Configuration():它是负责加载类的根路径下名称为hibernate.properties文件,它加载不了xml文件。
configure():它是负责加载类的根路径下,名称为hibernate.cfg.xml的配置文件。
buildSessionFactory():它是负责解析xml文件,创建SessionFactory的
2、SessionFactory对象详解
作用:
用于生产Session对象
常用方法:
openSession():每次都是产生一个新的Session。
说明信息:
它创建时维护了很多的信息:
(1)、连接数据库的信息
(2)、hibernate的基本配置
(3)、映射文件的位置
(4)、还维护了映射文件的所有配置
(5)、还维护了每个实体的常用SQL语句:全字段插入,根据ID的全字段更新,根据ID的查询和根据ID删除。
由于此对象维护了很多的信息,所以在创建的时候会消耗很多资源。
由同一个SessionFactory生产的Session,共享SessionFactory里面维护的信息。
SessionFactory是线程安全的。
SessionFactory的使用原则:
一个应用只有一个SessionFactory,不应该反复的创建和销毁
3、session对象详解
作用:
和数据库交互增删改查。用于开启事务,获取事务对象
常用方法:
save(Object):保存一个实体
update(Object):更新一个实体
delete(Object):删除一个实体
get(Class clazz,Serializable id):根据id查询一个实体
beginTransaction():开启事务,并返回事务对象。
close():关闭Session
说明信息:
由于SessionFactory已经维护了很多信息,所以到Session这只维护了较少的信息。
它的创建和销毁不会消耗太多资源。
它不是线程安全的(线程不安全)。
它维护了hibernate的一级缓存
Session的使用原则:
让一个线程上只有一个Session
4、Transaction对象详解
作用:
用于控制事务
常用方法:
commit():提交事务
rollback():回滚事务
二、入门案例的CRUD演示
1、添加用户
package cn.itcast.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.itcast.domain.Customer;
/**
* hibernate的入门案例
* @author zhy
*
*/
public class HibernateDemo1 {
/**
* 需求:
* 保存一个客户实体到数据库中
* 步骤分析:
* 1、加载hibernate主配置文件
* 2、依据配置文件中的信息构建SessionFactory对象
* 3、使用SessionFactory生产Session
* 4、开启事务
* 5、执行保存操作
* 6、提交事务
* 7、释放资源
*/
@Test
public void test1(){
Customer c = new Customer();
c.setCustName("TBD云集中心");
c.setCustSource("电话");
c.setCustIndustry("商业办公");
c.setCustLevel("普通客户");
c.setCustAddress("昌平区北七家镇");
c.setCustPhone("010-34983498");
//1、加载hibernate主配置文件
Configuration cfg = new Configuration();
cfg.configure();
//2、依据配置文件中的信息构建SessionFactory对象
SessionFactory factory = cfg.buildSessionFactory();
//3、使用SessionFactory生产Session
Session session = factory.openSession();
//4、开启事务
Transaction tx = session.beginTransaction();
//5、执行保存操作
session.save(c);
//6、提交事务
tx.commit();
//7、释放资源
session.close();
factory.close();
}
}
2、HibernateUtils的抽取
package cn.itcast.utils;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* hibernate的工具类
* 它里面要做的是:
* 根据配置文件创建SessionFactory(只能创建一次)
* 返回一个Session对象
* @author zhy
*
*/
public class HibernateUtil {
//定义一个SessionFactory对象
private static SessionFactory factory;
//创建SessionFactory
static{
//hibernate把可以预见的异常都转成了运行时异常。
try {
Configuration cfg = new Configuration();
cfg.configure();
factory = cfg.buildSessionFactory();
} catch (Exception e) {
// e.printStackTrace();
throw new ExceptionInInitializerError("初始化SessionFactory失败!");
}
}
/**
* 获取Session对象
* @return
*/
public static Session openSession(){
return factory.openSession();
}
}
3、Hibernate的CRUD操作
package cn.itcast.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.itcast.domain.Customer;
import cn.itcast.utils.HibernateUtil;
/**
* hibernate的CRUD
* @author zhy
*
*/
public class HibernateDemo4 {
/**
* 保存一个实体类
*/
@Test
public void testSave(){
Customer c = new Customer();
c.setCustName("修正健康大厦");
c.setCustSource("电话");
c.setCustIndustry("医药制造");
c.setCustLevel("普通客户");
c.setCustAddress("昌平区北七家镇");
c.setCustPhone("010-34983498");
Session s = HibernateUtil.openSession();
Transaction tx = s.beginTransaction();
s.save(c);
tx.commit();
s.close();
}
/**
* 根据id查询一个实体
*/
@Test
public void testFindOne(){
Session s = HibernateUtil.openSession();
Transaction tx = s.beginTransaction();
//第一个参数指的是查询的实体类字节码 第二个参数指的是查询的id
Customer c = s.get(Customer.class, 3L);
System.out.println(c);
tx.commit();
s.close();
}
/**
* 更新一个实体
*/
@Test
public void testUpdate(){
Session s = HibernateUtil.openSession();
Transaction tx = s.beginTransaction();
//根据id查询一个实体
Customer c = s.get(Customer.class, 3L);
//修改实体数据
c.setCustName("传智专修学院");
//更新一个实体
s.update(c);
tx.commit();
s.close();
}
/**
* 删除一个实体。
* 注意:
* 以前在jdbc操作时,只要给定主键就可以删除。
* 而现在必须要给定一个对象。
* 这个对象可以只包含主键信息。
*/
@Test
public void testDelete(){
Session s = HibernateUtil.openSession();
Transaction tx = s.beginTransaction();
//根据id查询一个实体
Customer c = s.get(Customer.class, 2L);
//删除一个实体
s.delete(c);
tx.commit();
s.close();
}
}