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