`

Hibernate Part 3:核心API和常量配置

 
阅读更多

 

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);// 返回最大记录条数 
 
 
 
 
 
 
 

 

 

 

  • 大小: 54.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics