Java-hibernate框架2(1、框架搭建;2、框架接口;3、框架的增删改;4、主键ID生成方式)

来源:互联网 发布:手机淘宝怎么写评论 编辑:程序博客网 时间:2024/06/04 19:09

一、搭建hibernate步骤

1步:先建一个Java工程导入使用Hibernate最小必要包。可以到网站下载Hibernate最新的包,如果访问数据库,则需要导入数据库驱动包。最小必要包:


2步:在src创建配置文件hibernate.cfg.xml,放置src目录中。

3步:编写一个会话工厂类。通过会话工厂类产生一个会话Session对象。Session对象是Hibernate的核心。任何对数据库操作都在会话中进行的。

4步:编写POJO类(在vo中的javabean)以及映射文件。javabean(***.java), 映射文件(***.hbm.xml)

pojo类和映射文件
5步:编写测试文件
    
      Hibernate核心接口
1、核心接口
(1)  Configuration接口
Configuration 接口负责管理Hibernate 的配置信息。为了能够连上数据库必须配置一些属性,这些属性包括:
数据库URL                                 
数据库用户                                     
数据库用户密码                                               
数据库JDBC驱动类
数据库dialect,用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现。
    /*创建一个配置对象,读取配置文件*/
 Configuration config = new Configuration();
 config.configure("/hibernate.cfg.xml");

(2)  SessionFactory接口
应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。这里用到了一个设计模式即工厂模式,用户程序从工厂类SessionFactory中取得Session的实例。SessionFactory不是轻量级的。它占的资源比较多,所以它应该能在整个应用中共享。一个项目通常只需要一个SessionFactory就够了,但是当项目要操作多个数据库时,必须为每个数据库指定一个SessionFactory。
会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。它也保存了在一个工作单元中读入的数据并且可能在以后的工作单元中被重用(只有类和集合映射指定了使用这种二级缓存时才会如此)Session类。
/*通过配置对象产生一个会话工厂*/
SessionFactory factory=config.buildSessionFactory();

(3)  Session接口
该接口是Hibernate使用最多的接口。Session不是线程安全的,它代表与数据库之间的一次操作。Session是持久层操作的基础,相当于JDBC中的Connection。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。Session通过SessionFactory打开,在所有的工作完成后,需要关闭。但如果在程序中,不断地创建以及销毁Session对象,则会给系统带来不良影响。所以有时需要考虑session的管理合理的创建合理的销毁。
/*通过工厂产生一个会话*/
 Session session=factory.openSession();

(4)  Query
Query类可以很方便地对数据库及持久对象进行查询,它可以有两种表达方式:查询语句使用HQL(HQL是Hibernate Query Lanaguage简称是Hibernate配备了一种非常强大的查询语言,类似于SQL)或者本地数据库的SQL语句编写
/*通过会话产生一个查询对象*/
Query query = session.createQuery("from Dept");
/*通过查询对象查询数据库,返回集合*/
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Dept dept = (Dept) list.get(i);
System.out.println(dept.getDname());
}

(5)  Transaction接口
       如果你向数据库中增加数据或修改数据时,需要使用事务处理,这时你需要Transaction接口。Transaction接口是对实际事务实现的一个抽象,该接口可以实现JDBC的事务、JTA中的UserTransaction、甚至可以是CORBA事务等跨容器的事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移值。

(6)
一个完整示例,显示了Hibernate编程基本思路。
/*创建一个配置对象,读取配置文件*/
String configfile="/hibernate.cfg.xml";
Configuration config=new Configuration();
config.configure(configfile);
/*通过配置对象产生一个会话工厂类*/
           SessionFactory sessionfactory=config.buildSessionFactory();
/*通过会话工厂类产生一个会话实例*/
Session session=sessionfactory.openSession();
/*通过会话产生一个查询对象Query*/
Query query=session.createQuery("from bean.Customer");
/*进行查询返回一个集合List*/
List<Customer> cuslist=query.list();
for(Customer cus:cuslist){
   System.out.println(cus.getCustomerId()+
" "+cus.getName()+" "+cus.getPhone());
            }
   
              
     Hibernate常见操作
如果利用Hibernate修改数据库时,需要使用事务处理,一个事务提交时才真正将修改过的记录更新到数据库中。
1、增加记录
Session session=HibernateSessionFactory.getSession();
/*定义事务开始*/
Transaction tran=session.beginTransaction();
Dept dept=new Dept(new Long(1001),"math","shanghai");
session.save(dept);
/*提交事务,真正保存到数据库中*/
tran.commit();


2删除记录
public static void main(String[] args) {
    Session session=HibernateSessionFactory.getSession();
   /*首先查找待删除记录 通过ID*/
    Dept dept=(Dept)session.get(Dept.class,new Long(10));
    Transaction tran=session.beginTransaction();
    session.delete(dept);
    tran.commit();
}

3、修改记录
public class Demo {
public static void main(String[] args) {
    Session session=
                              HibernateSessionFactory.getSession();
   Transaction tran=session.beginTransaction();
    /*首先查找待修改记录 通过ID*/
    Dept dept=
                          (Dept)session.get(Dept.class,new Long(10));
    dept.setDname("math");
    session.saveOrUpdate(dept);
    tran.commit();
}
}
 
   Hibernate主键ID生成方式
数据库中表有主键、主键的唯一性决定了数据库表中记录唯一。缓存在Session中的数据即实例都有一个唯一的ID,ID映射了数据库中主键。那么ID如何产生呢?
1assigned:主键由外部程序负责生成,无需Hibernate参与。即当增加一个实体时,由程序设定它的ID值(手工分配值)
<class name="bean.Customer" table="customers" catalog="support">
        <id name="customerId" type="java.lang.String">
            <column name="customerID" length="8" />
            <generator class="assigned"></generator>
        </id>
        .......
</class>

2identity: 在DB2、SQL Server、MySQL等数据库产品中表中主键列可以设定是自动增长列,则增加一条记录时主键的值可以不赋值用数据库提供的主键生成机制
(1) 表结构:
 create table test1 (   tid int not null  primary key auto_increment,
name char(40));
  (2) 映射文件
    <class name="bean.Test1" table="test1" catalog="support">
        <id name="tid" type="java.lang.Integer">
            <column name="tid" />
            <generator class="identity"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="40" />
        </property>
    </class>
3increment:主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。
<class name="bean.Test2" table="test2" catalog="support">
        <id name="tid" type="java.lang.Integer">
            <column name="tid" />
            <generator class="increment"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="40" />
        </property>
    </class>

4sequence:采用数据库提供的sequence机制生成主键。 
     如Oralce 中的Sequence,在Oracle中创建序列:
           create sequence hibernate_sequence;
     当需要保存实例时,Hibernate自动查询Oracle中序列"hibernate_sequence"的下一个值;该值作为主键值。可以改变默认的序列名称。
  <id name="sid" type="java.lang.Integer">
       <column name="sid" />
       <generator class="sequence"></generator>
  </id>
5native由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。

6uuid.hexHibernateID列赋值依据当前客户端机器IPJVM启动时间、当前时间、一个计数器生成串,以该串为ID值。
 <class name="bean.Test3" table="test3" catalog="support">
        <id name="tid" type="java.lang.String">
            <column name="tid" length="50" />
            <generator class="uuid.hex"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="40" />
        </property>
  </class>



1 0