Hibernate初探--单表映射

(1)写SQL语句有什么不好
    1.不同的数据库使用的SQL语法不同。比如PL/SQL与T/SQL
    2.同样的功能在不同的数据库中有不同的实现方式。比分页SQL
    3.程序过分依赖SQL对程序的移植及扩展,维护等带来很大的麻烦

(2)Hibernate介绍:
     Java领域的一款开源的ORM框架技术
     是对JDBC进行了非常轻量级的对象封装(本质上还是通过JDBC访问数据库)

     其他主流的ORM框架技术:
       1.MyBatis:前身就是著名的iBatis
       2.Toplink:后被Oracle收购,并重新包装为Oracle As TopLink
       3.EJB:本身是JAVAEE的规范(较复杂,使用较少)

(3)编写JavaBean的原则:
      1.共有的类,如public class Student{}
      2.提供公有的不带参数的默认的构造方法
      3.属性私有
      4.属性setter/getter方法

(4)使用Junit进行测试
      @Test:测试方法
      @Before:初始化方法
      @After:释放资源

(5)hibernate.cfg.xml的常用配置
   hibernate.show_sql:是否把Hibernate运行时的SQL语句输出到控制台,编码阶段便于测试
   hibernate.format_sql:输出到控制台的SQL语句是否进行排版,便于阅读。建议设置为true
   hbm2ddl.auto:这个是生成表结构的策略。有create|update|create-drop|validate,其中:
               create:每次生成新的表结构,会删除原表,创建新表
               update:在原有的表基础生进行更新,能保持原有的测试数据
               create-drop:表示生成策略是先创建再删除
               validate:对原有的表进行验证,如果现有的表结构与原有的表不同则不会创建表结构
   hibernate.default_schema:就是默认的数据库的前缀,所有的表名都会加上这个数据库前缀
   hibernate.dialect:配置数据库方言,Hibernate可针对特殊的数据库进行优化

   注意:以上属性的hibernate前缀可以省略不写,比如hibernate.dialect等同于dialect

(6)hibernate执行流程
    1.首先创建一个配置对象,即Configuration对象。它的作用是读取Hibernate.cfg.xml配置文档。还有获得
      Configuration对象的目的是可以用它创建SessionFactory对象
    2.创建SessionFactory对象的时候,会读取相应的里面加载的这些对象关系映射文件XXX.hbm.xml。获得
      SessionFactory对象后,就可以创建Session对象

      这里要注意的是创建和销毁都相当耗费资源,通常一个系统内一个数据库只创建一个SessionFactory对象
   
    3.这个Session对象类似于JDBC中的Connection。那么获得了一个Session对象就表示获得了一个数据库连接对象,
      然后就可以执行这个Session对象相应的方法(如增删改查)
      
      这里要注意的是执行Session对象的某个方法时,必须要开启一个事务Transaction。也就是说这个方法必须要
      封装在事务中。在执行完这些方法后,必须要先提交这个事务tx.commit(),然后关闭session,即session.close()

     关于session的一些说明:
    1.Hibernate是对JDBC的一个封装,它不建议直接使用JDBC的connection操作数据库,而是通过使用session操作数据库
    2.session可以理解为操作数据库的对象,那么在使用Hibernate操作数据库之前,必须要先获得一个session实例
    3.session与JDBC的connection是多对一的关系,每个session都有一个与之对应的connection,一个connection不同时        刻可以供多个session使用
    4.把对象保存在关系数据库中需要调用session的各种方法,比如:save() update() delete() createQuery()

(7)transaction说明
 Hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交的方式。所以用session保存对象时,如果
    不开启事务,并且手工提交事务,对象并不会真正保存在数据库中

 如果想让hibernate像jdbc那样自动提交事务,必须查删增改前调用session对象的doWork()方法,获得jdbc的 connection后,     设置其为自动

 提交事务模式 (还得在查删增改后刷新以下,调用session.flush())
 
(8)session说明
   如何获得session对象,  Session session =sessionFactory.openSession()
   1.利用openSession
   2.利用getCurrentSession
   
     使用getCurrentSession需要hibernate.cfg.xml文件中进行配置,分为两种情况
        <property name="hibernate.current_session_context_class">XXXX</property>
     如果是本地事务(jdbc事务),则XXXX填 thread
     如果是全局事务(jta事务),则XXXX填 jta


  openSession与getCurrentSession的区别:
  1.getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要你手动关闭。如果使用
    openSession而没有手动关闭,每次都会占用一个connection连接对象,多次之后会导致连接池溢出

  2.openSession每次创建的都是新的session对象,而getCurrentSession使用现有的session对象
        

(9)单一主键
     assigned:由java应用程序负责生成(手工赋值) 
     native:  由底层数据库自动生成标识符,如果是MySQL就是increment,如果是Oracle就是sequence
               这时候就算手工赋值了也不起作用的

(10)基本类型
     Hibernate映射类型    Java类型                     标准SQL类型
     

    见图 -> 基本类型




(11)对象类型
    见截图 -> 对象类型
    其中  binary  对应数组类型
          text    对应大文本类型
          clob    对应大文本类型
          blob    对应二进制数据类型,比如音频、视频、图片 
    MySQL不支持标准SQL的clob类型。在MySQL中,用text、mediumtext及longtext类型来表示长度超过255的长文本数据

(12)组件属性 : 指的是实体类中的某个属性  属于 用户自定义的类的对象,这个属性叫组件属性
 
     这样配置:  <component name="address" class="Address">
                   <property name="postcode" column="POSTCODE"></property>
                   <property name="phone" column="PHONE"></property>
                 </component>

(13)get和load方法的区别:
  1.在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象
    
    load方法会在调用后返回一个代理对象,该代理对象只保存了实体对象的主键属性id,直到使用对象的
    非主键属性时才会发出sql语句

  2.get与load的区别
    查询数据库中不存在的数据时,get方法返回null,而load方法抛出 异常org.hibernate.ObjectNotFoundException

(14)Hibernate开发的基本步骤
      1.编写配置文档hibernate.cfg.xml
      2.编写实体类
      3.生成实体类的映射文件并添加到配置文档中
      4.调用Hibernate API进行测试
 
     







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值