您的位置:首页 > 其它

Hibernate 学习记录

2014-10-17 20:41 267 查看
当我们是使用框架时,我们希望事情能够变更简单。

编码能够变得更简洁,更酷。

所以,我们使用 Hibernate 来简化对数据库的操作。

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/

这是 Hibernate 的官方文档,目录就长的让人望而却步。

在学习新事物的时候,往往会困惑,需要啃完整本书或文档才开始干活吗?

No No No,真的啃完人都七老八十了,



如果真要看完这个文档,Hibernate 是来帮倒忙的了。

http://hibernate.org/orm/downloads/

下载最新的 Hibernate,目前的版本是 4.3.6。



把 required 目录中的包添加到依赖中,然后把 jdbc 驱动包也添加到依赖中。

然后,我们写一个配置文件,hibernate.cfg.xml。

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- Enable Hibernate's automatic session context management --> 
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="show_sql">true</property>
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/gt?characterEncoding=utf8</property>
        <property name="connection.username">root</property>
        <property name="connection.password">rrrjjj</property>

        <mapping class="model.Husband"/>
    </session-factory>
</hibernate-configuration>


逐条解释下,

使得可以使用 getCurrentSession 方法,简化对 Session 的管理。

显示 sql 语句,方便分析。

方言,拿 MySQL 来举例,MySQL 实现的引擎不只一种,哪种引擎就选哪种方言。

驱动,地址,用户名,密码。

需要映射的类的声明。

这个配置文件要放在 src 目录下。

然后来看看简单的实体类 Husband:

package model;

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "husband")
public class Husband extends BaseEntity {

    private String name;

    public Husband() {
    }

    public Husband(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}


Hibernate 需要实体类保留无参数构造函数,所以得这么写。

然后看下 HibernateUtil 类:

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }

    private static SessionFactory buildSessionFactory() {

        Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
        StandardServiceRegistryBuilder standardServiceRegistryBuilder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
        StandardServiceRegistry standardServiceRegistry = standardServiceRegistryBuilder.build();
        return configuration.buildSessionFactory(standardServiceRegistry);
    }

    public static void saveOrUpdateEntity(BaseEntity baseEntity) {

        Session session = getCurrentSession();
        session.beginTransaction();
        if (baseEntity.getObjectId() == null) {
            baseEntity.setObjectId(UUID.randomUUID().toString());
        }
        session.saveOrUpdate(baseEntity);
        session.getTransaction().commit();
    }

    public static void close(){

        sessionFactory.close();
    }
}


最后,如何保存一个对象。

public static void main(final String[] args) throws Exception {

        HibernateUtil.saveOrUpdateEntity(new Husband("李顺生"));
        HibernateUtil.close();
}


很酷吧,只要一句话,简单明了。

saveOrUpdate 这个方法会检查下表中是否存在该 objectId,存在则 update,反之则 save。

所以在执行插入和更改语句前,会先执行查询一句。

而 close 语句,好像是清理连接池的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: