1、Configuraion类
1) 负责管理hibernate的配置信息2) 读取hibernate.cfg.xml
3) 加载hibernate.cfg.xml配置文件中配置的驱动,url,用户名,密码,连接池。
4) 管理*.hbm.xml对象关系文件。
示例:Configuration configuration = new Configuration().configure();
2、SessionFactory接口
1) 缓存sql语句和其他数据2) 重量级的类,一般是单例模式保证只有一个SessionFactory实例
示例:
public final class SessionUtils {
private static SessionFactory sessionFactory = null;
private static ThreadLocal threadLocal = new ThreadLocal();
private SessionUtils() {
}
static{
sessionFactory=new Configuration().configure().buildSessionFactory();
}
//获取新的session
public static Session OpenSession(){
return sessionFactory.openSession();
}
//获取和线程相关的session
public static Session getCurrentSession(){
Session session = threadLocal.get();
if (session==null) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
}
3) 一个数据库创建一个SessionFactory
4) 通过SessionFactory接口获取Session实例
openSession() 是获取一个新的session
getCurrentSession () 获取和当前线程绑定的session,在同一个线程中,我们获取的session是同一session,这样可以利于事务控制。
使用需要配置:
用下面代码测试:
3、session接口
1) 它的主要功能和作用是:Session一个实例代表与数据库的一次操作(当然一次操作可以是crud组合)
Session实例通过SessionFactory获取,用完需要关闭。
Session是线程不同步的(不安全),因此要保证在同一线程中使用,可以用getCurrentSessiong()。
Session可以看做是持久化管理器,它是与持久化操作相关的接口
2) get和load方法比较
如果查询不到数据,get 会返回 null,但是不会报错, load 如果查询不到数据,则报错 ObjectNotFoundException
使用get 去查询数据,(先到一级/二级)会立即向db发出查询请求(select ...), 如果你使用的是 load查询数据,(先到一级、二级)即使查询到对象,返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用查询结果的时候才真的发出select ,这个现象称为懒加载(lazy)
通过修改配置文件,可以取消懒加载
4、query接口
通过query可以完成更加复杂的查询任务.
例子说明:
public static void main(String[] args) {
Session session = SessionUtils.getCurrentSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
//Employee是类名不是表名
Query query = session.createQuery("from Employee where id=1");
//封装
List list = query.list();
for (Employee employee : list) {
System.out.println(employee.getName());
}
transaction.commit();
} catch (Exception e) {
if (transaction!=null) {
transaction.rollback();
}
throw new RuntimeException(e.getMessage());
}
}