Hibernate自学:初步了解


一.Hibernate介绍

  

以前学习过Struts2,对于Hibernate和Spring只有初步的认识,现在工作中处处都是SSH,所以要偷空把这两样要好好研究下,争取早日达到高薪。 嘿嘿……

JPA:定义了一系列的接口,用来实现各种O/R Mapping Framewords,仅仅只定义了一个标准

hibernate就是JPA的一个具体实现,同样的实现还有toplink、jdo等等

    

 

二.Hibernate基础配置

 

一.hibernate.cfg.xml配置
 
 1.<property name="dialect">org.hibernate.dialect.HSQLDialect</property>

  用于定义数据库方言,hibernate根据这个配置,自动生成对应数据库的SQL语句

  具体的各种方言,可以查阅文档

        2.<property name="hbm2ddl.auto">create</property>

         指的是当xml或者Annotation映射的表不存在时,将自动创建

         可选值还有update,update-drop,都不常用,一般只用create,其实也很少用,

         因为在真正的工作中,都是先建表再建类。

        3.<property name="show_sql">true</property>

         在执行的过程中打印出hibernate自动生成的SQL语句

          <property name="format_sql">true</property>

         进一步将生成的SQL语句格式化

 4.<property name="current_session_context_class">tread</property>

  主要是用于Session.getCurrentSession();方法

 


二.XML与Annotation映射数据库表和字段
 

 


  一.XML(不常用,企业遗留的项目可能会用)

  在对应的Java类目录下创建classname.hbm.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 package="com.sean.hibernate.model">

    <class name="Student" table="student">   // table默认与classname一致,可以不写

     <id name="id" column="id"></id>  //映射主键

     <property name="name" column="name"></property>   //column默认的值与类中的属性名一致,可以不写

     <property name="profession" column="profession"></property>

    </class>

   </hibernate-mapping>

   然后再hibernate.cfg.xml配置文件添加如下代码

    <mapping resource="classname.hbm.xml的具体文件路径如:com/sean/hibernate/model/Student.hbm.xml"/>
  
 
   测试函数:
    Student student = new Student();
    student.setId(1);
    student.setName("Sean");
    student.setProfession("Computer");
    Configuration cfg = new Configuration();
    SessionFactory sf = cfg.configure().buildSessionFactory();
    Session session = sf.openSession();
    session.beginTransaction();
    session.save(student);
    session.getTransaction().commit();
    session.close();
    sf.close();
   

 


 二.Annotation(最常用,Hibernate3.0以上新特性)
  
  在Java类上注解@Entity   在javax.persistance.Entity;包里

  在Java主键属性上注解@Id   一般在属性的get方法上注解

  然后再hibernate.cfg.xml配置文件里添加

   <mapping class="类的具体路径如:com.seam.hibernate.model,Student"/>

  例子:
   @Entity
   @Table(name="表名")默认与Java类同名,如Teacher
   public class Teacher
   {
    private int id;
    private String name;
    private String addr;
 
    @Id
    public int getId() {
     return id;
    }
    public void setId(int id) {
     this.id = id;
    }
    @column(name="数据库字段名")默认和属性名一致,如name
    public String getName() {
      return name;
     }
    public void setName(String name) {
     this.name = name;
    }
    @Transient不和数据库表字段做映射,而在XML中,只要不在classname.hbm.xml中配置就可以不映射
    public String getAddr() {
     return addr;
    }
    public void setAddr(String addr) {
     this.addr = addr;
    }
   }

   测试函数:
   Teacher teacher = new Teacher();
   teacher.setId(1);
   teacher.setName("sean");
  
   Configuration cfg = new AnnotationConfiguration();//此处与XML不同
   SessionFactory sf = cfg.configure().buildSessionFactory();
   Session session = sf.openSession();
   session.beginTransaction();
   session.save(teacher);
   session.getTransaction().commit();
   session.close();
   sf.close();

 

 

 

三.ID生成策略

 

1.自动增长


 1.XML
  在classname.hbm.xml配置主键的时候

  <id name="id" column="id">

   <generator class="native"></generator>
   class常用选值有native(自动判断,用于跨数据库平台),identity(SQL Server),sequence(Orcale)

  </id>

 

 

 2.Annotation
  在主键属性上注解@GeneratedValue

 

 

 

四.核心开发接口

 

1.Configuration

 AnnotationConfiguration用于Annotation

 进行配置信息的管理,也就是用来访问hibernate.cif.xml

 用来产生SessionFactory

 可以在configure方法中指定hibernate配置文件,默认访问src目录下的hibernate.cfg.xml

  可以通过重载方法configure("配置文件路径");访问其他配置文件

        生成SessionFactory只需要关注一个方法:buildSessionFactory();

 

 

2.Session

 用户和数据库交互

 可以通过
  SessionFactory sessionFactory = Configuration.configure().buildSessionFactory();

  Session session = sessionFactory.openSession();

   每次都打开新的Session

   commit()后每次都需要close();

  Session session = sessionFactory.getCurrentSession();

   默认为当前线程中的Session,如果当前线程不存在,则创建新的实例

   commit()后自动close();

   用途:界定事务边界

   再hibernate.cfg.xml中的设置,tread最常用,还有Jta(Java Transaction api)用于分布式数据库

    <property name="current_session_context_class">tread</property>

 

 

3.对象的三种状态

 Session缓存:简单理解为session里保存一个Java对象实例的引用即可,为了提高访问效率。

 Transient:对象没有ID,再数据库里没有,是刚new出来的对象,Session缓存里也没有,只有内存有

 Persistant:对想有ID,数据库有,缓存里面有,内存里也有

 Detached:内存有,缓存没有,数据库有。(Session关闭,对象实例的引用消失,所以叫分离态)

 

 

4.session.save(Object object);略

 

 

 

5.session.delete(Object object);

 只要object的Id属性有值,并且在数据库有对应的数据,即可删除

 

 

 

6.session.load(class arg0,Serializable arg1)

 例子 Teacher teacher = (Teacher)session.load( Teacher.class,1);

  session.get(class arg0,Serializable arg1)

 例子 Teacher teacher = (Teacher)session.load( Teacher.class,1);
 
   load和get的区别

  load返回的是代理对象,等到真正用到对象内容的时候,才发出SQL语句,从数据库读取数据

  get直接发出SQL语句,直接读取数据

 

 


 
7.session.update(Object object);

 只要object的Id有值,并且在数据库里有对应的ID记录,就可以更新,但是更新全部字段!!!

 更新部分字段
  
  XML:
   在classname.hbm.xml里<class name="com.sean.hibernate.Student" dynamic-update="true">
   
   既可以更新对象更新的部分字段
  
  HQL语句:(常用)
 
   Student s = new Student(1,"Sean","boy");
   Query q = session.createQuery("update Student s set s.name='Sean2' where s.Id=1");
   q.executeUpdate();

 

 

 

8.session.clear();

 用于清除session缓存

 

 

9.session.flush();
  
 强制将session缓存与数据库做同步,简单理解就是将session缓存保存到数据库 


以上是简单的Hibernate应用。随着工作时间的加长,相信会对其有更深刻的了解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值