zoukankan      html  css  js  c++  java
  • 一个Hibernate小程序

    基本步骤

    在前一篇博文Hibernate环境搭建中为大家详细的介绍如何搭建一个学习新类库的学习环境。今天,为大家带来一个Hibernate小例子,让大家能够快速上手。

    步骤如下:

    1.配置hibernate.cfg.xml

    2.编写映射文件User.hbm.xml

    3.编写一个持久化类User.java

    4.编写辅助类HibernateUtil.java

    5.加载并存储对象UserManager.java

    配置Hibernate.cfg.xml

    a、在新建的XHibernate项目的src目录下新建Hibernate配置文件hibernate.cfg.xml。

    b、将下面内容复制到新建的文件中,注意更改数据库连接的设置。其他不用动。

    hibernate.cfg.xml(路径是src/hibernate.cfg.xml)

    <?xml version='1.0' encoding='utf-8'?>
    <!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>
            <!-- Database connection settings -->
            <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
            <property name="connection.username">root</property>
            <property name="connection.password">klguang@mysql</property>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    
            <!-- SQL dialect -->
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <!-- JDBC connection pool (use the built-in) -->
            <property name="connection.pool_size">10</property>
            <!-- Enable Hibernate's automatic session context management -->
            <property name="current_session_context_class">thread</property>
            <!-- Disable the second-level cache -->
            <property name="cache.provider_class">
                org.hibernate.cache.NoCacheProvider
            </property>
            <!-- Echo all executed SQL to stdout -->
            <property name="show_sql">true</property>
            <!-- Drop and re-create the database schema on startup -->
            <property name="hbm2ddl.auto">update</property>
            <property name="javax.persistence.validation.mode">none</property>
            <mapping resource="User.hbm.xml" />    
        </session-factory>
    </hibernate-configuration>
    
    

    解释:

    1.映射文件的路径

    <mapping resource="User.hbm.xml"/>

    2.实现自动建表:在Hibernate启动时删除并重新创建数据库架构。

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

    其中value的值如下:

    create:表示启动的时候先drop,再create

    create-drop: 也表示创建,只不过再系统关闭前执行一下drop

    update: 这个操作启动的时候会去检查schema是否一致,如果不一致会做scheme更新

    validate: 启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新

    如果没做配置,那么就需要在数据库中手动建表。

    3.数据库连接方言

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

    4.输出sql语句是必须的。

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

    5.使用Hibernate内建的连接池,并设置最大连接数为10

    <property name="connection.pool_size">10</property>

    6.javax.persistence.validation.mode默认情况下是auto的,就是说如果不设置的话它是会自动去你classpath下面找一个bean-validation**包,但是找不到,就会报错误。

    <property name="javax.persistence.validation.mode">none</property>

    7.禁止二级缓存。

    <property name="cache.provider_class"> 
        org.hibernate.cache.NoCacheProvider 
    </property>

    编写映射文件User.hbm.xml

    Hibernate 需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是 Hibernate 映射文件发挥作用的地方。

    <hibernate mapping package="映射的实体的包">

    其根元素是hibernate-mapping,通过属性package指定类所在的包。映射文件告诉 Hibernate 它应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。

    注意 Hibernate 的 DTD 是非常复杂的。你的编辑器或者 IDE 里使用它来自动完成那些用来映射的 XML 元素(element)和属性(attribute)。

    User.hbm.xml(路径是src/User.hbm.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="test"> 
        <class name="User" table="user">
            <id name="ID" column="ID">
                <generator class="native" />
            </id>
            <property name="name" />
            <property name="passwd" />
        </class>
    </hibernate-mapping>

    编写一个持久化类User.java

    在项目中新建一个包test,并编写一个持久化类User.java。

    通过IDE的getter and setter可快速生成。在myeclipse中使用快捷键的方法是

    ALT + SHIFT + S让后按下键盘上的r键。在使用ALT + A 表示选择所有的属性都生成getter、setter方法。最后回车。

    User.java(路径是src/test/User.java)

    package test; 
    
    public class User {
        int ID;
        String name;
        String passwd;
        public int getID() {
            return ID;
        }
        public void setID(int iD) {
            ID = iD;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPasswd() {
            return passwd;
        }
        public void setPasswd(String passwd) {
            this.passwd = passwd;
        }
    }

    编写辅助类HibernateUtil.java

    我们必须启动 Hibernate,此过程包括创建一个全局的 SessoinFactory。SessionFactory 可以创建并打开新的 Session。一个 Session 代表一个单线程的单元操作,org.hibernate.SessionFactory 则是个线程安全的全局对象,只需要被实例化一次。单例模式

    src目录下新建一个utils包,并new一个java类

    HibernateUtil.java(路径是src/utils/HibernateUtil.java)

    package utils;
    
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtil {
        private static final SessionFactory sessionFactory = buildSessionFactory();
    
        private static SessionFactory buildSessionFactory() {
            try {
                // 根据配置文件hibernate.cfg.xml创建一个SessionFactory对象
                return new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();
            } catch (Throwable ex) {
                // 确保异常被打印并被你看到
                System.err.println("Initial SessionFactory creation failed." + ex);
                throw new ExceptionInInitializerError(ex);
            }
        }
    
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    }

    加载并存储对象UserManager.java

    现在是时候看看效果了,让我们试着向数据中存储一个User对象。

    UserManager.java(路径是src/test/UserManager.java)

    package test;
    
    import org.hibernate.Session;
    
    import utils.HibernateUtil;
    
    public class UserManager {
        public static void main(String args[]) {
            createAndStoreUser("hibernate","hibernate");
        }
    
        private static void createAndStoreUser(String name, String passwd) {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            User user = new User();
            user.setName(name);
            user.setPasswd(passwd);
            session.save(user);
            session.getTransaction().commit();
        }
    }

    运行结果,控制台输出sql,恭喜你,成功了!

    Hibernate: insert into user (name, passwd) values (?, ?)

    关于getCurrentSession()

    1、getCurrentSession()与openSession()的区别?

    * 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()

    创建的session则不会

    * 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()

    创建的session必须手动关闭

    2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:

    * 如果使用的是本地事务(jdbc事务)

    <property name="hibernate.current_session_context_class">thread</property>

    * 如果使用的是全局事务(jta事务)

    <property name="hibernate.current_session_context_class">jta</property>

    Hibernate运行过程

    我们可以查看控制台输出的日志信息,并了解其运行的过程。

    1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件

    2.由hibernate.cfg.xml中的<mappingresource="User.hbm.xml"/>读取并解析映射信息

    4.连接数据库,并根据映射文件更新数据库

    5.通过config.buildSessionFactory();//创建SessionFactory

    6.sessionFactory.openSession();//打开Sesssion

    7.session.beginTransaction();//创建事务Transation

    8.persistent operate持久化操作 //一般指Save这个方法

    9.session.getTransaction().commit();//提交事务

    10.关闭Session

    11.关闭SesstionFactory

    参考

    1.Hibernate官方文档

    2.Hibernate详解(5)——Hibernate核心接口和工作原理

  • 相关阅读:
    2014年终总结
    杭电2014——青年歌手大奖赛_评委会打分
    nyoj---t448(寻找最大数)
    nyoj_t218(Dinner)
    将string转换成char*
    nyoj71--独木舟上的旅行
    基于贪心算法的几类区间覆盖问题
    会场安排问题—NYOJ14
    南阳理工ACM——106背包问题
    南阳理工91——阶乘之和
  • 原文地址:https://www.cnblogs.com/klguang/p/4764287.html
Copyright © 2011-2022 走看看