2009-12-30 传智播客—hibernate基础 (转载)

 

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();

       //关闭会话

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值