Hibernate简介及环境搭建

来源:互联网 发布:赛亚人遮脸的软件 编辑:程序博客网 时间:2024/04/27 18:32

概述:

Hibernate是非常优秀、成熟的ORM框架。它提供了强大的对象和关系数据映射及查询功能。

下载地址:http://www.hibernate.org

目录结构:

documentation文件夹下是开发帮助文档。

lib文件夹是开发使用的库,其中该文件夹下面的required目录是开发时必须导入的jar文件。

project文件夹是项目源码文件。


Hibernate应用程序的结构:


1.Application:应用

2.Persistent Object:持久化对象

3.Hibernate.propertites:Hibernate属性文件/Hibernate配置文件

4.XML Mapping:Hibernate映射文件

5.Database:数据库


JDBC和Hibernate的比较

相同点:

1.两者都是java的数据库操作中间件

2.两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭。

3.两者都可以对数据的更新操作进行显示的事务处理。

不同点:

1.使用SQL语言不同:JDBC使用的是基于关系型数据库的标准SQL语言;Hibernate使用的是HQL(Hibernate Query language)语言。

2.操作对象的不同:JDBC操作的是数据,将数据通过SQL语句直接传送到数据库中执行,Hibernate操作的是持久化对象,由底层持久化对象的数据更新到数据库中。

3.数据状态不同:JDBC操作的数据是"瞬时"的,变量的值无法与数据库中的值保持一致,而Hibernate操作的数据是可持久的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致的。


ORM:ORM(对象-关系映射)指完成对象数据到关系型数据映射。



下面通过一个项目来深入了解其中的各种概念

项目结构(导入Hibernate必须包和数据库包):



HibernateUtils.java:

public class HibernateUtils {private static SessionFactory factory;static {/*初始化配置文件,并读取配置文件信息*/Configuration configuration = new Configuration().configure();/*注册器,通过配置文件信息注册相关信息*/ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(configuration.getProperties());/*创建会话工厂*/factory = configuration.buildSessionFactory(srb.buildServiceRegistry());System.out.println("读取配置文件成功!");}/** * 获取Session工厂 * @return */public static SessionFactory getFactory(){return factory;}/** * 获取Session * @return */public static Session getSession(){return factory.openSession();}/** * 添加数据的方法 */public static void add(Object obj){/*定义会话*/Session session = null;/*定义事物*/Transaction transaction = null;try {/*开启会话*/session = HibernateUtils.getSession();/*开启事物*/transaction = session.beginTransaction();/*保存数据*/Serializable ser = session.save(obj);System.out.println("添加成功!" + ser);/*提交事物*/transaction.commit();} catch (Exception e) {if (transaction != null){transaction.rollback();//事物回滚}e.printStackTrace();} finally{if (session != null){session.close();}}}/** * 删除数据的方法 * @param obj */public static void delete(Object obj){/*定义Session*/Session session = null;/*定义事物*/Transaction transaction = null;try {/*开启会话*/session = HibernateUtils.getSession();/*开启事物*/transaction = session.beginTransaction();/*保存数据*/session.delete(obj);/*提交事物*/transaction.commit();} catch (Exception e) {if (transaction != null){transaction.rollback();//事物回滚}e.printStackTrace();} finally {if (session != null){session.close();}}}/** * 更新数据 * @param obj */public static void update(Object obj){/*定义Session*/Session session = null;/*定义事物*/Transaction transaction = null;try {/*获取会话*/session = HibernateUtils.getSession();/*开启事物*/transaction = session.beginTransaction();/*更新数据*/session.update(obj);/*提交数据*/transaction.commit();} catch (Exception e) {if (transaction != null){transaction.rollback();}e.printStackTrace();} finally{if (session != null){session.close();}}}/** * 根据id查询对象 * 注:查询方法是不需要开启事物的 * @param clazz * @param id * @return */public static Object getById(Class clazz,Serializable id){/*定义会话*/Session session = null;/*定义个对象*/Object obj = null;try {/*开启会话*/session = HibernateUtils.getSession();/*保存数据*/obj = session.get(clazz, id);} catch (Exception e) {e.printStackTrace();} finally {if (session != null){session.close();}}return obj;}}
注:配置文件的读取和Session工厂的创建都放在static块中,只需要操作一遍即可。


实体类.java:

public class User {private Integer uid;private String uname;private Date birthday;public User() {}public User(Integer uid) {this.uid = uid;}public User(String uname, Date birthday) {this.uname = uname;this.birthday = birthday;}//省略setter和getter}

注:持久化Java类必须遵循的原则:

1.必须为类的字段提供getter和setter方法。

2.必须实现一个默认的构造方法,这样的话Hibernate就可以使用Constructor.newInstance()方法来实例化对象了。

3.如果是集合类型的属性,它的类型必须定义为集合的接口,例如:List、Set。

4.提供一个标识属性(Identifier property),如果没有该属性,一些功能不起作用,比如:级联更新。


映射文件:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- package表示实体类的包名 -->        <hibernate-mapping package="com.lixue.bean"><!-- class结点的name表示实体的类名,table表示实体映射到数据库中table的名称 --><class name="User" table="t_user"><id name="uid"><!-- 自增长 --><generator class="native"/></id><property name="uname"/><property name="birthday"/></class></hibernate-mapping>


hibernate.cfg.xml:

<!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><!-- 显示打印执行的SQL语句命名 --><property name="show_sql">true</property><!-- 格式化打印SQL语句 --><property name="format_sql">true</property><!-- 配置数据库参数 --><!-- 配置数据库方言 --><property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property><!-- 数据库驱动 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_test1</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">134045</property><!-- 设置数据定义语言操作的方式 --><property name="hibernate.hbm2ddl.auto">update</property><!-- 加载对象关系映射文件 --><mapping resource="com/lixue/bean/user.hbm.xml"/></session-factory></hibernate-configuration>
注:加载映射文件时,使用的是斜杠不是包名。

测试类:

public class HibernateTest1 {public static void main(String[] args) {//add();//delete();//update();findById();}/** * 添加 */public static void add() {/* 创建对象 */User user = new User("习近平", new Date());/* 保存数据 */HibernateUtils.add(user);}/** * 删除 */public static void delete(){HibernateUtils.delete(new User(1));}public static void update(){User user = new User(2);user.setUname("廖钟民");HibernateUtils.update(user);}public static void findById(){HibernateUtils.getById(User.class, 2);}}

Configuration类:

Configuration类负责管理Hibernate的配置信息,它包括如下内容:

1.Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类、数据库方言(Dialect)。

2.数据库连接池。

3.Hibernate映射文件(*.hbm.xml)

Hibernate配置的两种方法:

1.属性文件:hibernate.properties 调用代码:Configuration cfg = new Configuration();

2.XML文件:hibernate.xml 调用代码:Configuration cfg = new Configuration().configuration();


SessionFfactory类

概述:应用程序从SessionFactory里获得Session。他在多个应用程序间进行共享,通常情况下,整个应用只有唯一的一个SessionFactory----在应用初始化的时候被创建。但是如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个SessionFactory.

调用代码:

SessionFactory factory = configuration.buildSessionFactory();


Session会话类

概述:

1.Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。

2.Session也称为持久化管理器,因为它是与持久化有关的操作接口,这也是他和Connection之间的区别。

3.Session通过SessionFactory打开,在所有的工作完成以后需要关闭。

调用代码:

Session session = factory.openSession()

Transaction事物类

概述:

它将应用代码从底层的事物实现中抽象出来——这可能是一个JDBC事物,一个JTA用户事物或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事物边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。

调用代码:

Transaction transaction = session.beginTransaction();
注:使用Hibernate进行操作(CRUD)时,必须显示的调用Transaction(因为默认autoCommit=false即不自动提交)


0 0
原创粉丝点击