框架学习笔记之Hibernate框架基础——Hibernate入门实例

 


一、简介:

面向java环境的对象/关系数据库映射工具

不仅管理java类到库的映射们还提供数据查询和获取数据的方法

对于开发者通常的数据持久化关于的编程任务,解放95%

Hibernate对于中间层应用最好的场合。

相对于以数据操作的应用来说可能不是最好的选择。

可以帮助开发者消除或者包装那些针对特定厂商的sql代码。建立跨越数据库的应用平台。


二、能做什么:

减少乏味的编码,获取数据库连接,执行sql  关闭数据库连接。

更加面向对象设计。

更好的性能,持久层大多提供了优秀的性能优化机制,内置数据库连接池支持

更好的移植性,基于JAVA的跨平台特性,系统可以在不同操作系统之间切换。

扫描二维码关注公众号,回复: 2649768 查看本文章

 


三、学习Hibernate框架的动机:

我们初期做项目的时候,大部分为基于MVC的增删改查。在对数据库直流层操作时,需要大量的对数据库操作的代码,产生内置对象先封装再拆开很麻烦,想要把整个数据对象存入数据库的方法,就需要用到Hidernate。

使用Hibernate之后,Dao中连接数据库的大量代码就不需要了。Hibernate框架就是在业务层和数据库之间增加一个持久层。有很多持久层组件,获得到的对象取值不需要被拆开,一对多的问题,关联问题可以通过框架映射至数据库。

 


四、多层体系结构使Hibternate营运而生

最初双层体系结构

 

三层架构:视图层,业务层,数据库(直流层)

 

 

持久化技术:对象流,将内存对象固化到硬盘,用于永久性的保存数据。xml   格式化的文本文件都可以进行固化储存。

这个模式为四层模式,将三层模式中的业务分离出一个单独的持久层进行持久化操作。对象关系映射,将对象放入自动持久化的放入数据库中。

四层架构:表示层,业务逻辑层,持久层,数据层。

orm中间件常见产品: Hibernate  iBatis 。为了解决面向对象和关系型数据库存在的互相不匹配的现象的技术。

业务实体在内存中表现为对象,数据库中表现为关系数据。问题在于数据库中,关系数据无法直接表达多对多关联和继承关系。

 


五、第一个Hibernate应用

1、在需要连接的数据库中建表。笔者用的时oracle,使用sqlplus进行创表

 create table person(

  pid number(5) primary key,

  pname varchar2(20),

  pwd varchar2(20)

  );

Table created

2、jar包导入webContent下lib

3、创建实体类Person,添加getter,setter方法。

4、添加配置文件:hibernate.properties和hibernate.cfg.xml。目录为为project/etc下的文件。在文件中首次配置需要自动弹出提示,需要将dtd文件导入工程中。

hibernate.cfg.xml

引用Person.hbm.xml文件。

在session-factory标签中配置从hibernate.properties中找到的oracle配置文件。

添加property标签,分别添加oracle的方言选择,会自动提供分页功能,oracle驱动,用户名和密码,url链接。 

  <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

    <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

    <property name="hibernate.connection.username">system</property>

    <property name="hibernate.connection.password">Yuquan980730</property> 

    <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> 



<mapping resource="com.demo.Bean/Person.hbm.xml"/>将person.hbm.xml配置进入文件。

hibernate.properties

## Oracle

#hibernate.dialect org.hibernate.dialect.Oracle8iDialect

#hibernate.dialect org.hibernate.dialect.Oracle9iDialect

#hibernate.dialect org.hibernate.dialect.Oracle10gDialect

#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver

#hibernate.connection.username ora

#hibernate.connection.password ora

#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:orcl

#hibernate.connection.url jdbc:oracle:thin:@localhost:1522:XE

修改hibernate-distribution-3.6.6.Final\project\hibernate-core\src\test\java\org\hibernate\subclassProxyInterface

下的Person.hbm.xml文件。

Person.hbm.xml:

文件粘贴到Person实体类下,将实体向数据库中的表映射。

​
<hibernate-mapping package="com.Demo.Bean">//包名
    <class name="Person" table="person">//第一个为类名,第二个为数据库表名,名字相同不区分大小写
       <id name="pid" type="int" column="pid">//名字相同,也需要区分大小写。 id  name=pid  (类中属性)    type=int  (映射关系)  cloumn=pid(对应表中的字段)
            <generator class="sequence">//表示自增序列,序列为oracle用户设置
            <param name="sequence">seq_newsId</param>//其中param name 为sequence,用于oracle数据库       内容为数据库序列号,在oracle中依照序列名称查询出select seq_newsid.nextval from dual
            </generator>
       </id>
       <property name="pname" type="string" table="pname" />//为Bean中属性,相同可以省略
       <property name="pwd" type="string"></property>
    </class>

</hibernate-mapping>

​

下一步需要得到session。

 

5、编写实体类Util类和工具类

HibernateUtil.java:

public class HibernateUtil {

     static SessionFactory sessionFactory;

     static {

          Configuration con=new Configuration();

          con.configure();//configure方法重要,用于调用hibernate.cfg.xml

          sessionFactory=con.buildSessionFactory();

     }

     public static Session getSession() {

          return sessionFactory.openSession();

   
     }

}



在使用Hibernate框架的过程中需要了解hibernate包中的session方法。

 

PersonDaoImpl.java:

package com.demo.Impl;

import org.hibernate.Session;

import com.demo.Bean.Person;

import com.demo.Util.HibernateUtil;

public class PersonDaoImpl {

     public boolean addPerson(Person person) {        

          Session session=HibernateUtil.getSession();

          int result=(Integer)session.save(person);//保存session对象,返回值为

          boolean flag=false;

          if(result>0) {
           
              flag=true;
            
          }session.close();

          return flag;

     }

}

Test.java:

public class Test {

     public static void main(String[] args) {

          Person person=new Person(0,"tom","123");

          PersonDaoImpl personDao=new PersonDaoImpl();

          boolean flag=personDao.addPerson(person);

         System.out.println(flag);

     }

此处测试出现一下结果:

flag为true,表示插入成功了,会因为oracle数据库自身的特性:增删改查的事务不会主动提交,程序执行成功,在oracle内存中,在oracle的命令行中commit不管用,自动开启事务,手动结束事务。需要在工具实现类中将其实现。

Session session=HibernateUtil.getSession();

          Transaction tran=session.beginTransaction();

          int result=(Integer)session.save(person);//保存session对象,返回值为

          boolean flag=false;

          if(result>0) {
      
              flag=true;

              tran.commit();

          }session.close();

          return flag;

运行成功。

增删改必须提交事务,同理,在工具类中添加方法updatePerson,

删改的返回值为void,所以在进入该方法后就表示执行完成,直接返回true,

按照id查询返回值为对象,传值pid,返回person对象。

public boolean updatePerson(Person person) {//更新操作
         
          Session session=HibernateUtil.getSession();

          Transaction tran=session.beginTransaction();

        session.update(person);//void返回值

          boolean flag=false;
       
              tran.commit();

          session.close();

          return true;     

     }

public boolean deletePerson(Person person) {//删除操作

     Session session=HibernateUtil.getSession();

     Transaction tran=session.beginTransaction();

   session.delete(person);//void返回值

          tran.commit();
       

     session.close();

     return true;


}

public    Person queryById(int pid) {//按照id查询操作


     Session session=HibernateUtil.getSession();


     Person person=(Person) session.get(Person.class, pid);

   session.update(person);//void返回值

     session.close();

     return person;

     

}

运行结果:

 

id为3的数据修改成功,程序结束。


六,个人对使用Hibernate后的感想

作为一个初学者,在使用了Hibernate框架实现了常规的增删改查之后,深深感受到了框架的强大之处,将所有有关于数据库直流层的操作全部封装,使用者需要做的就是将session对象通过前台页面获得,并使用session对象分别执行相应的数据库操作,这里全部都是一个实体类对象可以搞定的,大大改变编码时对对象反复拆分和组合的困扰,很是喜欢,不过,针对于大部分以数据为中心的应用来说,Hibernate框架还有其局限性。

 

 

猜你喜欢

转载自blog.csdn.net/YuQuanZhang/article/details/81227608
今日推荐