一个Hibernate小程序
基本步骤
在前一篇博文Hibernate环境搭建中为大家详细的介绍如何搭建一个学习新类库的学习环境。今天,为大家带来一个Hibernate小例子,让大家能够快速上手。
步骤如下:
配置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核心接口和工作原理
一个Hibernate小程序的更多相关文章
- 手把手教你写一个RN小程序!
时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...
- 如何快速地开发一个微信小程序
如何快速地开发一个微信小程序呢?我觉得作为初学者,最好能有一个模板,然后改这个模板. 同样作为初学者,刚开始的时候我有下面的几个问题,后来通过问同学,我弄清楚了. 微信小程序可以连接MySQL或者Sq ...
- 第一个mpvue小程序开发总结
前言 说起小程序,其实在去年我都还只试着照着官方文档写过demo的,不过现在这家公司小程序做得比较多,我来之后也参与了几个小程序的开发了,最开始那几个是用的wepy,最近一个开始转用mpvue开发,最 ...
- 搭建Spring开发环境并编写第一个Spring小程序
搭建Spring开发环境并编写第一个Spring小程序 2015-05-27 0个评论 来源:茕夜 收藏 我要投稿 一.前面,我写了一篇Spring框架的基础知识文章,里面没 ...
- Day1:第一个python小程序
Day1:第一个python小程序与开发工具Pycharm 一.Hello World C:\Users\wenxh>python Python 3.6.2 (v3.6.2:5fd33b5, J ...
- 第一个servlet小程序
第一个servlet小程序 com.fry.servlet.HelloServlet package com.fry.servlet; import javax.servlet.ServletExce ...
- 一个支付宝小程序在一段时间内只能保留一个 WebSocket 连接
一个支付宝小程序在一段时间内只能保留一个 WebSocket 连接 my.connectSocket - 支付宝开放平台 https://opendocs.alipay.com/mini/api/vx ...
- 关于Hibernate的一个简单小程序
本人根据视频学习了一下三大框架中比较简单的一个Hibernate,并简单完成了一个运用Hibernate的小程序 Hibernate是一个简化web程序Dao层的一个框架,应用他,可以完全脱离sql语 ...
- 快速了解微信小程序的使用,一个根据小程序的框架开发的todos app
微信官方已经开放微信小程序的官方文档和开发者工具.前两天都是在看相关的新闻来了解小程序该如何开发,这两天官方的文档出来之后,赶紧翻看了几眼,重点了解了一下文档中框架与组件这两个部分,然后根据简易教程, ...
随机推荐
- 让USB键盘的LED灯听你的!(不干扰使用)
最近在研究一个课题,如何能利用键盘的led灯通道进行有效通信,那么首先要做的就是尝试能否在不影响键盘的情况下控制LED灯(num lock ,caps lock ,scroll lock)的使用. 首 ...
- 解决GDB输出Qt内置类型的显示问题
自从GDB 7.0之后,就加入了Pretty-Printer的这个概念.简单理解就是他可以让你用Python写一串脚本,然后让gdb去读取这串脚本后,可以自由的输出由你想自己定义的格式.我们直接举个简 ...
- 【JAVA集合】HashMap源码分析(转载)
原文出处:http://www.cnblogs.com/chenpi/p/5280304.html 以下内容基于jdk1.7.0_79源码: 什么是HashMap 基于哈希表的一个Map接口实现,存储 ...
- .net中String是引用类型还是值类型 以及 C#深层拷贝浅层拷贝
http://www.cnblogs.com/yank/archive/2011/10/24/2204145.html http://www.cnblogs.com/zwq194/archive/20 ...
- css3学习--css3动画详解二(3d效果)
一.设置3D场景 perspective:800 //浏览器到物体的距离(像素)perspective-origin:50% (x轴) 50% (y轴) //视点的位置 transf ...
- 学习hamcrest和mockito时的总结和demo
UT中需要的jar Junit4.1X.jar hamcrest-library-1.x.jar hamcrest-core-l.x.jar mockito-all-1.10.x.jar Junit ...
- OnClose()和 OnDestroy()
OnClose()和 OnDestroy() 基于对话框的MFC程序,发现每次程序退出时,托盘的小图标不能自动消失,鼠标移上去之后才能消失,比较不爽. 后来发现我删除这个图标的代码是在自己重写的OnC ...
- QNetworkRequest 请求类
QNetworkRequest Class Header: #include <QNetworkRequest>qmake: QT += networkSince: ...
- 使用python实现HMM
一直想用隐马可夫模型做图像识别,但是python的scikit-learn组件包的hmm module已经不再支持了,需要安装hmmlearn的组件,不过hmmlearn的多项式hmm每次出来的结果都 ...
- 一些有用的 Emacs 配置(窗口快速切换、一键透明效果、任意位置删除整行等)
本篇文章记录的是一些有用的 Emacs 配置,有些是自己原创,有些是借鉴别人(能记起来出处的我放了链接). 规定:C 代表 Ctrl,M 代表 Alt. 1.设置一次跳跃 n 行的快捷键 按 C-M- ...