【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  >
            <!-- 数据库的用户名 -->
            <property name="connection.username" >root </property>
            <!-- 密码 -->
            <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();
     }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值