hibernate框架如何在项目中运用

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对象里面,就可以在整个项目中流传了。

结论:

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值