Hibernate体系结构图:
Hiberante框架支持两种配置文件:
src/hibernate.properties:数据库连接、常用数据配置
src/hibernate.cfg.xml:数据库连接、常用数据配置、二级缓存策略、 hbm的映射、 事件(监听器 )
src/hibernate.cfg.xml可配置的参数更多,功能更加强大
Hibernate常用数据配置:
hibernate.dialect 操作数据库方言
hibernate.connection.driver_class 连接数据库驱动程序
hibernate.connection.url 连接数据库URL
hibernate.connection.username 数据库用户名
hibernate.connection.password 数据库密码
hibernate.show_sql 在控制台上输出SQL语句
hibernate.format_sql 格式化控制台输出的SQL语句
hibernate.connection.autocommit 事务是否自动提交,没有手动开始事物时使用
hibernate.hbm2ddl.auto DDL策略
create:Hibernate启动的时候先drop表,再create表 (用于测试)
create-drop: Hibernate启动的create表,关闭前执行一下drop表 (用于测试)
update: Hibernate启动的时候会去检查schema是否一致,如果不一致会做scheme更新 (用于产品),如果类映射发生变化,在数据库中插入新的数据列,不会改变原有列
validate: Hiberante启动时验证数据库的schema与hibernate是否一致,如果不一致就抛出异常,并不做更新
Configuration 类:
该类的功能是加载Hibernate 配置文件,Hibernate有两种配置文件形式hibernate.properties和hibernate.cfg.xml
方式一:
Configuration configuration = new Configuration().configure();
这种方式new Configuration()时加载hibernate.properties文件,调用configure()时加载hibernate.cfg.xml配置文件,配置文件中通过
<mapping resource="rock/lee/bean/Customer.hbm.xml" />
加载hbm文件
方式二:
Configuration configuration = new Configuration();
configuration.addResource("rock/lee/bean/Customer.hbm.xml");
configuration.addClass(Customer.class);
只加载文件hibernate.properties,不加载hibernate.cfg.xm,手工加载hbm.xml和实体类
通过配置的方式加载hbm.xml和实体类的方式在开发中更为常见,而不是通过硬编码的方式
SessionFactory 接口:
加载hibernate所有配置信息,预定义SQL语句, 管理二级缓存, 内部维护连接池
SessionFactory sessionFactory = configuration.buildSessionFactory();
SessionFactory 需要通过Configuration对象获得,SessionFactory有两个非常重要的函数
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
从内部连接池随机获取一个连接,构造一个Session对象
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
获得的Session是与当前线程绑定的Session对象,Web开发中使用,需要特殊配置使用Hibernate操作CRUD是都要Configuration-->SessionFacctory-->Session
@Test
public void test(){
Configuration configuration = new Configuration().configure();// 实例化配置对象,加载配置文件 hibernate.cfg.xml
SessionFactory sessionFactory = configuration.buildSessionFactory();// 创建Session连接工厂
Session session = sessionFactory.openSession();//创建Session
Transaction transaction = session.beginTransaction();//开启事物
//.....编写CRUD代码
transaction.commit();//提交事务
session.close();//关闭session
sessionFactory.close();//关闭session工厂
}
太繁琐,Don'r Reapet Yourself原则,对这段代码提取为一个工具类,方便使用
public class HibernateUtils {
private static Configuration configuration;
private static SessionFactory sessionFactory;
static{
configuration = new Configuration().configure();
sessionFactory= configuration.buildSessionFactory();
}
public static Session openSession(){
return sessionFactory.openSession();
}
public static Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
}
Session 接口 :
相当于一个数据库连接,类似于JDBC的Connection,有了这个连接就可操作数据了,提供了CRUD具体操作函数
save 插入一个对象数据
update 修改一个对象数据
delete 删除一个对象数据
get/load 根据id查询一个对象
createQuery / createSQLQuery 获得查询对象,根据HQL/SQL 完成数据查询
createCriteria() 高级条件查询对象 (面向对象思想进行条件查询 )
以上操作除了条件查询外其它都在《Hibernate Part 2:单表CRUD》出现过了
http://mvplee.iteye.com/blog/2186235
Transaction 接口:
事物操作接口,如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务,默认事务,可以通过在hibernate.cfg.xml 配置,设置事物默认提交
Transaction transaction = session.beginTransaction();//获取事物处理对象
transaction.begin();//开启事物
transaction.commit();//事物提交
transaction.rollback();//事物回滚
开启事物,异常后回滚
@Test
public void testTransaction() {
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();//获取事物处理对象
transaction.begin();//开启事物
Customer c1 = new Customer("小明",18,"北京");
session.save(c1);
int i = 1/0;
Customer c2 = new Customer("小小红",28,"上海");
session.save(c2);
transaction.commit();//事物提交
session.close();
sessionFactory.close();
}
控制台会打印一条insert语句,但数据库不会有任何数据被插入
Query 接口 :
匿名参数的查询
@Test
public void testQueryByParameter() {
Session session = HibernateUtils.openSession();
Query query = session.createQuery(" from Customer where age=?");
query.setParameter(0, 18);
@SuppressWarnings("unchecked")
List<Customer> list = query.list();
System.out.println(list);
}
有名称参数查询
@Test
public void testQueryByParameter() {
Session session = HibernateUtils.openSession();
Query query = session.createQuery(" from Customer where age=:age");
query.setParameter("age", 18);
@SuppressWarnings("unchecked")
List<Customer> list = query.list();
System.out.println(list);
}
分页查询
query.setFirstResult(0);// 返回第一条记录索引
query.setMaxResults(5);// 返回最大记录条数