它主要是用于加载 hibernate 配置.
Configuration config=new Configuration().config(); 主要加载 src 下的 hibernate.cfg.xml
Configuration config=new Configuration();主要加载的 src 下的 hibernate.properties
Configuration config=new Configuration().config(核心配置文件名称);加载指定的名称的配置文
件
问题:我们是在 hibernate.cfg.xml 文件中有 xxx.hbm.xml 文件的位置。如果我们使用的是
hibernate.properties 这种核心配置,它如何加载映射配置?
config.addResource("cn.csdn/domain/Customer.hbm.xml");直接加载映射配置文件
config.addClass(Customer.class);这种方式会直接在实体类所在包下查找规范映射配置文件
(2)sessionFactory
首先 SessionFactory 它的获取是通过 Configuration 得到。
1.创建爱你Configuration来加载配置文件
Configguration config = new Configuration().configure();
2.得到SessionFactory
SessionFactory sessionFactory = config.buildSessionFactory();
SessionFactory 接口负责初始化 Hibernate。它充当数据存储源的代理,并负责创建 Session
对象。这里用到了工厂模式。需要注意的是 SessionFactory 并不是轻量级的,因为一般情况
下,一个项目通常只需要一个 SessionFactory 就够,当需要操作多个数据库时,可以为每个
数据库指定一个 SessionFactory。
通过 SessionFactory 可以得到 Session.是从连接池中获取一个连接。
获取一个与线程绑定的 Session.
SessionFactory 它不是轻量级的,不要频繁创建关闭它。在一个项目中有一个 SessionFactory
就可以,通过 SessionFactory 来获取 Session 进行操作。
问题:怎样可以保证在一个项目中所使用的 SessionFactory 是同一个哪?
public class HibernateUtils {
private static Configuration config;
private static SessionFactory sessionFactory;
static {
config=new Configuration().configure();
sessionFactory=config.buildSessionFactory();
}
public static Session openSession(){
return sessionFactory.openSession();
}
}
SessionFactory 内部还维护了一个连接池,如果我们要想使用 c3p0 连接池,应该怎样处理?
1. 我们要导入 c3p0 的相关 jar 包
在 hibernate/lib/options 下有关于 c3p0 连接池 jar 包
2. 在 hibernate.cfg.xml 文件中配置 c3p0 连接
可以查看 etc/hibernate.properties 中关于 c3p0 的配置
(3) Session
Session 接口负责执行被持久化对象的 CRUD 操作(CRUD 的任务是完成与数据库的交流,包含
了很多常见的 SQL 语句)。但需要注意的是 Session 对象是非线程安全的。
问题:我们如何解决 session 的安全问题?
我们只需要在方法内部来使用 Session 就可以。
问题:Session 如何获取到?
SessionFactory.openSession() ; 相当于直接通过 SessionFactory 创建一个新的 Session,使
用完成后要手动调用 close 来关闭。
SessionFactory.getCurrentSession(); 获取一个与线程绑定的 Session,当我们提交或事务回
滚后会自动关闭。
Session 常用的方法:
save 保存对象
update 修改操作
delete 删除
get/load 根据 id 进行查询
savenOrUpdate 执行 save 或 update 操作
createQuery()获取一个 Query 对象
CreateSQLQUery()获取一个可以操作 sql 的 SQLQuery 对象
createCriteria() 获取一个 Criteria 它可以完成条件查询
(4) Transaction
Transaction 接口主要用于管理事务,它是 hibernate 的事务接口,对底层的事务进行了封装。
使用它可以进行事务操作。
commit 事务提交
rollback 事务回滚
问题:如果获取一个 Transaction 对象
Session.beginTransaction();
问题:如果在程序中没有开启事务,是否存在事务?
有事务,session 的每一个操作就会开启一个事务。
默认情况下事务是不会自动提交的。
(5) Query
Query 接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL 语言或
本地数据库的 SQL 语句。Query 经常被用来绑定查询参数、限制查询记录数量,并最终执行
查询操作。
通过 Query 主要完成查询操作.
我们通过 Query 可以执行 hql 语句.
Query query=Session.createQuery(hql);
下面这个可以执行 sql 语句
SQLQUery sqlQuery=Session.createSQLQuery(sql);
SQLQuery 是 Query 的子
(6)Criteria
Criteria 接口与 Query 接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的
是 Criteria 接口也是轻量级的,它不能在 Session 之外使用。