hibernate框架如何在项目中运用

来源:互联网 发布:nginx事件驱动模型 编辑:程序博客网 时间:2024/04/30 08:12

hibernate框架如何在项目中运用

  • 针对一个项目,如果要使用hibernate框架来对数据库进行操作;我们应该按如下步骤开始操作:

1.建立hibernate框架,首先我们应该导入一些我们项目中所需要的架包,本次示例用到如下架包,也是所有项目基本都会用到的架包:

这里写图片描述


简单的给大家介绍一下这些架包的具体作用:

antlr-2.7.6.jar:语言转换工具,hibernate利用它将HQL语句转变成SQL语句
commons-collections-3.1.jar:用来增强java对集合的处理能力
dom4j-1.6.1.jar: xml文件解析器
javassist-3.9.0.GA.jar: hibernate在运行时用它来扩展java类
jta-1.1.jar:标准的java事务处理接口(跨数据库)
slf4j: Hibernate使用的一个日志系统

2.根据项目的详细设计说明书,在oracle或者mysql数据库中建立连接对象,然后根据账户和密码登录连接对象,在连接对象中创建自己项目所对应的数据库名称(后面事例以test为例),然后在test数据库中创建项目所需要的表:

eg: CREATE TABLE `person` (            `ID`             int(11)                NOT NULL,            `NAME`           varchar(20)            NOT NULL,            `AGE`            int(11)                NOT NULL,            `ADDRESS`        varchar(100)           NOT NULL,             PRIMARY KEY (`ID`)        )

3.数据库中创建好表以后,然后在项目中创建pojo包,在包中创建表的映射类,如果有很多的表,就创建很多的类,类名和表名一致;然后根据表中的列的名称和属性在映射类中创建属性,形成一一对应的关系:

public class Person {    private int id;    private String name;    private int age;    private String address;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }    @Override    public String toString() {        return "Person [id=" + id + ", name=" + name + ", age=" + age                + ", address=" + address + "]";    }}

4.表的映射类创建好以后,开始配置映射文件,映射文件的扩展名一般为.hbm.xml的形式,文件名的前缀一般和表名保持一致,该文件放在classPath目录下的任意位置。在实际项目开发过程中,我们一般单独建一个存放映射文件的包,以方便管理。映射文件是为了指定对象和关系数据表之间的映射,在运行时,Hibernate将根据这个映射文件来生成各种sql语句。

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!--     Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping>   <!-- 指定类和表的映射,name属性下面写的是实体类的地址全称,table属性下面写的是表名  -->   <class name="com.etc.cfg.Person" table="PERSON">   <!-- 指定持久化类的对象标识符和表的主键的映射 -->        <id name="id" column="ID" type="integer">        <!-- 指定对象标识符生成器,负责为对象标识符生成唯一的标识符。increment 表示自增 -->            <generator class="increment"></generator>        </id>        <!-- 属性。映射类的属性和表的字段 -->        <property name="name" column="NAME" type="string"></property>        <property name="age" column="AGE" type="integer"></property>        <property name="address" column="ADDRESS" type="string"></property>   </class></hibernate-mapping>

5.映射文件配置好以后,开始配置hibernate的主配置文件。主配置文件里面配置hibernate的初始化信息,这个文件在classPath的任意目录下;一般命名为:hibernate.cfg.xml。

<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools. --><hibernate-configuration>    <session-factory>    <!-- 属性:配置数据库的驱动类 -->        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>        <!-- <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> -->    <!-- 属性:配置数据库的url地址 -->        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>        <!-- <property name="hibernate.connection.url">jdbc:oracle:thin@localhost:1521:orcl</property> -->    <!-- 属性:配置连接连接对象的时候需要登录的用户名和密码 -->        <property name="hibernate.connection.username">root</property>        <property name="hibernate.connection.password">111111</property>    <!-- 属性:配置数据库的sql方言 -->        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>        <!-- <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> -->    <!-- 属性:是否在控制台打印输出hibernate为我们自动拼接好的sql语句 -->        <property name="hibernate.show_sql">true</property>    <!-- 映射:指定程序需要关联的映射文件 -->        <mapping resource="com/etc/cfg/Person.hbm.xml"/>    </session-factory></hibernate-configuration>

6.创建一个单例模式获取SessionFactory的工具类,它的作用是专门给调用者生产Session对象。在实际项目开发中,SessionFactory类放在一个连接池类中,SessionFactory生产出来的Session对象我们一般都是放在一个线程安全的threadLocal线程中,threadLocal一般是希望将某一个状态和线程相关联,hibernate主要也是事务管理,所以放在这里很合适,性能比thread更优秀。但是不管是在单个的Util工具类还是连接池这种对数据库访问量减少的更高级编程中,它的原理都是第一步先要加载配置文件,在实际项目的连接池中我们把文件读取这一块放在一个静态块中,这样就可以在类刚被加载的时候就读取配置文件。

import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;/** * 单例模式获取SessionFactory的工具类 * @author 莫小忆 */public class SessionFactoryUtil {    private static SessionFactory sessionFactory;    private SessionFactoryUtil() {    }    public static SessionFactory getSessionFactory(){        if(sessionFactory == null){            //初始化配置文件读取对象            Configuration config = new Configuration();            //设定读取的主配置文件路径            config.configure("/hibernate.cfg.xml");            //config.addClass(Person.class);            //创建一个session工厂            sessionFactory = config.buildSessionFactory();        }        return sessionFactory;      }}

7.创建好SessionFactory的作用就是以后业务需求中谁要对数据库进行增删改查,就自己去向SessionFactory索要Session对象。由Session对象负责对数据库进行增删改查。在实际的项目开发中,我们一般都是按照表名创建类,在类里面专门编写业务需求,来实现所有对这个表进行操作的hql语言,也就是业务逻辑类,这是一个开发项目中80%的工作量。

/**     * 保存用户信息     */    @org.junit.Test    public void insertPerson(){        SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory();        //创建session对象        Session session = sessionFactory.openSession();        //开启事务        Transaction ts = session.beginTransaction();        Person ps = new Person();        ps.setName("张三");        ps.setAge(20);        ps.setAddress("北京");        //将用户信息保存早数据库        session.save(ps);        //提交事务        ts.commit();        //关闭session对象,释放资源        session.close();    }
    /**     * 根据id获取用户     */    @org.junit.Test    public void findPersonById(){        SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory();        //创建session对象        Session session = sessionFactory.openSession();        //根据id获取对象        Person person = (Person) session.get(Person.class, 1);        System.out.println(person.getName());        //关闭session对象,释放资源        session.close();    }
    /**     * 查询全部用户     */    @org.junit.Test    public void findPersons(){        SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory();        //获取session对象        Session session = sessionFactory.openSession();        //获取查询对象        String hql = "from Person";        Query query = session.createQuery(hql);        List list = query.list();        //使用查询对象返回集合,集合中封装hql中查询的类的实例化对象        for(int i=0;i<list.size();i++){            Person person = (Person) list.get(i);            System.out.println(person.getName());        }        //关闭session对象,释放资源        session.close();        }
    /**     * 修改用户信息     */    @org.junit.Test    public void updatePersonById(){        SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory();        //获得session对象        Session session = sessionFactory.openSession();        //开启事务        Transaction ts = session.beginTransaction();        //根据id获取对象        Person person = (Person) session.get(Person.class, 1);        person.setName("Tom");        person.setAge(25);        //修改数据        session.update(person);        //提交事务        ts.commit();        //关闭session对象,释放资源        session.close();    }
    /**     * 删除用户信息     */    @org.junit.Test    public void deletePerson(){        SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory();        //获取session对象        Session session = sessionFactory.openSession();        //开启事务        Transaction ts = session.beginTransaction();        //根据id获取对象        Person person = new Person();        //设定id,hibernate会根据id删除数据        person.setId(1);        session.delete(person);        //提交事务        ts.commit();        //关闭session对象,释放资源        session.close();    }

8.hibernate所做的工作基本就到此为止了。所有用户需要的数据都被session缓存起来了,jsp需要数据的时候,通过session 取得,然后封装到bean对象里面,就可以在整个项目中流传了。

结论:

不管学习什么知识,其实最重要的还是要运用到实际开发当中,我们应该对知识深入浅出,当你真正理解了以后,就会发现,其实我们所用的东西,实际开发中只用到很少很少的一部分,没有想象中那么难。大家要有信心。

1 0