zoukankan      html  css  js  c++  java
  • 【Hibernate一】概述及入门

    Hibernate学习框架:
    1、基本部分
         crud的操作
         主键的生成机制
         类型
         持久化类
         映射文件 *.hbm.xml
         配置文件 hibernate.cfg.xml
    2、关系部分
         一对多的单项
         一对多的双向
         多对多的双向
         一对一
            在many-to-one加一个属性unique="true"
            cascade  级联
            inverse  维护关系  <set>中lazy,fetch
    3、性能的部分
    • 维护关系 inverse
    • 懒载入 lazy
    • 抓取策略 fetch
    • 一级缓存 
    • 二级缓存
    查询缓存
    4、查询
        hql
        条件查询


    一。Hibernate概述:
    在servlet中。操作数据库我们使用的是jdbc,为了更加方便的操作数据库,我们能够使用ORM框架,ORM:Object Relation Mapping,对象关系映射。目的就是像操作java普通的类一样来操作数据库。

    显然Hibernate是ORM框架中做得比較好的一款!


    Hibernate的有点:
    • 面向对象数据库编程;
    • 代码书写更加简洁;
    • 具有缓存机制。提高效率;

    二.入门:
    准备条件:
    1.导入相关的包
    2.hibernate.cfg.xml:(通常位于scr根文件夹下)
    数据库要自己先新建好。!
    <?xml version= '1.0' encoding ='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >

    <hibernate-configuration>
         <session-factory >
               <!-- 数据库的username -->
               <property name="connection.username" >root </property>
               <!-- password -->
               <property name="connection.password" >root </property>
               <!-- url -->
               <property name= "connection.url">
                  jdbc:mysql:// localhost:3306/hibernate512
               </property>
               <!-- 方言 告诉hibernate,要操作的数据库是mysql -->
               <property name="dialect" >org.hibernate.dialect.MySQLDialect </property>
               <!-- 导入驱动 -->
               <property name= "connection.driver_class" >
                  com.mysql.jdbc.Driver
               </property>
         
               <!-- validate 仅仅检查结构 update 检查结构,更新或者创建表 create 每次启动 hibernate时,都要创建表 create-drop
                  启动 hibernate时创建表。当 hibernate关闭时,删除表 -->
               <property name= "hbm2ddl.auto">update</property >
               <!--显示sql语句的输出  -->
               <property name= "show_sql"> true</ property >
                <property name= "format_sql"> true</ property >
              
               <!--关联映射文件,手动加入。然后自己主动生成。  -->
               <mapping resource="com/oteman/hibernate/domain/Person.hbm.xml" />
         
         </session-factory >

    </hibernate-configuration>

    3.要操作的实体bean(Person为例)
    package com.oteman.hibernate.domain;

    public class Person {
         Long pid;
         String pname;
         String pgender;
         public Long getPid() {
               return pid ;
         }
         public void setPid(Long pid) {
               this.pid = pid;
         }
         public String getPname() {
               return pname ;
         }
         public void setPname(String pname) {
               this.pname = pname;
         }
         public String getPgender() {
               return pgender ;
         }
         public void setPgender(String pgender) {
               this.pgender = pgender;
         }

    }


    4.要操作的实体与数据库表的相应关系Person.hbm.xml
    (通常与实体bean在同一个文件夹)
    <?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>
         <class name="com.oteman.hibernate.domain.Person"  table="Person" >
               <id name= "pid" column ="pid" length="5" type="java.lang.Long" >
                   <generator class= "increment"></generator >
               </id>
               <property name= "pgender" column ="gender" length="10" type="string"></ property>
               <property name= "pname" column ="name" length="20" ></property>
         </class >

    </hibernate-mapping>


    5.依据配置文件建立表
         @Test
         public void testCreateTable(){
              Configuration configuration= new Configuration();
              configuration.configure();
              SessionFactory sessionFactory = configuration.buildSessionFactory();
         }


    6.增删改查:
    /**
          * 向数据库中添加数据
          */
         @Test
         public void add(){

              Session session = sessionFactory.openSession();
              Transaction transaction = session.beginTransaction();
              Person p= new Person();
              p.setPgender( "男");
              p.setPname( "张三");
              session.save(p);
              transaction.commit();
              session.close();
         }
         
         /**
          * 更新数据, hibernate具有快照机制,会将对象前后的值进行比較,假设发现对象的属性没有发生改变,那么就不进行update操作,能够观察 sql语句;
          */
         @Test
         public void update(){
              Session session = sessionFactory.openSession();
              Transaction transaction = session.beginTransaction();
              Person person=(Person) session.get(Person. class, 2l);
              person.setPname( "哈哈");
               /*//另外一种形式:
              Person p=new Person();
              p.setPgender("男");
              p.setPid(2L);
              p.setPname("李四");*/
              session.update(person);
              transaction.commit();
              session.close();
         }
         /**
          * 删除数据
          */
         @Test
         public void delete(){
              Session session= sessionFactory.openSession();
              Transaction transaction = session.beginTransaction();
              Person person=(Person) session.get(Person. class, 1l);
              session.delete(person);
              
              transaction.commit();
              session.close();
              
         }
         /**
          * 查询全部!

          */
         @Test
         public void query(){
              Session session= sessionFactory.openSession();
               List list = session.createQuery("from Person").list();
              System. out.println(list.size());
              session.close();
         }

    7.Generator主键产生机制
    public class GeneratroTest extends HibernateUtils{
         
         /**
          *
          * 1.<id name=" pid" column="pid" type="java.lang.Long">
                   <generator class="increment"> </generator>
               </id>
          * increament形式产生的 sql语句
          *    Hibernate:
                  select
                      max( pid)
                  from
                      person
               Hibernate:
                  insert
                  into
                      person
                      ( pname, psex , pid)
                  values
                      (?, ?

    , ?)

                     
               说明:
                  1、先得到主键的最大值
                  2、在最大值的基础上加1
                  3、上述的两步过程是由 hibernate内部完毕的
          */
         @Test
         public void testIncrement(){
              Session session =  sessionFactory.openSession();
              Transaction transaction = session.beginTransaction();
              Person person = new Person();
               //person.setPid(11L);为increament时,自行设置的id没实用, hibernate会帮我们处理id;
              person.setPname( "云三班长" );
              person.setPsex( "不详");
              session.save(person);
              transaction.commit();
              session.close();
         }
         
         /**
          *
          * 2.<generator class="identity"> </generator>
          *
          * Hibernate:
             insert
             into
                 person
                 ( pname, psex )
             values
                 (?, ?)
                 说明:
                   主键的生成交给数据库来做,数据库必须支持自己主动增长机制,会出现id不连续的情况,效率比increment要高一些;
          */
         @Test
         public void testIdentity(){
              Session session =  sessionFactory.openSession();
              Transaction transaction = session.beginTransaction();
              Person person = new Person();
               //person.setPid(11L);
              person.setPname( "云三班长" );
              person.setPsex( "不详");
              session.save(person);
              transaction.commit();
              session.close();
         }
         
         /**
          * 3.<generator class=" uuid"></generator>
          * 主键的生成是由 hibernate内部完毕的
          */
         @Test
         public void testUUID(){
              Session session =  sessionFactory.openSession();
              Transaction transaction = session.beginTransaction();
              Person person = new Person();
              person.setPname( "云三班长" );
              person.setPsex( "不详");
              session.save(person);
              transaction.commit();
              session.close();
         }
         /**
          * 4.<generator class="assign"> </generator>
          * 主键的生成由自己指定。
          */
         @Test
         public void testAssigned(){
              Session session =  sessionFactory.openSession();
              Transaction transaction = session.beginTransaction();
              Person person = new Person();
              person.setPid(11L);
              person.setPname( "云三班长" );
              person.setPsex( "不详");
              session.save(person);
              transaction.commit();
              session.close();
         }
    }

  • 相关阅读:
    如何 Xcode 开发工具里安装一个空的项目末模板
    推荐完成项目要使用的常用工具
    仿照 QQ 的 cell 的左滑删除、置顶、标记未读效果
    API接口文档的撰写
    UI:动画
    UI:多线程 、用GCD创建线程
    UI:UICollectionView
    开发中的一些零碎知识点
    UI:数据库练习、滤镜效果
    UI:地图和定位
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6756532.html
Copyright © 2011-2022 走看看