Hibernate的基本API的用法

1、Configuration 配置对象

Configuration对象就是用来读取配置文件和orm映射文件的!

hibernate.cfg.xml 通常使用xml配置文件,可以配置内容更丰富。

       hibernate.properties用于配置key/value 形式的内容,key不能重复的。配置有很多的局限性。一般不用。

1.提供构造  new Configuration() hibernate将自动加载 hibernate.properties文件

       hibernate.properties文件必须存放在类路径(src)下。

2.提供方法 configure() 将加载src下的hibernate.cfg.xml 

3.扩展api

       configure(String)加载指定目录下的 xml文件

4.手动加载配置文件

          // 手动加载指定的配置文件

         config.addResource("com/itheima/a_hello/User.hbm.xml");     

        // 手动加载指定类,对应的映射文件 User--> User.hbm.xml

        config.addClass(User.class);


2、 SessionFactory工厂

  SessionFactory 相当于java web连接池,用于管理所有session


SessionHibernate自己创建,放进工厂的。

所以程序员只需要关注如何创建工厂,和从工厂中取出Session对象就行了。

 

1、创建工厂 SessionFactory

       1、需要configuration的配置信息

       2、直接buildSessionFactory()  【然而这个方法已经过时了

       3、获得Session 【必须确保Session是同一个Session

              OpenSession:获得一个全新的Session对象  一般测试的时候用这个

              getCurruentSession 获得与当前线程绑定的Session对象,如果没有,就给你一个新的。项目上线的时候用这个

 

              特别的,使用getCurruentSession的时候需要再xml里面配置一个property。

以后学Spring 的时候可以不用thread绑定,现在学Hibernate就是用thread绑定。

 

              框架的优点就在这里,它封装了ThreadLocal放在getCurruentSession里面。

 

事务是包裹业务的,所有的业务操作结束后才关闭事务(提交或回滚)

用了一个 ThreadLocal<connection> 类,线程本地化,来保证一个业务里面的所有connection是同一个。



3、Session 会话

Session 相当于 JDBC的 Connection-- 会话

Hibernate中必须需要主键。它是通过主键来区别对象的。】

1、演示面向对象的增

       只需要用setName这样的属性操作,然后用session.save(),然后关闭资源(sessionfactory都要关闭)即可。其他的sql语句之类的不用管。

2、查询

       使用get方法。

3、修改【主要需要用tansaction事务来操作,这样可以及时修改】

       必须先查询出要修改的对象,再进行修改。

4、删除

       根据id删除。【这里只要set对象的主键就行了。】     

 

5、查询【非常重要!】

       1get方法(上面演示过了):get方法被调用时,立刻发送sql语句查询。

       2load方法【代理对象原理】:调用laod的时候并没有查询数据,只有当我们需要使用该对象的时候,才查询数据。【延迟加载,提高Hibernate的执行效率】

       3.1、查询所有对象 HQL语言

              使用HQL查询,Hibernate Query Language,是一个面向对象的查询语言。

              “from 类名”就是查询所有结果。

           

       3.2还有一个是session.createCriteria方法:
             
它是Hibernate独创的面向对象的查询,特点是无语句查询。

 

       3.3 支持原生的sql查询(这里不是面向对象的查询,所有list的泛型不能乱写了)

              这里的打印不能再用syso了,必须用for循环打印,因为这个是用obeject封装数据信息的。

              这里再使用query.addEntity方法将查询的结果封装到指定对象中。

                            SQLQueryquery=session.createSQLQuery(“select * from t_user”);

                            Query.addEntity(User.class);

                            List<User>list=query.list()

                            Syso(List)



4、Transaction 事务

开启事务beginTransaction()

获得事务getTransaction() 

提交事务:commit()

回滚事务:rollback()

事务的基本操作:
//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//-------------------------------
		//打开事务
		Transaction ts = session.beginTransaction();
		//获得已经打开的事务对象(很少用)
		session.getTransaction();
		
		
		//Transaction 控制如何关闭事务
		//提交
		ts.commit();
		//回滚
		ts.rollback();
		
		
		//-------------------------------
		session.close();
		sf.close();

事务的细节:【重点!!!】
//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得与当前线程绑定的session
		Session session = sf.getCurrentSession();
		//-------------------------------
		//事务关闭时,会自动把与当前线程关联的session关闭,并删除
		session.beginTransaction().commit();
		
		//在获得当前线程绑定的session时. 获得的是新的session
		Session session2 = sf.getCurrentSession();
		
		System.out.println(session==session2);//false
		
		//-------------------------------
		session.close();
		sf.close();


5、 Query对象

Query封装查询细节。

Query.list():执行hql语句,当返回结果是多行的情况,用这个。

Query.uniqueResult():只返回一个对象

分页:mysql用了limit idex,count

        Hibernate用了↓,查询结果用list接收,打印。

//指定结果从第几个开始拿

        query.setFirstResult(0);

        //指定拿几个结果

        query.setMaxResults(2);


6、Criteria对象

这个方法用的不多,因为它有局限性,所以稍作了解即可。

//Criteria 查询 => Hibernate独创的面向对象的查询=> 无语句
		Criteria criteria = session.createCriteria(User.class);	
// 查找name属性值为tom的 记录
		criteria.add(Restrictions.eq("name", "tom"));
		//返回一个查询结果
		User u = (User) criteria.uniqueResult();


//Criteria 查询 => Hibernate独创的面向对象的查询=> 无语句
		Criteria criteria = session.createCriteria(User.class);
//查找名字中包含字母o的用户
		criteria.add(Restrictions.like("name", "%o%"));
	//返回一个查询结果
		List<User> list =	criteria.list();
		System.out.println(list);

//Criteria 查询 => Hibernate独创的面向对象的查询=> 无语句
		Criteria criteria = session.createCriteria(User.class);		
		//查找id大于3的用户
		criteria.add(Restrictions.gt("id", 3));
		//返回一个查询结果
		List<User> list =	criteria.list();
		System.out.println(list);

7、工具类

代码的重复性很强,所以封装成一个工具类就好了。

一次服务器开启期间,加载一次配置就好了。

Build相当于连接池,整个项目放一个连接池就够了。

所以这些都是进程级别的操作,所以应该放到static里面。


public class H3Utils {
	
	// 会话工厂,整个程序只有一份。
	private static SessionFactory factory;

	static{
		//1 加载配置
		Configuration config = new Configuration().configure();
		
		//2 获得工厂
		factory = config.buildSessionFactory();
//3 关闭虚拟机时,释放SessionFactory
			Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("虚拟机关闭,释放资源");
				sf.close();
			}
		}));
	}
	
	
	/**
	 * 获得一个新的session
	 * @return
	 */
	public static Session openSession(){
		return factory.openSession();
	}
	
	/**
	 * 获得当前线程中绑定session
	 * * 注意:必须配置
	 * @return
	 */
	public static Session getCurrentSession(){
		return factory.getCurrentSession();
	}
	
	
}



依赖对象(Dependent objects) 组件(Component)是一个被包含的对象,在持久化的过程中,它被当作值类型,而并非一个实体的引用。在这篇文档中,组件这一术语指的是面向对象的合成概念(而并不是系统构架层次上的组件的概念)。举个例子, 你对人(Person)这个概念可以像下面这样来建模: public class Person { private java.util.Date birthday; private Name name; private String key; public String getKey() { return key; } private void setKey(String key) { this.key=key; } public java.util.Date getBirthday() { return birthday; } public void setBirthday(java.util.Date birthday) { this.birthday = birthday; } public Name getName() { return name; } public void setName(Name name) { this.name = name; } ...... ...... } public class Name { char initial; String first; String last; public String getFirst() { return first; } void setFirst(String first) { this.first = first; } public String getLast() { return last; } void setLast(String last) { this.last = last; } public char getInitial() { return initial; } void setInitial(char initial) { this.initial = initial; } } 在持久化的过程中,姓名(Name)可以作为人(Person)的一个组件。需要注意的是:你应该为姓名的持久化属性定义getter和setter方法,但是你不需要实现任何的接口或申明标识符字段。 以下是这个例子的Hibernate映射文件: <!-- class attribute optional --> 人员(Person)表中将包括pid, birthday, initial, first和 last等字段。 就像所有的值类型一样, 组件不支持共享引用。 换句话说,两个人可能重名,但是两个Person对象应该包含两个独立的Name对象,只不过这两个Name对象具有“同样”的值。 组件的值可以为空,其定义如下。 每当Hibernate重新加载一个包含组件的对象,如果该组件的所有字段为空,Hibernate将假定整个组件为空。 在大多数情况下,这样假定应该是没有问题的。 组件的属性可以是任意一种Hibernate类型(包括集合, 多对多关联, 以及其它组件等等)。嵌套组件不应该被当作一种特殊的应用(Nested components should not be
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值