Hibernate 学习总结

public void paramTest2(){
		String hqlString="from Student s where s.name like :name";
		Session session = HibernateUtil.currentSession();
		Query query =session.createQuery(hqlString);
		String name="zh%";
		//按参数名字进行匹配
		query.setString("name", name);
		List<Student> student=query.list();
		System.out.println(student);
	}


 1.  Hibernate 是用来干什么的?

      Hibernate是用来连接javabean对象和数据库的,那为什么不用JDBC呢,JDBC在连接数据库时,不能面向对象,产生冗余代码,然而Hibernate对JDBC对做了轻量级的封装,在连接数据库时,能直接面向对象,操作简单方便。

 

2.Hibernate是怎样建立数据库和javabean对象的连接呢? 

      说道这个问题,我们就要说一个概念—持久化,简单的说就是把java对象中涉及的数据都永久的保存磁盘中或数据库中。到底是怎么持久化的呢,hibernate用的是ORM框架,通过配置文件把对象模型和数据库的表一一映射起来。 

 

3.具体的连接步骤如下。

     (1)创建项目,导入jar包。

         

     (2)创建主机配置文件。

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
	
<hibernate-configuration>
	<session-factory>
		<!-- 1.数据库连接信息 -->
		<!-- 数据库JDBC驱动类名 -->
		<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
		<!-- 数据库连接URL -->
		<property name="connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
		<!-- 数据库用户名  -->
		<property name="connection.username">owner</property>
		<!-- 数据库密码 -->
		<property name="connection.password">123</property>
		
		<!-- 2.hibernate相关配置 -->
		<!-- 数据库方言 -->
		<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
		<!-- 是否输出Hibernate生成的SQL语句,开发阶段一般需要开启 -->
		<property name="show_sql">true</property>
		<!-- 是否对输出SQL进行格式化 -->
		<property name="format_sql">true</property>
		
		
		<!-- 3.连接池配置 -->
		<!-- 此处可替换成别的连接池实现,我们现在使用的是c3p0 -->
		<property name="hibernate.connection.provider_class">
			org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider
		</property>
		<!-- 这是C3P0随时准备好的最少的JDBC连接数量 -->
		<property name="hibernate.c3p0.min_size">5</property>
		<!-- 连接池中JDBC连接的最大数量 -->
		<property name="hibernate.c3p0.max_size">20</property>
		<!-- 超时周期,在它之后,闲置连接将从池中移除 -->
		<property name="hibernate.c3p0.timeout">300</property>
		<!-- 最多高速缓存100个预编译语句,该属性是使Hibernate获得较好性能的要素。 -->
		<property name="hibernate.c3p0.max_statements">100</property>
		<!-- 连接被自动验证前,以秒为单位的闲置时间 -->
		<property name="hibernate.c3p0.idle_test_period">3000</property>
		
		
		<!-- 注册ORM实体类映射文件的路径-->
		<mapping resource="entity/Student.hbm.xml" /> 
		<mapping resource="entity/Book.hbm.xml" /> 
		<mapping resource="entity/Type.hbm.xml" /> 
		<mapping resource="entity/Record.hbm.xml" /> 
		
	</session-factory>
</hibernate-configuration>


 

     (3)配置映射文件。

  

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
[...]
</hibernate-mapping>


 

        (4)在主配置文件中添加实体文件映射路径。(主配置文件为hibernate.cfg.xml)

         <mapping resource=“***/***/***.hbm.xml" />

        (5)连接好好,进行测试。
  

   4.用Hibernate操作数据库的步骤。

      (1)获取配置。(2)创建SessionFactory 。(3)获取Session。(4)打开事物。(5)持久化操作。对数据库表增删改查就在这一步。(6)提交事物。(7)关闭session。

  5.在hibernate中,三种实体对象的状态转换。

        瞬时状态(Transient)
    刚用new语句创建,还没有被持久化,且不处于Session的缓存中
        持久状态(Persistent)
    已经被持久化,且加入到Session的缓存中
        游离状态(Detached)
    已经被持久化,但不再处于Session的缓存中
        通过new产生瞬时状态,通过save saveOrUpdate方法转换为持久态,通过delete方法可以将对象变回瞬时态。

         session关闭之后,原有的持久态就变成了游离态,游离态通过update() ,savaOrUpdate()  ,lock()等方法变为 持久态。

 session的get load方法可直接获得一个持久态对象。

 

  6.关系映射。

  (1)单向多对一映射(many-to-one)。many的一端应持有one的一端的对象(引用)。

           在映射文件中配置如下:

     

<hibernate-mapping>
	<class name="org.ijob.bean.Resume" table="ijob_resume">
		<!—省略主键映射及属性映射 -->
		<!-- 多对一关联 -->
		<many-to-one name="seeker" class="org.ijob.bean.Seeker">       1
			<column name="seeker_id"></column>                 2
		</many-to-one>
	</class>
</hibernate-mapping>

              1、name为属性名,class为“one”端类名     

              2、   " seeker_id"外键列列名,具体情况下下相应的列名。
     (2)单向一对多映射(one-to-many)。one的一端应持有many端的对象集合。
              在映射文件中设置如下:

             

<hibernate-mapping>
	<class name="org.ijob.bean.Seeker" table="ijob_seeker">
		<!—省略主键映射及属性映射 -->
		<set name="resumes" >                                                1
			<key column="seeker_id"></key>                           2
			<one-to-many class="org.ijob.bean.Resume"/>              3
		</set>
</class>
</hibernate-mapping>


              1、set集合节点适用于配置一对多关联关系, name属性指定one的一端对应属性名。
              2、" seeker_id"外键列列名。具体情况下下相应的列名
              3、class属性指定many端的全限定类名。
      

     (3)多对多关联。将多对多转换成两个一对多。为中间表建立实体类及映射文件,两个端点和中间端分别建立双向一对多关联。
             如果中间表是联合主键,在映射文件中配置:

 

<!-- 联合主键 -->
<composite-id>
<key-many-to-one name=“**” column=“***" class=“***" ></key-many-to-one>
<key-many-to-one name=“**” column=“**" class=“**" ></key-many-to-one>
</composite-id>

     

  7.Hibernate的HQL查询操作。

     HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象和属性的概念,它的语法与SQL很像。

       在HQL中,Student是类名,不是表名,s.name 是 属性名。   

     上面的介绍只是基本查询,还可以设置参数查询。
           (1)  定位参数:定位参数下标从0开始。

public void paramTest1(){
		String hqlString="from Student s where s.name like ?";
		Session session = HibernateUtil.currentSession();
		Query query =session.createQuery(hqlString);
		String name="a";
		//定位参数
		query.setString(0, "z_%"+name+"%");//参数匹配从0开始
		List<Student> student=query.list();
		System.out.println(student);
	}

          (2)命名参数:在HQL语句中," :"一定不能少了,

public void paramTest2(){
		String hqlString="from Student s where s.name like :name";
		Session session = HibernateUtil.currentSession();
		Query query =session.createQuery(hqlString);
		String name="zh%";
		//按参数名字进行匹配
		query.setString("name", name);
		List<Student> student=query.list();
		System.out.println(student);
	}

      还有HQL的其它用法,就不介绍了,大家可以上网查看。   
             
8.  Hibernate加载计划。Hibernate有默认的加载计划。
         1.关联对象和关联集合的默认加载计划是:延迟加载,即加载主对象时它们不会被立即加载,而是直到使用这些对象和集合时才发送SQL语句、获取数据、初始化对象和集合。
          2、主对象本身是否延迟加载取决于使用的是load()方法还是其它方法,load()方法是延迟的,而get()方法或其它方法是立即的。
          3、主对象的属性默认是被立即加载的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值