Hibernate(一)环境搭建

Hibernate01

         从今天开始我们学习hibernate,hibernate是一个持久层的框架hibernate现在的使用其实也在逐渐的减弱,因为Hibernate比较难用,特别是新手使用hibernate,效率总是不太理想,当然不是说hibernate没有,其实它在Java Web开发中一直是很重要的组成部分,希望大家好好学习。

Jboss插件的安装

         在学习hibernate之前,我们需要在我们的eclipse中安装Jboss插件,帮助我们学习hibernate,当然不安装也是可以的。

         Eclipse的插件安装前面已经告诉大家了:

1、 使用在线安装方式:

在help中选择EclipseMarketplace选项,搜索Jboss

就是它,选择安装就行了。

2、 使用本地安装方式:

 

在help中选择InstallNew Software选项,然后选择Add按钮,之后选择Archive

弹出本地选择文件,选择你已经下载好的zip包:

之后就是下一步,下一步这样就行了。


 

创建第一个hibernate项目

         我学习一个新技术的习惯就是:不管这个技术难不难,首先去搭建一个使用了该技术的基本项目,这样有助于我们学习它,那么下面我们先来搭建一个hibernate项目吧。

         搭建hibernate项目有很多知识点,我们一步步来,首先创建一个项目(任意项目,Java 项目就行,因为hibernate接管的是持久层,与数据库打交道,与web无关)。

创建一个Java项目

导入hibernate所需的jar包

         Hibernate支持包我们下载后发现很多的,我们在lib文件夹中选择required文件夹下的,这个文件夹下的jar是必须的jar包,其他的暂时不导入,等有需求的时候再说。

         在这儿要注意一个问题,就是版本问题,在hibernate4之前,hibernate3它的jar包初了这个文件夹下的,还需要去主目录中将hibernate3.jar放入,在hibernate4之后,它将这些jar都放入了required文件夹下。

         Hibernate3:

         Lib文件夹下:

Hibernate4:

         因为现在hibernate都已经更新到了5.0版本了,5.0比较新,所以3版本除了以前的项目使用,现在我们大多数情况下使用4,太新和太旧的我们一般都不使用,我们这次就以4的版本为例给大家学习hibernate。

jar包导入成功后,记得还要导入另外两个jar包哦:数据库的驱动包和log4j的jar包,因为hibernate使用的是log4j作为日志的。当然你使用了log4j作为日志,那么log4j的配置文件一定要在src目录下配置一份。

在src目录下创建hibernate的配置文件(hibernate.cfg.xml)

         在src目录下创建hibernate.cfg.xml文件,注意:名称必须一致。

Hibernate.cfg.xml文件配置如下:

<!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>

       <!-- 我们使用了MySQL数据库,所以要使用MySQL方言,如果使用了其他数据库,则使用其他方言 -->

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

       <!-- 数据库驱动 -->

       <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

       <!-- 连接数据库的URLusernamepassword -->

       <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db_hibernate</property>

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

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

      

       <!-- 根据需要自动创建数据表 -->

       <property name="hibernate.hbm2ddl.auto">update</property>

       <!-- 显示Hibernate持久化操作所生成的SQL -->

       <property name="show_sql">true</property>

       <!-- SQL脚本进行格式化后再输出 -->

       <property name="hibernate.format_sql">true</property>

    </session-factory>

</hibernate-configuration>

创建实体类

         我们这个项目就是用来测试hibernate的,所以我们创建一个用户的操作项目,User类。

         User.java:

package com.lzcc.hibernate.entity;

import java.util.Date;

publicclass User {

    privateintid;

    private String username;

    private String password;

    private String nickname;

    private Date bornDate;

 

    publicint getId() {

       returnid;

    }

 

    publicvoid setId(int id) {

       this.id = id;

    }

 

    public String getUsername() {

       returnusername;

    }

 

    publicvoid setUsername(String username) {

       this.username = username;

    }

 

    public String getPassword() {

       returnpassword;

    }

 

    publicvoid setPassword(String password) {

        this.password = password;

    }

 

    public String getNickname() {

       returnnickname;

    }

 

    publicvoid setNickname(String nickname) {

       this.nickname = nickname;

    }

 

    public Date getBornDate() {

       returnbornDate;

    }

 

    publicvoid setBornDate(Date bornDate) {

        this.bornDate = bornDate;

    }

 

    public User() {

    }

 

    public User(int id, String username, String password, String nickname,

           Date bornDate) {

       super();

       this.id = id;

       this.username = username;

       this.password = password;

       this.nickname = nickname;

        this.bornDate = bornDate;

    }

}

在实体类的包下创建与实体类对应的XXX.hbm.xml文件

         在实体类的包下创建与实体类对应的xxx.hbm.xml文件,用来指定实体类和数据库表的对应关系。

User.hbm.xml:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.lzcc.hibernate.entity">

    <class name="User" table="t_user">

        <id name="id" >

           <!-- 表的id的生产策略,可以根据不同的数据库选择不同自增,但是建议大家使用native,这样的话

               hibernate会根据你选择的数据库自动的选择使用什么生产策略 -->

           <generator class="native" />

        </id>

        <property name="username" />

        <property name="password" />

        <property name="nickname" />

        <property name="bornDate" type="timestamp" column="born_date" />

    </class>

</hibernate-mapping>

将实体类的配置文件加入到hibernate.cfg.xml文件中

<!-- 将实体类中的配置文件加入到hibernate的配置文件中 -->

<mapping resource="com/lzcc/hibernate/entity/User.hbm.xml"/>

         至此我们就完成了hibernate的整个搭建过程,相对来说,hibernate的搭建相对复杂,所以建议大家多练习练习。

测试是否搭建成功

         我们来创建一个JUnit,做一个单元测试:

         TestHibernate.java:

package com.lzcc.hibernate.test;

 

import java.util.Date;

 

import org.hibernate.HibernateException;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.boot.registry.StandardServiceRegistry;

import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

import org.hibernate.cfg.Configuration;

import org.hibernate.service.Service;

import org.hibernate.service.ServiceRegistry;

import org.hibernate.service.ServiceRegistryBuilder;

import org.junit.Test;

 

import com.lzcc.hibernate.entity.User;

 

publicclass TestHibernate {

 

     @Test

     publicvoid test01() {

          // 想使用hibernate,必须首先获取hibernatesessionfactory

          // 到的sessionfactory后,通过它得到session,我们所有的操作都是

          // session的基础上操作的

          /**

           * 得到SessionFactoryhibernate3及其以前版本,很简单 Configuration cf = new

           * Configuration().configure(); SessionFactory sessionFactory =

           * cf.buildSessionFactory();

           */

          // 这样获取Sessionfactory已经过时了,如果你想使用也行,只是不建议大家使用

          // Configuration cf = new Configuration().configure();

          // SessionFactory sessionFactory = cf.buildSessionFactory();

 

          // hibernate4.0-4.2之间,hibernateSessionfactory获取方式,如果你的版本是4.0-4.2之间,可以如此获取

          //Configuration cfg = new Configuration().configure();

          //ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()

          //        .applySettings(cfg.getProperties()).buildServiceRegistry();

          //SessionFactory factory = cfg.buildSessionFactory(serviceRegistry);

         

          //hibernate4.3及其以后,获取SessionFactory的方式,我们使用的是4.3.5,所以使用这样一种方式

          Configuration cfg  = new Configuration().configure();

          StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();

          SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);

         

          Session session = null;

          try {

               session = sessionFactory.openSession();

               /**

                * 因为增加、修改,删除是存在事务控制的,所以我们要开启事务

                * 两只方式:

                *   1session.beginTransaction();

                *  2session.getTransaction().begin();

                */

               session.beginTransaction();

               //增加用户,判断我们的环境是否搭建成功

               User u = new User("ljh", "123", "刘帅哥", new Date());

               //session.save()方法表示保存对象到数据库

               session.save(u);

               session.getTransaction().commit();

          } catch (HibernateException e) {

               e.printStackTrace();

               if (session != null) {

                    session.getTransaction().rollback();

               }

          } finally {

               if (session != null) {

                    session.close();

               }

          }

     }

}

         测试通过,我们发现hibernate的版本在变化的同时,获取SessionFactory的方式也不同,希望大家注意下。其次注意写法,session打开后,一定要记得关闭掉。同时注意导包问题,我们要导入的包,都是hibernate下的包,防止导错。

使用hibernate完成一个CRUD

         我们要经常使用Session,而且Session是属于线程安全的,所以我们可以使用单例模式来减少对资源的消耗(hibernate中能减少资源消耗就减少资源的消耗,hibernate是一个比较大的开源框架)。所以我们写一个回去获取Session的工具类吧:HibernateUtil.java

         HibernateUtil.java:

package com.lzcc.hibernate.util;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.boot.registry.StandardServiceRegistry;

import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

import org.hibernate.cfg.Configuration;

 

public class HibernateUtil {

         private final static SessionFactory SESSIONFACTORY = getSessionFactory();

         /**

          * 获取SessionFactory对象

          * @return SessionFactory

          */

         private static SessionFactory getSessionFactory() {

                  Configuration cfg = new Configuration().configure();

                  StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();

                  SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);

                  return sessionFactory;

         }

        

         /**

          * 得到hibernate中session

          * @return Session

          */

         public static Session openSession() {

                  return SESSIONFACTORY.openSession();

         }

        

         /**

          * 关闭session

          * @param session

          */

         public static void closed(Session session) {

                  if (session != null) {

                          session.close();

                  }

         }

 

}

         创建一个单元测试类,来试试使用hibernate完成对一个对象的基本的增删改查吧:

TestCRUD.java:

package com.lzcc.hibernate.test;

 

import java.util.List;

 

import org.hibernate.Session;

import org.junit.Test;

 

import com.lzcc.hibernate.entity.User;

import com.lzcc.hibernate.util.DateUtil;

import com.lzcc.hibernate.util.HibernateUtil;

 

publicclass TestCRUD {

 

    @Test

    publicvoid testAdd() {

       Session session = null;

       try {

           session = HibernateUtil.openSession();

           session.beginTransaction();

           User u = new User("laomu", "123", "老牟", DateUtil.getDate("1986-12-23"));

           session.save(u);

           session.getTransaction().commit();

       } catch (Exception e) {

           e.printStackTrace();

           session.getTransaction().rollback();

       } finally {

           HibernateUtil.closed(session);

       }

    }

 

    @Test

    publicvoid testLoad() {

       Session session = null;

       try {

           /**

            * 注意:查询是没有事务控制的,不需要打开事务

            */

           session = HibernateUtil.openSession();

           User u = (User) session.load(User.class,5);

           System.out.println(u);

       } catch (Exception e) {

           e.printStackTrace();

        } finally {

           HibernateUtil.closed(session);

       }

    }

   

    @Test

    publicvoid testUpdate() {

       Session session = null;

       try {

           session = HibernateUtil.openSession();

           session.beginTransaction();

           User u = new User(4,"liujianhong", "2222", "刘帅哥", DateUtil.getDate("1990-12-23"));

           session.update(u);

           session.getTransaction().commit();

       } catch (Exception e) {

           e.printStackTrace();

           session.getTransaction().rollback();

       } finally {

           HibernateUtil.closed(session);

       }

    }

   

    @Test

    publicvoid testDelete() {

       Session session = null;

       try {

           session = HibernateUtil.openSession();

           session.beginTransaction();

           User u = new User();

           u.setId(5);

           session.delete(u);

           session.getTransaction().commit();

       } catch (Exception e) {

           e.printStackTrace();

           session.getTransaction().rollback();

       } finally {

           HibernateUtil.closed(session);

       }

    }

   

    @Test

    publicvoid testList() {

       Session session = null;

       try {

           /**

            * 注意:查询是没有事务控制的,不需要打开事务

            */

           session = HibernateUtil.openSession();

           //注意,这里我们需要使用HQL语句来完成查询,什么是HQL语句,我们在后面回学习,现在知道就行了

           //注意:这里使用了对象查询,不是表哦,认真看

           List<User> users = session.createQuery("from User").list();

           for (User u : users) {

              System.out.println(u);

           }

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           HibernateUtil.closed(session);

       }

    }

   

    @Test

    publicvoid testPageList() {

       Session session = null;

       try {

           /**

            * 注意:查询是没有事务控制的,不需要打开事务

            */

           session = HibernateUtil.openSession();

           //注意,这里我们需要使用HQL语句来完成查询,什么是HQL语句,我们在后面回学习,现在知道就行了

           //注意:这里使用了对象查询,不是表哦,认真看

           List<User> users = session.createQuery("from User").setFirstResult(2).setMaxResults(2).list();

           for (User u : users) {

              System.out.println(u);

           }

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           HibernateUtil.closed(session);

       }

    }

}

         通过对上面的学习,我们发现使用了hibernate以后,的确方便了很多,我们甚至都不需要些sql语句了,hibernate就是这么好用。

         但是我们前面又说了,在SSH三个框架中,hibernate是最难掌握的,为什么这么说呢?因为hibernate的创始人在开发hibernate的时候,考虑到了大量的效率问题,所以使得hibernate就异常的复杂难用,如果你不考虑效率问题,hibernate是最好用的(当然,这个基本不可能,现在的项目都是相当庞大的,效率永远是第一位的)。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值