posts - 78, comments - 34, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2009-12-30 传智播客—hibernate基础

Posted on 2009-12-30 23:02 長城 阅读(303) 评论(0)  编辑  收藏

Hibernate是由徐培成老师授课的,传智播客的老师正是我要寻找的那种老师。有丰富的工作经验和项目架构经验。而且他们的教学经验也很丰富!老徐讲课十分精细,他编写的熟练程度也很让人吃惊!        

 

Hibernate,以前老方在讲解JAVAWEB的时候有给我们编写过hibernate的简易实现原理——一对多关系的ORM。当时感觉hibernate并不难,今天学习其实它本来就不难。Hibernate的最困难的地方就是它的那个配置文件。因为hibernate正靠那个配置文件来进行ORM的,也是靠这个配置文件来进行其他的操作,比如创建表格,限制对表或字段的操作

 

         为什么要使用hibernate?老徐今天举了一个十分好的例子:如果你的表中有100个字段,使用JDBC去插入记录、更新记录这是非常恐怖的。如果插入或更新记录出错了呢?一个一个字段的对?想都不感想,如果以后数据库字段要全部添加后缀名呢!~~哇哇哇,受不了了。Okhibernate可以很好的解决JDBC的“漏洞”。

 

         这个配置文件我把它看成是hibernate的核心!

 

         下面我来举个简单的例子,使用hibernate对一个DOMAIN对象进行自动存取。

 

1.定义一个Customerdomain,从学习数据库至今使用顾客与订单做的讲解比较多,因为这种逻辑关系可以很好的阐明多表的关系,我们目前只使用一个表:

public class Customer {

    private int id;

    private String name;

    private int gender;

    private Date birthday;

    private String email;

    private String phone;

    private String address;

//下面是gettersetter方法

}

 

2.Customer的类路径下添加hibernate的映射文件(元数据文件),映射文件名为Customer.hbm.xml,这样在调用“ConfigurationObj. .addClass(Customer.class);hibernate框架可以自动加载它。

<?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>

    <!--

    1.name 指定类名

    2.table 指定表名,如果忽略则默认为类名

     -->

    <class name="cn.itcast.cc.hibernate.persistence.Customer" table="customers" lazy="false">

       <!--

       1.name OID的标识名

       2.column 对应表的主键

       3.type hibernate中的类型,对应JAVA类型为java.lang.Integer/int,对应SQL类型为INTEGER

        -->

       <id name="id" column="id" type="integer">

           <!--

           1.class 设置id字段为自增、主键

            -->

           <generator class="increment"></generator>

       </id>

       <!--

       1.name 对应类的属性

       2.column 对应表的字段,如果不指定access。此处的name只为hibernate获取读取字段的方法。

           比如name="abcde"hibernate拼出getAbcdesetAbcde,而此时我们可以添加这两个方法,用于实现特殊功能。

       3.type hibernate中的类型

       4.access hibernate直接访问字段,而不通过gettersetter

        -->

       <property name="name" column="name" type="string" access="field"/>

       <property name="gender" column="gender" type="integer" />

       <property name="birthday" column="birthday" type="date" />

       <property name="phone" column="phone" type="string" />

       <property name="email" column="email" type="string" />

       <property name="address" column="address" type="string" />

    </class>

</hibernate-mapping>

 

3.hibernate的属性文件,使用时请将里面的中文行全部删除:

hibernate.connection.driver_class=com.mysql.jdbc.Driver

hibernate.connection.url=jdbc:mysql://localhost:3306/test

hibernate.connection.username=root

hibernate.connection.password=root

#hibernate使用的本地化特性,比如MySQLOracle的分页技术不同。

#hibernate会根据这项设置,自动完成分页技术。

hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

#回显SQL语句,hibernate根据元数据文件自动生成SQL语句并执行。

hibernate.show_sql=true

#严重注意,如果指定为可以自动创建表,那么每次运行hibernate都会删除并重新创建表。

hibernate.hbm2ddl.auto=create

 

 

4.我们需要向工程中导入hibernate目录下的jar文件。

         1).hibernate3.jar.

2).lib/required/*.jar

3).3rd/*.jar

 

5.编写测试类:

import java.util.Date;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import cn.itcast.cc.hibernate.persistence.Customer;

 

public class Main {

    private static SessionFactory sefac = null;

    // 当类被加载时,获取SessionFactory

    static {

       //创建Configuration时,默认加载hibernate.properties文件。

       //也可以调用addResource方法,将配置文件加载进来。

       Configuration config = new Configuration();

       // ORM中的O在此添加到

       config.addClass(Customer.class);

       sefac = config.buildSessionFactory();

    }

      

    public static void main(String[] args) {

       // 创建一个customer对象

       Customer customer = new Customer();

       customer.setName("changcheng");

       customer.setGender(1);

       customer.setBirthday(new Date());

       customer.setPhone("13998689955");

       customer.setEmail("changcheng@google.com");

       customer.setAddress("China");

       // 调用保存

       save(customer);

       // 调用查询

       find(1);

    }

   

    private static void save(Customer customer){

       //获取session相当于获取了一个连接

       Session session = sefac.openSession();

       //此处必须使用事务,否则不能保存数据。

       Transaction tr = session.beginTransaction();

       //直接保存

       session.save(customer);

       //提交事务

       tr.commit();

       //关闭会话

       session.close();

    }  

   

    private static void find(Integer id){

       //获取session相当于获取了一个连接

       Session session = sefac.openSession();

       Transaction tra = session.beginTransaction();

       //直接保存

       Customer customer = (Customer) session.load(Customer.class, id);

       tra.commit();

       //关闭会话

       session.close();

       System.out.println(customer);

    }

}

 

上面是一个简单的hibernate例子,今天也有学习hibernate的简介与Java对象持久化概述。什么是持久化?就是将数据保存在外存里呗。比如硬盘、UHibernate就是从业务逻辑层中抽取出来的持久化层!

 

         除此之外,今天有讲解一对多和多对一关系的映射。就是老方之前讲过的,只不过这里使用了hibernate来实现自动存储。多对一需要在class元素中添加一个“many-to-one”子元素,用于指定多对一的那个属性的类型信息等。一对多需要在class元素中添加一个“set”子元素,用于指定一对多的那个set属性的类型信息等。在此就不一一列举了!


只有注册用户登录后才能发表评论。


网站导航: