Hibernate入门2.简单的项目开发实例
这一节通过一个简单的项目学习Hibernate项目的配置
代码下载 : 链接: http://pan.baidu.com/s/1zlgjl 密码: p348
1.配置Hibernate环境
下载Hibernate的jar,将必须的Hibernate核心类库加入到应用中。这些jar中hibernate3.jar是必需的核心类库文件,此外在lib中的是在hibernate中引用的包,可以有选择的添加。
创建Hibernate配置文件:配置文件主要用于配置和数据库相关的一些共有参数,比如数据库的URL、用户名、密码、是否创建或者更新表的信息,这些信息对于所有持久化类都是通用的。配置文件可以是hibernate.properties或者是hibernate.cfg.xml.两种方式任选其一或者是结合使用。实际开发的过程中,通常是使用XML文件配置的形式,并且将hibernate.cfg.xml配置文件放在类文件的根目录中。
我们查看XML方式配置的Hibernate文件
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.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test??useUnicode=true&characterEncoding=utf8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">221256</property>
<property name="hibernate.show_sql">true</property>
<!-- 注册所有的ORM映射文件 -->
<mapping resource="com/yang/model/mapper/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
上述配置信息中<hibernate-configuration>元素是hibernate配置文件的根元素,在这个根元素中有<session-factory>子元素,该子元素一次有多个<property>元素,这些事配置hibernate连接数据库的必要信息。在<session-factory>中可以有多个<maping>元素,每一个<mapper>指定一个ORM映射文件。
使用Eclipse开发Hibernate应用的时候,可以借助一些插件工具来生成部分嗲吗,如根据表生成POJO,或者是根据POJO生成配置文件、表。这些工具完成的功能仅仅是提高开发者的效率,而不能真正替代开发者去思考。学习框架的时候不推荐使用。
2.创建持久化类和ORM映射文件
持久化类和JavaBean差不多,不过如果有其他的非默认的构造函数的话,需要声明一个默认的构造函数,同时对于每一个属性添加getter和setter方法,建议将持久化类和器对应的ORM映射文件放在同一个目录。
对于映射文件,命名规范是ModelName.hbm.xml
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.yang.model.User" table="user">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="userName" column="username" type="string" not-null="true"/>
<property name="password" column="password" type="string" not-null="true"/>
</class>
</hibernate-mapping>
3.利用Configuration装载配置信息
每一个配置文件对应一个Configuration对象,代表一个应用程序导数据库的映射配置。根据Hibernate使用的配置文件的不同,创建Configuration对象的方式也是不同的。通常采用hibernat.cfg.xml作为hibernate的配置文件,然后根据配置文件出那个减Configuration对象:
//实例化Configuration
Configuration configuration = new Configuration();
//加载hibernate配置信息configuration.configure(ClassLoader.getSystemResource("hibernate.cfg.xml"));
Configuration对象的作用是读取配置文件并且创建SessionFactory对象。通常一个应用程序会创建一个Configuration,在创建唯一的SessionFactory实例。这就意味着Configuration对象只存在于系统的初始化阶段,然后所有的持久化操作都是通过SessionFactory实例来完成的。
4.利用SessionFactory创建Session
SessionFactory对象时Hibernate进行持久化的必须对象,该对象是整个数据库映射关系经过编译之后形成的内存镜像。Configuration对象提供一个buildSessionFactory,创建一个Sessionfactory实例,并且SessionFactory的实例是不可以改变的。
//创建Sessionfactory实例
SessionFactory sessionFactory = configuration.buildSessionFactory();
//Configuration对象会根据配置文件的内容创建SessionFactory实例,一旦构建完毕,他将包含配置信息,之后任何对于configuration实例的改变都不会影响到已经构建的sessionFactory实例。SessionFactory实例的作用是生成Session对象,调用Sessionfactory对象中的getCurrentSession()或是openSession()都会回的一个Session对象。
Session session= sessionFactory.openSession();
5.利用Session操作数据库
Session对象时Hibernate持久化操作的关键对象,是Hibernate持久化操作的基础,是应用程序和数据库之间交互的一个单线程对象。持久化对象的生命周期、事务管理、对象的查询、更新和删除都是通过Session实现的。Session对象封装了JDBC连接,本身就有一个一级的缓存,在显示执行flush方法之前,所有的持久化操作数据都是保存在Session对象的缓冲中。
Session中的接口方法:
save() 保存持久化对象,在数据库中增加一条记录
get() 获取数据库中的一条记录,如果没有找到符合条件的持久化对象的时候返回null
load()获取数据库中的一条记录,没有找到抛出异常(HibernateException),此外get是在Hibernate一级缓存中查询,找不到在去数据库中查找;而load是在一级缓存中找不到还会去二级缓存中查找,找不到的话再去数据库中查找。
update()更新数据库中对应的数据
delete()删除数据库中的一条对应的记录
6.Transaction事务管理机制
Transaction对象主要用于管理事务,所有持久化操作都需要在事务管理下进行。Transaction通过抽象将应用程序从底层的JDBC,JTA以及CORBA事务中隔离开,允许开发人员使用一个统一的事物操作让自己的项目可以在不同的环境和容器之间迁移。
通过Session中的beginTransaction()方法获得一个Transaction对象实例
Transaction接口中的方法主要是
commit():提交事务
rollback()回滚事务
Transaction trans = session.beginTransaction();
//多个持久化操作
。。。。
//提交事务
trans.commit();
第一次执行,如果数据库中没有该表。那么Hibernate会根据配置文件和映射文件的信息自动生成一个对应的表,以后再次执行更新的时候也会更新对应的表,因为在配置文件中添加了
<property name=”hibernate.hbm2ddl.auto” >update</property>
整理代码:
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.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test??useUnicode=true&characterEncoding=utf8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">221256</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 注册所有的ORM映射文件 -->
<mapping resource="com/yang/model/mapper/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
User.java
package com.yang.model;
public class User {
private int id;
private String userName;
private String password;
public User(){}
public User(String userName, String password){
this.userName = userName;
this.password = password;
}
//属性的getter & setter 方法
public int getId(){ return this.id; }
public void setId(int id){ this.id= id;}
public String getUserName(){ return this.userName;}
public void setUserName(String userName){this.userName = userName;}
public String getPassword(){return this.password;}
public void setPassword(String password){ this.password = password;}
}
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.yang.model.User" table="user">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="userName" column="username" type="string" not-null="true"/>
<property name="password" column="password" type="string" not-null="true"/>
</class>
</hibernate-mapping>
TestMain.java
package com.yang.main;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.yang.model.User;
public class TeatMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
User user = new User("liang","huihui");
//实例化Configuration
Configuration configuration = new Configuration();
//加载hibernate配置信息
configuration.configure(ClassLoader.getSystemResource("hibernate.cfg.xml"));
//创建Sessionfactory实例
SessionFactory sessionFactory = configuration.buildSessionFactory();
//Configuration对象会根据配置文件的内容创建SessionFactory实例,一旦构建完毕,他将包含配置信息,之后任何对于configuration实例的改变都不会影响到已经构建的sessionFactory实例
Session session= sessionFactory.openSession();
Transaction trans = session.beginTransaction();
session.save(user);
trans.commit();
session.close();
}
}
7.利用Query进行HQL查询
Query可以使用HQL、SQL等语句查询数据库中的数据,HQL(Hibernate Query Language)是面相对象的查询语言,有以下特点:
支持各种条件查询、连接查询、子查询
支持分页、分组查询;纸质各种聚集函数和自定义函数;支持动态绑定查询函数。
Query query=session.createQuery(“from User”);
其中的参数是HQL语句,表示读取的是User类型的对象,将User对应的表中的数据封装成为User对象到List集合中。
Query query = session.createQuery("from User");
List<User> listUsers = query.list();
for(User user: listUsers){
System.out.println(user);
}
当然这里只是简单地HQL语句,会有更加详细的关于HQL语句的学习。
8利用Criteria进行条件查询
这个Criteria和query十分相似,他是通过Session对象的createCriteria()方法创建的
Criteria criteria = session.createCriteria(User.class);
YangTengfei
2013.11.27
Hibernate入门2.简单的项目开发实例的更多相关文章
-
如何实现从Java入门到服务端项目开发的进阶?
对于打算入门或者刚刚入门学习Java的人来说,刚开始接触这门学科,往往会觉得不知所措,也会觉得很迷茫.结合前人经验,就从入门到进阶对于Java的学习而言,应该对于学习时间.目标和内容规划有一个清晰的定 ...
-
走进JavaWeb技术世界13:Hibernate入门经典与注解式开发
原文地址:Hibernate入门这一篇就够了 前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate ...
-
vuejs2从入门到精通与项目开发实战
vuejs2从入门到精通:一.基础部分0.课件1.介绍2.vue实例3.模板语法4.计算属性和观察者5.Class与Style绑定6.条件渲染7.列表渲染8.事件处理9.表单输入绑定10.1.组件(1 ...
-
WCF揭秘(一)——简单的WCF开发实例
一.WCF是什么 WCF是微软为了实现各个开发平台之间的无疑缝连接而开发一种崭新工具,它是为分布式处理而开发.WCF将DCOM.Remoting.Web Service.WSE.MSMQ.AJAX服务 ...
-
迅为iTOP-4412物联网开发板入门学习高手进阶项目开发超树莓派
免费视频教程: 为初学者精心录制的整套视频教程全部免费,随IT技术发展而不断增添的视频教程仍然免费!一支有经验的工程师团队会始终成为您的后盾. 项目实战---全开源: 手机远程控制开发板 门禁系统 W ...
-
Django项目开发实例之我的博客
1.开发环境 2.创建virtualenv 3.安装相关包 Django Pillow 4.创建项目 添加应用: 5.设置静态文件和模板 6.运行测试 参考(http://www.cnblogs.co ...
-
详谈 Unity3D AssetBundle 资源加载,结合实际项目开发实例
第一次搞资源更新方面,这里只说更新,加载,AssetBundle资源加载,谈谈自己的理解,以及自己在项目中遇到的那些神坑,现在回想一下,真的是自己跪着过来的,说多了,都是泪. 我这边是安卓AssetB ...
-
Newbe.Claptrap 框架入门,第二步 —— 创建项目
接上一篇 Newbe.Claptrap 框架入门,第一步 -- 开发环境准备 ,我们继续了解如何创建一个 Newbe.Claptrap 项目. Newbe.Claptrap 是一个用于轻松应对并发问题 ...
-
浅谈hibernate+入门实例
Hibernate是对jdbc进一步的封装,随着项目的开展,小编开始接触到这个概念,一开始接触的时候并没有觉得hibernate有多神秘,没有进一步的研究,只是简单的知道她是对jdbc的进一步的封装, ...
随机推荐
-
python征程1.2(初识python)
1.操作符. 和其他绝大多数语言一样,Python的算术操作符以你熟悉的方式工作. “+,—,×,/,//,%,**,” 注意:python有两种除法操作符(1)单斜杠用以传统除法,(2)双斜杠用以浮 ...
-
web项目中的跨域问题解决方法
一种是JSONP 一种是 CORS. 在客户端Javascript调用服务端接口的时候,如果需要支持跨域的话,需要服务端支持. JSONP的方式就是服务端对返回的值进行回调函数包装,他的优点是支持众多 ...
-
SVG基础图形与参数
SVG是什么 SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用来定义WEB上使用的矢量图 SVG 使用 XML 格式定义图形 SVG 图像在缩放时其图形质量不 ...
-
jquery学习笔记---jquery插件开发
http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html jquery插件开发:http://www.cnblogs.com/damonla ...
-
React Native微信分享 朋友圈分享 Android/iOS 通用
超详细React Native实现微信好友/朋友圈分享功能-Android/iOS双平台通用 2016/06/16 | React Native技术文章 | Sky丶清| 暂无评论 | 1 ...
-
RAR暴破
1. 网上稍微搜索了一下,貌似一个叫 "ARPR"的软件 出现的频率较高. 2. http://jingyan.baidu.com/article/a948d651b954a90a ...
-
客户端服务端通信protocol
这个协议不知我在上面耗费了多长时间,也有人问过我咋回事,这个protocol不长,但对于我来说理解起来很费劲,今天回来看看忽然看懂了(80%),只能说不知看了多少遍 其实这些东西应该在来的一个月这样子 ...
-
BZOJ 1018 [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2247 Solved: 706[Submit ...
-
IQC,QA,FQC,OQC,IPQC的定义与职责
进货检验员(IQC):CLInetLabIQC(以下简称IQC)是CLInet在多年开发维护EQA(实验室间质量评价)系统后,成功开发的一套完善的实验室内部的质量评价.质量控制的软件.它不仅包含了每家 ...
-
javaWeb开发中关于eclipse等ide重新部署或重启项目等原因造成上传文件丢失问题解决方案
在开发项目时,有时候需要用到上传功能,比如头像上传等,其文件会保存到服务器中.但是我发现在用eclipse做项目的过程中,每次重新部署项目,原来上传的文件就会丢失. 其原因是因为每次项目修改后,ecl ...