Hibernate5配置与使用详解

转载请注明出处:http://blog.csdn.net/tyhj_sf/article/details/51851163

引言

Hibernate是一个轻量级的持久层开源框架,它是连接java应用程序和关系数据库的中间件,负责java对象和关于Hibernate内部对JDBC API进行封装,负责java对象的持久化。因为他封装了所有的数据访问细节,使的业务逻辑层开发专注于实现,它是一种优秀的ORM映射工具,提供了完善的对象–关系映射服务,开发过程不依赖容器,灵活性非常大,开源无缝集成到任何一个java系统中。

Hibernate5配置

版本

这里写图片描述
这里是下载地址:http://hibernate.org/orm/
涉及到访问数据库还需要数据库驱动器相关的jar包:
这里写图片描述

搭建使用hibernate的开发环境

你可以创建一个Java project或者一个web project。以上的方式创建的项目均可测试hibernate环境。
本次以创建一个web工程的方式演示搭建开发环境的详细步骤。
1)创建一个web项目。
这里写图片描述
2)将相关hibernate的包和数据库驱动器的包导入到如下图路径:
这里写图片描述
注意:hibernate的jar包,选择如下指定路径下的全部jar将其导入。
这里写图片描述

3)(在线安装eclipse的插件:hibernate tools,方便编辑”.cfg.xml”和“hbm.xml”格式的文件。安装方法若不熟可自行Google或百度,非本文重点,不再细说。)
在src文件夹创建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"> 

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hb</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <mapping resource="com/example/domain/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

上面这个配置文件主要是数据库连接的相关配置,只要配置成你自己的数据库设置即可。
对于这个maping属性:

<mapping resource="com/example/domain/User.hbm.xml"/>

在你创建完下面的步骤 4和5后,就可以补上,如果有多个javabean类及对应的 **.hbm.xml文件,就需要添加多个这样的maping属性。

4)创建你的项目中的javabean类,如User.java

public class User implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 2015771159L;

//  @Id
//  @Basic(fetch=FetchType.EAGER)
//  @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
//  @Basic(fetch=FetchType.LAZY)
//  @Column(length=50)
    private String emailName;
//  @Basic(fetch=FetchType.LAZY)
//  @Column(length=50)
    private String emailPassword;

    public User() {
        // TODO Auto-generated constructor stub
    }

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getEmailName() {
        return emailName;
    }
    public void setEmailName(String emailName) {
        this.emailName = emailName;
    }
    public String getEmailPassword() {
        return emailPassword;
    }
    public void setEmailPassword(String emailPassword) {
        this.emailPassword = emailPassword;
    }
    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }

    @Override
    public boolean equals(Object o) {
        if ( this == o ) {
            return true;
        }
        if ( !( o instanceof User ) ) {
            return false;
        }

        if ( id == null ) {
            return false;
        }

        return id.equals( ((User) o).id );
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return super.toString()+"[id="+id+"EmailName="+emailName+"EmailPassword="+emailPassword+"]";
    }

5)编写数据库表及字段到javabean类User的映射文件。这个例子中必须创建为文件名:User.hbm.xml,可以放User类所在包中。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-7-8 1:31:59 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
 <class name="com.example.domain.User" table="USER">
  <id name="id" type="java.lang.Long">
   <column name="ID" not-null="true"/>
   <generator class="increment"/>
  </id>
  <property generated="never" lazy="false" name="emailName" type="java.lang.String">
   <column length="50" name="EMAILNAME" not-null="false"/>
  </property>
  <property generated="never" lazy="false" name="emailPassword" type="java.lang.String">
   <column name="EMAILPASSWORD"/>
  </property>
 </class>
</hibernate-mapping>

Hibernate5的使用

接着上述的几节内容,我来说说做关键部分,hibernate的使用。这一部分我建议看看hibernate的官方文档,毕竟网上的例子各种hibernate版本的例子都有,不同版本提供的接口不同,使用方法也有很多区别,而且最新的hibernate版本的使用demo很难找到。

基本使用思路

**在使用Hibernate执行持久化操作前,需要得到一个Session对象。有了Session对象,就可以以面向对象的方式保存、获取、更新和删除对象。
Session对象可以通过SessionFactory(会话工厂类)的openSession方法来获得。
因此还需要获取SessionFactory对象**,它通过如下方式获得:

final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()  
            .configure() // 默认使用src文件夹下的hibernate.cfg.xml进行配置,若更改了路径,要附加上包路径如:"/com/example/hibernate.cfg.xml" 
            .build();  
    try {  
        sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();  
    }  
    catch (Exception e) {  
        StandardServiceRegistryBuilder.destroy( registry );  
    } 

或者通过如下方式获得:

Configuration configuration = new Configuration();// 默认使用src文件夹下的hibernate.cfg.xml进行配置,若更改了路径,要附加上包路径如:"/com/example/hibernate.cfg.xml" 
        SessionFactory sf = configuration.configure().buildSessionFactory();
        Session session = sf.openSession();

使用Junit测试搭建的hibernate开发环境

注意测试function中示范了hibernate的使用方法,这可以用在实际的开发项目中。
Userdao.java的完整源码:

public class UserDao {

    public UserDao() {
        // TODO Auto-generated constructor stub
    }
    public static SessionFactory getSessionFactoryInstance(){
        if (sessionFactory==null) {
            synchronized (SessionFactory.class) {
                if (sessionFactory==null){
                    config=new Configuration().configure("me/seekout/wanlizhuizong/hibernate.cfg.xml");//若不指定,默认在目录src下
                    //使用默认配合文件,hibernate.cfg.xml
                    return config.buildSessionFactory();
                    //第二种写法;
//                  StandardServiceRegistry standardServiceRegistry=new StandardServiceRegistryBuilder().configure("me/seekout/wanlizhuizong/hibernate.cfg.xml").build();
//                  Metadata metadata = new MetadataSources( standardServiceRegistry ).getMetadataBuilder().applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE).build();
//                  return metadata.getSessionFactoryBuilder().build();

                }
            }
        }
        return sessionFactory;
    }

    /**
     * @param id
     * @return
     * @throws Exception
     */
    public User queryById(long id) throws Exception {
        SessionFactory sessionFactory = HibernateConfigContext
                .getSessionFactoryInstance();
        Session session = sessionFactory.openSession();
        Transaction transaction = null;
        User user = null;
        try {
            transaction = session.beginTransaction();
            user = (User) session.get(User.class, id);
            transaction.commit();
        } catch (Exception e) {
            // TODO: handle exception
            if (transaction != null) {
                transaction.rollback();
            }
            throw e;
        } finally {
            session.close();
            sessionFactory.close();
        }

        return user;
    }

    /**
     * @param user
     *            首次保存会生成id
     * @throws Exception
     */
    public void save(User user) throws Exception {
        System.out.println("保存User数据");
        SessionFactory sessionFactory = HibernateConfigContext
                .getSessionFactoryInstance();
        Session session = sessionFactory.openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.save(user);
            transaction.commit();
        } catch (Exception e) {
            // TODO: handle exception
            if (transaction != null) {
                transaction.rollback();
            }
            throw e;
        } finally {
            session.close();
            sessionFactory.close();
        }
    }

    /**
     * @param user
     *            已知id的User实例。
     * @throws Exception
     */
    public void update(User user) throws Exception {
        SessionFactory sessionFactory = HibernateConfigContext
                .getSessionFactoryInstance();
        Session session = sessionFactory.openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.update(user);
            transaction.commit();
        } catch (Exception e) {
            // TODO: handle exception
            if (transaction != null) {
                transaction.rollback();
            }
            throw e;
        } finally {
            session.close();
            sessionFactory.close();
        }
    }

    /**
     * @param user
     *            要删除的user,已经保存到数据库的,id分配
     * @throws Exception
     */
    public void delete(User user) throws Exception {
        SessionFactory sessionFactory = HibernateConfigContext
                .getSessionFactoryInstance();
        Session session = sessionFactory.openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.delete("User", user);
            transaction.commit();
        } catch (Exception e) {
            // TODO: handle exception
            if (transaction != null) {
                transaction.rollback();
            }
            throw e;
        } finally {
            session.close();
            sessionFactory.close();
        }
    }

}

Junit测试程序:

public class UserTest extends TestCase {

    public UserTest(String name) {
        super(name);
    }

    protected void setUp() throws Exception {
        super.setUp();
    }

    protected void tearDown() throws Exception {
        super.tearDown();
    }


    public void testSave() {
        UserDao userDao=new UserDao();
        User user=new User();
        user.setEmailName("tyhj_sf@163.com");
        user.setEmailPassword("ty123456789");
        try {
            userDao.save(user);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void testQueryById() {
        UserDao userDao=new UserDao();
        User user=new User();
        user.setId(1L);
        user.setEmailName("tyhj_sf@163.com");
        user.setEmailPassword("ty123456789");
        try {
            assertEquals(user,userDao.queryById(1));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    public void testUpdate() {
        UserDao userDao=new UserDao();
        User user=new User();
        user.setId(1L);
        user.setEmailName("tyhj_sf@163.com");
        user.setEmailPassword("aaasss");
        try {
            userDao.update(user);
            assertEquals(user,userDao.queryById(1));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void testDelete() {
        UserDao userDao=new UserDao();
        User user=new User();
        user.setId(1L);
        user.setEmailName("tyhj_sf@163.com");
        user.setEmailPassword("aaasss");
        try {
            userDao.delete(user);
            assertNull(userDao.queryById(1));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

更多的数据库其他操作参照上面的测试用例写即可。Session类提供了大量方便的操作方法接口,可以参考javadoc文档使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值