Hibernate的基本使用学习

Hibernate的基本使用学习
1、 基本了解
我们先概念性的了解一下什么是hibernate,hibernate的中文翻译是蛰伏,冬眠的意思,看这意思是,当你睡觉的时候是不是不喜欢被打扰。那么这个框架则是被用来操作一些不能别暴露的持久层文件,也就是数据库。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
这里要说的是,虽然hibernate已经发布到了第5版,但是最常用的仍然是hibernate3例如win8,win10即使发布了,但是win7的占有量依旧很高,hibernate3可以说是很稳定的一个版本,所以在学习的话最好3是一个很好的选择,myeclipse10中最高的版本是4.1,所以我使用了最高版本。
2、 语言特点以及
(1)将对数据库的操作转换为对Java对象的操作,从而简化开发。通过修改一个“持久化”对象的属性从而修改数据库表中对应的记录数据。
(2)提供线程和进程两个级别的缓存提升应用程序性能。
(3)有丰富的映射方式将Java对象之间的关系转换为数据库表之间的关系。
(4)屏蔽不同数据库实现之间的差异。在Hibernate中只需要通过“方言”的形式指定当前使用的数据库,就可以根据底层数据库的实际情况生成适合的SQL语句。
(5)非侵入式:Hibernate不要求持久化类实现任何接口或继承任何类,POJO即可。
3、 核心接口(核心API)
Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。
Session
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
Transaction
Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
Query
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
Criteria
Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
Configuration
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。

4、 基本原理图
这里写图片描述
注:Student可以看作为任何一个Bean。
5、
既然我们要学习hibernate,我们先学习配置,然后再进行接下来的学习。在这里我选用的是Myeclipse10进行实验。 新建项目,右键点击新建的项目。Myeclipse  Add Hibernate Capabilities
这里写图片描述
然后,我们就到了这一步,勾选3.3版本或者4.1版本都可以满足我们的要求,我在这里选择的是4.1,选择使用的是Mysql数据库,引用hibernate之后依然需要使用Mysql的connect的jar包,不要忘记。经过几部next之后,因为没事特殊选择,直接next到下面这个界面。
这里写图片描述
在上面填写上述路径,驱动,用户名,密码,勾选可自动生成表。我操作数据库的名字为hibernate。
继续next指定配置文件所在的包。
这里写图片描述
经过上述几步之后,我们的hibernate基本配置就做完了,这时项目里就已经生成好配置文件了。
建立类:ExportDB.java

package hibernate;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class ExportDB {
    /**
     *将hbm生成ddl,读取cfg.xml中的mapping来动态建表,已有表将不会被重复创建
       *表名将默认设置为类名
     */
    public void Exportdb()
    {
    //默认读取hibernate.cfg.xml文件  
        Configuration cfg = new Configuration().configure();  
        SchemaExport export = new SchemaExport(cfg);  
        export.create(true, true);  
    }
}
建立User.java

这里写图片描述
接下来创建一个User.hbm.xml(我们暂时不用反向生成的方式来创建,先手动建立,反向生成方法,后续介绍)
这里写图片描述
该xml文档中代码如下

<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping>  
    <class name="hibernate.User ">  
        <id name="id">  
            <generator class="uuid"/>  
        </id>  
        <property name="name"/>  
        <property name="password"/>  
    </class>  
</hibernate-mapping>

这时要在hibernate.cfg.xml中加入

<mapping resource="hibernate/User.hbm.xml"/>

如同使用struts中增加action一样,保证读取xml文件是可以找到实体类进行建表等一系列操作
那么我们写一个实体类来测试一下吧。
因为在一个class中,所以,我分开增删改查的代码,以及运行结果。
一、 增加一条或者多条记录。

public static void add(String name,String password)
    {

        try {
            //打开session并开启事务
            session = factory.openSession();
            session.beginTransaction();
            //新建对象
            User user = new User();
            user.setName(name);
            user.setPassword(password);
            //增加对象
            session.save(user);
            //提交事务
            session.getTransaction().commit();


        } catch (Exception e) {
            // TODO: handle exception
            System.out.println(e.getMessage());
            //事务回滚
            session.getTransaction().rollback();
        }finally{
            if(session.isOpen())
            {   //  关闭session
                session.close();
            }
        }
    }

在Main函数中调用三次add()方法,给出name,password。id我们设置的属性是uuid自动添加长度32的串,无实际意义,保证添加的主键都不同,如果想自定义主键,那么久像下面就可以,其他的可以自行百度。uuid的通用性很好。

<generator class="assigned"/>  

二、 删除一条或者多条记录。

public static void delete()
    {
        try {
            session = factory.openSession();
            session.beginTransaction();

            User user = new User();
            user.setId("402828815afa7cca015afa7ccd800001");

            session.delete(user);
            session.getTransaction().commit();  
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println(e.getMessage());
            session.getTransaction().rollback();
        }finally{
            if(session.isOpen())
            {
                session.close();
            }
        }   
    }

在这里我们要注意的是,session.delete(user);根据id的值进行删除,如果想进行条件删除,则需要配合HQL语言来进行。后续介绍

三、 查询一条或者多条记录

public static void select(String name)
    {
        try {
            session = factory.openSession();
            session.beginTransaction();

            Criteria cta = session.createCriteria(User.class);
            cta.add(Restrictions.eq("name", name));

            List<User> list = cta.list();
            for(User user : list)
            {
                System.out.println(user.name);
                System.out.println(user.password);
            }
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println(e.getMessage());
            session.getTransaction().rollback();
        }finally{
            if(session.isOpen())
            {
                session.close();
            }   
        }
    }

Criteria是一个叼的不得了的接口,其中封装了很多查询方法,例如模糊查询,分页查询,关联查询等,详见此博客
http://blog.csdn.net/dragonpeng2008/article/details/45865717

四、 更新一条记录

public static void update()
    {
        try {
            session = factory.openSession();
            session.beginTransaction();

            //指定id后进行修改
            User user = (User)session.load(User.class, "402828815afa7cca015afa7ccdf30002");
            user.setName("oliver");
            user.setPassword("hello");

            session.update(user);

            session.getTransaction().commit();
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println(e.getMessage());
            session.getTransaction().rollback();
        }finally{
            if(session.isOpen())
            {
                session.close();
            }
        }
    }

在这里我指定一个特定id的记录作为例子,千万不要以为复制粘贴就能运行,自动生成id是不可能相同的。
总结:
到这里,hibernate的简单增删改查例子就写完了,是不是发现,通过hibernate封装的接口与方法,免去了很多冗余代码,不用在纠结sql语句中的字符差错,代码可读性变得超级强!上述的例子只是一个开始。其实hibernate中还有HQL语句,也是66的,还有hibernate六大API做封装的方法,以及缓存操作。都将在后续指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值