Hibernate入门2.简单的项目开发实例
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服务 ...
- Qt项目开发实例 (含源码)
源码传送门: 啊渊 / QT博客案例 · GitCode 目前QT的研发都是基于windows操作系统的,本文分享在国产操作系统中学QT的路线图,其实学习路线差不多,为了全面的回顾自己的学习知识,打算 ...
- 迅为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 是一个用于轻松应对并发问题 ...
随机推荐
- 【Python学习 】Python实现的FTP上传和下载功能
一.背景 最近公司的一些自动化操作需要使用Python来实现FTP的上传和下载功能.因此参考网上的例子,撸了一段代码来实现了该功能,下面做个记录. 二.ftplib介绍 Python中默认安装的ftp ...
- 1040. 有几个PAT(25)
原题: https://www.patest.cn/contests/pat-b-practise/1040 思路: 先给大家扔个测试PAPAATTPATTT, 人工查一下这段字符串能组成 34个PA ...
- Qt工程文件说明
Qt工程文件说明 2017-10-16 天天快乐6... 转自 LZS2851 修改 微信 分享: 这篇文章是我从360doc上转的,本来是要把转的url列出来的,但是它们居然禁掉了复制,而且 ...
- html5语法改变
<!doctype html> 简化了 <meta http-equiv="Content-type" content="text/html;chars ...
- capistranorb
远程服务器自动部署工具 https://capistranorb.com/
- Codeforces Round #523 (Div. 2) Solution
A. Coins Water. #include <bits/stdc++.h> using namespace std; int n, s; int main() { while (sc ...
- Educational Codeforces Round 57 Solution
A. Find Divisible 签到. #include <bits/stdc++.h> using namespace std; int t, l, r; int main() { ...
- Python: 使用生成器创建新的迭代模式
使用一个生成器函数来定义一个函数模式. def frange(start, stop, increment): x = start while x < stop: yield x x += in ...
- c# ArrayList 的排序问题!
2009-01-19 20:10 c# ArrayList 的排序问题! c# ArrayList 的排序问题! 我看见网上有人用IComparer接口实现ArrayLIst 的排序问题 ,于是自己写 ...
- Jquery的深度拷贝和深度克隆
有人问,拷贝和克隆不都是“复制”的意思吗. 这位看官问的好,一般情况下是一样的,但在jquery中却有些不同.jqurey深度拷贝一般只js对象的复制,是$.extend()方法,jquery深度克隆 ...