基本步骤

在前一篇博文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)

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <!-- Database connection settings -->
  8. <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
  9. <property name="connection.username">root</property>
  10. <property name="connection.password">klguang@mysql</property>
  11. <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  12.  
  13. <!-- SQL dialect -->
  14. <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  15. <!-- JDBC connection pool (use the built-in) -->
  16. <property name="connection.pool_size">10</property>
  17. <!-- Enable Hibernate's automatic session context management -->
  18. <property name="current_session_context_class">thread</property>
  19. <!-- Disable the second-level cache -->
  20. <property name="cache.provider_class">
  21. org.hibernate.cache.NoCacheProvider
  22. </property>
  23. <!-- Echo all executed SQL to stdout -->
  24. <property name="show_sql">true</property>
  25. <!-- Drop and re-create the database schema on startup -->
  26. <property name="hbm2ddl.auto">update</property>
  27. <property name="javax.persistence.validation.mode">none</property>
  28. <mapping resource="User.hbm.xml" />
  29. </session-factory>
  30. </hibernate-configuration>

解释:

1.映射文件的路径

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

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

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

其中value的值如下:

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

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

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

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

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

3.数据库连接方言

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

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

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

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

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

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

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

7.禁止二级缓存。

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

编写映射文件User.hbm.xml

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

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

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

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="test">
  6. <class name="User" table="user">
  7. <id name="ID" column="ID">
  8. <generator class="native" />
  9. </id>
  10. <property name="name" />
  11. <property name="passwd" />
  12. </class>
  13. </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)

  1. package test;
  2.  
  3. public class User {
  4. int ID;
  5. String name;
  6. String passwd;
  7. public int getID() {
  8. return ID;
  9. }
  10. public void setID(int iD) {
  11. ID = iD;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getPasswd() {
  20. return passwd;
  21. }
  22. public void setPasswd(String passwd) {
  23. this.passwd = passwd;
  24. }
  25. }

编写辅助类HibernateUtil.java

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

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

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

  1. package utils;
  2.  
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.cfg.Configuration;
  5.  
  6. public class HibernateUtil {
  7. private static final SessionFactory sessionFactory = buildSessionFactory();
  8.  
  9. private static SessionFactory buildSessionFactory() {
  10. try {
  11. // 根据配置文件hibernate.cfg.xml创建一个SessionFactory对象
  12. return new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();
  13. } catch (Throwable ex) {
  14. // 确保异常被打印并被你看到
  15. System.err.println("Initial SessionFactory creation failed." + ex);
  16. throw new ExceptionInInitializerError(ex);
  17. }
  18. }
  19.  
  20. public static SessionFactory getSessionFactory() {
  21. return sessionFactory;
  22. }
  23. }

加载并存储对象UserManager.java

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

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

  1. package test;
  2.  
  3. import org.hibernate.Session;
  4.  
  5. import utils.HibernateUtil;
  6.  
  7. public class UserManager {
  8. public static void main(String args[]) {
  9. createAndStoreUser("hibernate","hibernate");
  10. }
  11.  
  12. private static void createAndStoreUser(String name, String passwd) {
  13. Session session = HibernateUtil.getSessionFactory().getCurrentSession();
  14. session.beginTransaction();
  15. User user = new User();
  16. user.setName(name);
  17. user.setPasswd(passwd);
  18. session.save(user);
  19. session.getTransaction().commit();
  20. }
  21. }

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

  1. 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事务)

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

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

  1. <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核心接口和工作原理

一个Hibernate小程序的更多相关文章

  1. 手把手教你写一个RN小程序!

    时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...

  2. 如何快速地开发一个微信小程序

    如何快速地开发一个微信小程序呢?我觉得作为初学者,最好能有一个模板,然后改这个模板. 同样作为初学者,刚开始的时候我有下面的几个问题,后来通过问同学,我弄清楚了. 微信小程序可以连接MySQL或者Sq ...

  3. 第一个mpvue小程序开发总结

    前言 说起小程序,其实在去年我都还只试着照着官方文档写过demo的,不过现在这家公司小程序做得比较多,我来之后也参与了几个小程序的开发了,最开始那几个是用的wepy,最近一个开始转用mpvue开发,最 ...

  4. 搭建Spring开发环境并编写第一个Spring小程序

    搭建Spring开发环境并编写第一个Spring小程序 2015-05-27      0个评论    来源:茕夜   收藏    我要投稿 一.前面,我写了一篇Spring框架的基础知识文章,里面没 ...

  5. Day1:第一个python小程序

    Day1:第一个python小程序与开发工具Pycharm 一.Hello World C:\Users\wenxh>python Python 3.6.2 (v3.6.2:5fd33b5, J ...

  6. 第一个servlet小程序

    第一个servlet小程序 com.fry.servlet.HelloServlet package com.fry.servlet; import javax.servlet.ServletExce ...

  7. 一个支付宝小程序在一段时间内只能保留一个 WebSocket 连接

    一个支付宝小程序在一段时间内只能保留一个 WebSocket 连接 my.connectSocket - 支付宝开放平台 https://opendocs.alipay.com/mini/api/vx ...

  8. 关于Hibernate的一个简单小程序

    本人根据视频学习了一下三大框架中比较简单的一个Hibernate,并简单完成了一个运用Hibernate的小程序 Hibernate是一个简化web程序Dao层的一个框架,应用他,可以完全脱离sql语 ...

  9. 快速了解微信小程序的使用,一个根据小程序的框架开发的todos app

    微信官方已经开放微信小程序的官方文档和开发者工具.前两天都是在看相关的新闻来了解小程序该如何开发,这两天官方的文档出来之后,赶紧翻看了几眼,重点了解了一下文档中框架与组件这两个部分,然后根据简易教程, ...

随机推荐

  1. php文件锁(转)

    bool flock ( int handle, int operation [, int &wouldblock] );flock() 操作的 handle 必须是一个已经打开的文件指针.o ...

  2. android入门到熟练(二)----活动

    1.活动创建对于每一个后端java类(继承至Activity或者ActionBarActivity)代码都有一个方法需要被重写[onCreate], 在此方法中可以加载界面资源文件或者绑定元素事件. ...

  3. session与cookie的区别,有哪些不同之处

    session与cookie的区别,根据自己的理解总结如下: (1)cookie是一种客户端的状态管理技术,将状态写在 浏览器端,而session是一种服务器端的状态管理技术,将 状态写在web服务器 ...

  4. 【python】闰年规则

    公历闰年判定遵循的规律为: 四年一闰,百年不闰,四百年再闰. 公历闰年的简单计算方法(符合以下条件之一的年份即为闰年)1.能被4整除而不能被100整除.2.能被400整除.

  5. 鸟哥的linux私房菜——第20章 启动流程、模块管理与loader

    20.1 Linux启动流程分析 Linux启动过程: 按下开机电源后计算机硬件主动读取BIOS来加载硬件信息以及硬件系统的自我测试,之后系统会主动读取第一个可启动的设备(由BIOS设置),此时就可以 ...

  6. Android计量单位px,in,mm,pt,dp,dip,sp和获取屏幕尺寸与密度

    ###########################################Android计量单位########################################### px ...

  7. Contest20140711 loop 数论

    loop|loop.in|loop.out 题目描述: 有N个点. 现在重复这样的操作: 随机找一个出度为0的点p1,随机找一个入度为0的点p2,连一条有向边从p1指向p2.直到没有出度为0的点. 统 ...

  8. iOS便捷开发工具分享

    项目/代码优化工具 1.objec_dep,可以了解项目中各个类的关联信息,了解项目中无效文件,知道双向应用的文件. 下载地址: https://github.com/nst/objc_dep 2.b ...

  9. ios7新特性1-UI变化、UIKit动态行为支持与Text Kit新接口

    iOS 7.0新特性1 iOS 7的UI经过了重新设计.另外,iOS7中引入了新的动画系统,便于创建2D和2.5D的游戏.多任务支持提升,点对点通讯以及其他重要的特征使iOS7相对于以往的SDK来说发 ...

  10. Fibonacci Tree

    hdu4786:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:给你一个无向图,然后其中有的边是白色的有的边是黑色的.然后问你是否存在一棵生成树,在 ...