zoukankan      html  css  js  c++  java
  • Hibernate笔记1

    一.Hibernate概述
    Hibernate是一个实现了ORM思想的,开源的,轻量级的,内部封装了JDBC操作的持久层框架.
         实现了ORM思想的:不再重点关注sql语句的编写
         开源的:开放源代码的
         轻量级的:消耗的资源少(内存),依赖的jar包比较少
    注:ORM思想(O:object R:relation M:mapping--对象关系映射)   
         目的:操作实体类就相当于操作数据库表
         条件:1.创建实体类和表的映射关系
               2.创建属性和字段的映射关系

    二.环境搭建
         1.导入jar包:必选/log4j/mysql驱动包
         2.编写映射关系文件:实体类.hbm.xml,放在实体类包下
             映射关系文件内容:
                 (1)实体类与sql表的关系
                 (2)实体类属性与sql表字段的关系
             模板:
           

      1  <?xml version="1.0" encoding="UTF-8"?>
      2          <!DOCTYPE hibernate-mapping PUBLIC
      3              "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      4              "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
      5          <hibernate-mapping>
      6              <!-- 1.创建实体类与表的映射关系 -->
      7              <!--
      8                 lazy:配置懒加载
      9                     true:使用懒加载(使用时才发送sql语句);
     10                      false:立即加载;
     11               -->
     12          <class name="linkman.Linkman" table="cst_linkman" lazy="false">
     13              <!-- 2.创建属性与字段值的映射关系 -->
     14                  <!--2.1配置主键  -->
     15                  <id name="lkmId" column="lkm_id">
     16                      <generator class="native"></generator>
     17                  </id>
     18                  <!--2.2其它属性与字段  -->
     19                  <property name="lkmName" column="lkm_name"></property>
     20                  <property name="lkmGender" column="lkm_gender"></property>
     21                  <property name="lkmPhone" column="lkm_phone"></property>
     22                  <property name="lkmMobile" column="lkm_mobile"></property>
     23                  <property name="lkmEmail" column="lkm_email"></property>
     24                  <property name="lkmPosition" column="lkm_position"></property>
     25                  <property name="lkmMemo" column="lkm_memo"></property>
     26          </class>
     27          </hibernate-mapping>

        3.编写hibernate核心配置文件:hibernate.cfg.xml,放在src包下
             核心配置文件内容(顺序不能变):
                 (1)数据库配置信息;
                 (2)hibernate基本配置信息;
                 (3)映射关系文件的位置
             模板:
            

      1 <?xml version="1.0" encoding="UTF-8"?>
      2          <!DOCTYPE hibernate-configuration PUBLIC
      3              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
      4              "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
      5          <hibernate-configuration>
      6              <session-factory>
      7                      <!--数据库配置  -->
      8                      <!--
      9                          hibernate.hbm2ddl.auto : hibernate生成数据定义语言
     10                             数据库的建表语句,使用hibernate自动创建数据库表
     11                                 create-drop  :程序开始的时候创建表(有表删表,再创建,没表直接创建),程序结束的时候删除表
     12                                 create           : 有表现删除再创建表,没表直接创建
     13                                 update           :没表创建表,有表的话如果映射关系发生了变化,更新表
     14                                 validate       :不会创建表,验证映射文件的配置,如果映射文件配置发生了变化,抛出异常
     15                     -->
     16                  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
     17                  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
     18                  <property name="hibernate.connection.url">jdbc:mysql:///cst_linkman</property>
     19                  <property name="hibernate.connection.username">root</property>
     20                  <property name="hibernate.connection.password">root</property>
     21                      <!--hibernate基本配置  -->
     22                  <property name="hibernate.hbm2ddl.auto">update</property>
     23                  <property name="hibernate.show_sql">true</property>
     24                  <property name="hibernate.format_sql">true</property>
     25                      <!--指定映射文件位置  -->
     26                  <mapping resource="linkman/Linkman.hbm.xml"/>
     27             </session-factory>
     28          </hibernate-configuration>

    附:关于使用Eclipse软件编写以上两种配置文件的自动提示相关问题:
    1.配置Eclipse:
         菜单栏:window-->preferences-->XML-->Catalog,选中User Specified Entries,单击Add,选择File System,选中dtd文件(hibernate-configuration-3.0.dtd或者hibernate-mapping-3.0.dtd)的路径;Key Type选择uri,将对应的dtd文件中的uri(http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd或者http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd)复制进去即可;重启Eclipse,输入标签<>即可自动提示;
    2.关于标签内属性的提示,需按快捷键alt+/

    三.Hibernate使用步骤:七步
         1.加载配置文件--Configuration
         2.构建sessionFactory--cfg.buildSessionFactory
         3.打开新的session--factory.openSession
         4.开启事务--tx.beginTransaction
         5.CRUD
         6.提交事务--tx.commit
         7.释放资源--session.close()/factory.close()(若使用工具类,factory不能释放)
    工具类:HibernateUtils
       

      1  //使用静态代码块创建factory,仅在启动时创建一次,提高效率
      2     import org.hibernate.Session;
      3      import org.hibernate.SessionFactory;
      4      import org.hibernate.cfg.Configuration;
      5      public class HibernateUtils {
      6          private static SessionFactory factory;
      7          static {
      8              // 加载配置文件
      9             Configuration cfg = new Configuration();
     10              cfg.configure();
     11              // 构建sessionFactory
     12              factory = cfg.buildSessionFactory();
     13          }
     14          public static Session getSession() {
     15              return factory.openSession();
     16          }
     17      }


    ============================================================
    举例:
    1.创建sql表
    2.创建实体类
    3.编写映射关系文件:Linkman.hbm.xml
    4.编写hibernate配置文件:hibernate.cfg.xml
    5.编写工具类
    6.编写执行代码
    ------------------------------------------------------------
    1.创建sql表

      1 CREATE TABLE `cst_linkman` (
      2    `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '联系人编号(主键)',
      3    `lkm_name` varchar(16) DEFAULT NULL COMMENT '联系人姓名',
      4    `lkm_gender` varchar(10) DEFAULT NULL COMMENT '联系人性别',
      5    `lkm_phone` varchar(16) DEFAULT NULL COMMENT '联系人办公电话',
      6    `lkm_mobile` varchar(16) DEFAULT NULL COMMENT '联系人手机',
      7    `lkm_email` varchar(64) DEFAULT NULL COMMENT '联系人邮箱',
      8    `lkm_position` varchar(16) DEFAULT NULL COMMENT '联系人职位',
      9    `lkm_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注',
     10    PRIMARY KEY (`lkm_id`)
     11  ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

    2.创建实体类

      1 public class Linkman {
      2      private Long lkmId;// 联系人编号(主键)
      3      private String lkmName;// 姓名
      4     private String lkmGender;// 性别
      5     private String lkmPhone;// 办 公电话
      6     private String lkmMobile;// 手机
      7     private String lkmEmail;// 邮箱
      8     private String lkmPosition;// 职位
      9     private String lkmMemo;// 备注
     10     // getter/setter
     11      public Long getLkmId() {
     12          return lkmId;
     13      }
     14 
     15     public void setLkmId(Long lkmId) {
     16          this.lkmId = lkmId;
     17      }
     18 
     19     public String getLkmName() {
     20          return lkmName;
     21      }
     22 
     23     public void setLkmName(String lkmName) {
     24         this.lkmName = lkmName;
     25      }
     26 
     27     public String getLkmGender() {
     28          return lkmGender;
     29      }
     30 
     31     public void setLkmGender(String lkmGender) {
     32          this.lkmGender = lkmGender;
     33      }
     34 
     35     public String getLkmPhone() {
     36          return lkmPhone;
     37      }
     38 
     39     public void setLkmPhone(String lkmPhone) {
     40          this.lkmPhone = lkmPhone;
     41      }
     42 
     43     public String getLkmMobile() {
     44          return lkmMobile;
     45      }
     46 
     47     public void setLkmMobile(String lkmMobile) {
     48          this.lkmMobile = lkmMobile;
     49      }
     50 
     51     public String getLkmEmail() {
     52          return lkmEmail;
     53      }
     54 
     55     public void setLkmEmail(String lkmEmail) {
     56          this.lkmEmail = lkmEmail;
     57      }
     58 
     59     public String getLkmPosition() {
     60          return lkmPosition;
     61      }
     62 
     63     public void setLkmPosition(String lkmPosition) {
     64          this.lkmPosition = lkmPosition;
     65      }
     66 
     67     public String getLkmMemo() {
     68          return lkmMemo;
     69      }
     70 
     71     public void setLkmMemo(String lkmMemo) {
     72          this.lkmMemo = lkmMemo;
     73      }
     74 
     75     // toString
     76      @Override
     77      public String toString() {
     78          return "Linkman [lkmId=" + lkmId + ", lkmName=" + lkmName + ", lkmGender=" + lkmGender + ", lkmPhone="
     79                  + lkmPhone + ", lkmMobile=" + lkmMobile + ", lkmEmail=" + lkmEmail + ", lkmPosition=" + lkmPosition
     80                  + ", lkmMemo=" + lkmMemo + "]";
     81      }
     82 
     83 }
     84 


    3.编写映射关系文件:Linkman.hbm.xml--放在实体类所在包下

      1 <?xml version="1.0" encoding="UTF-8"?>
      2  <!DOCTYPE hibernate-mapping PUBLIC
      3      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      4      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
      5 
      6  <hibernate-mapping>
      7  <!-- 1.创建实体类与表的映射关系 -->
      8  <class name="linkman.Linkman" table="cst_linkman">
      9      <!-- 2.创建属性与字段值的映射关系 -->
     10          <!--2.1配置主键  -->
     11          <id name="lkmId" column="lkm_id">
     12              <generator class="native"></generator>
     13          </id>
     14          <!--2.2其它属性与字段  -->
     15          <property name="lkmName" column="lkm_name"></property>
     16          <property name="lkmGender" column="lkm_gender"></property>
     17          <property name="lkmPhone" column="lkm_phone"></property>
     18          <property name="lkmMobile" column="lkm_mobile"></property>
     19          <property name="lkmEmail" column="lkm_email"></property>
     20          <property name="lkmPosition" column="lkm_position"></property>
     21          <property name="lkmMemo" column="lkm_memo"></property>
     22  </class>
     23  </hibernate-mapping>


    4.编写hibernate配置文件:hibernate.cfg.xml--放在src下

      1 <?xml version="1.0" encoding="UTF-8"?>
      2  <!DOCTYPE hibernate-configuration PUBLIC
      3      "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
      4      "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
      5  <hibernate-configuration>
      6      <session-factory>
      7          <!--数据库配置  -->
      8          <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
      9          <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
     10          <property name="hibernate.connection.url">jdbc:mysql:///cst_linkman</property>
     11          <property name="hibernate.connection.username">root</property>
     12          <property name="hibernate.connection.password">root</property>
     13              <!--hibernate基本配置  -->
     14          <property name="hibernate.hbm2ddl.auto">update</property>
     15          <property name="hibernate.show_sql">true</property>
     16          <property name="hibernate.format_sql">true</property>
     17              <!--指定映射文件位置  -->
     18          <mapping resource="linkman/Linkman.hbm.xml"/>
     19      </session-factory>
     20  </hibernate-configuration>

    5.编写工具类

      1 import org.hibernate.Session;
      2  import org.hibernate.SessionFactory;
      3  import org.hibernate.cfg.Configuration;
      4 
      5 public class HibernateUtils {
      6      private static SessionFactory factory;
      7 
      8     static {
      9          // 加载配置文件
     10         Configuration cfg = new Configuration();
     11          cfg.configure();
     12          // 构建sessionFactory
     13          factory = cfg.buildSessionFactory();
     14      }
     15 
     16     public static Session getSession() {
     17          return factory.openSession();
     18      }
     19 
     20 }
     21 


    6.编写执行代码--增删改

      1 package demo;
      2 
      3 import org.hibernate.Session;
      4  import org.hibernate.Transaction;
      5  import org.junit.Test;
      6 
      7 import linkman.Linkman;
      8  import utils.HibernateUtils;
      9 
     10 public class Demo02 {
     11          // 增加
     12     @Test
     13      public void add() {
     14          // 利用工具类获取session
     15          Session session = HibernateUtils.getSession();
     16          // 开启事务
     17         Transaction tx = session.beginTransaction();
     18          // crud/
     19          Linkman man = new Linkman();
     20          man.setLkmName("Jack");
     21          session.save(man);
     22          // 提交事务
     23         tx.commit();
     24          // 释放资源
     25         session.close();
     26 
     27     }
     28 
     29         // 修改id=2的名字为rose,id一定要正确,否则报空指针
     30     @Test
     31      public void modify() {
     32          // 获取session
     33          Session session = HibernateUtils.getSession();
     34          // 开启事务
     35         Transaction tx = session.beginTransaction();
     36          // 修改
     37         Linkman man = session.get(Linkman.class, 2L);
     38          man.setLkmName("Rose");
     39          // 提交事务
     40         tx.commit();
     41          // 释放资源
     42         session.close();
     43      }
     44 
     45     //删除
     46     @Test
     47      public void del() {
     48          // 获取session
     49          Session session = HibernateUtils.getSession();
     50          // 开启事务
     51         Transaction tx = session.beginTransaction();
     52          // crud-del
     53          Linkman man = session.get(Linkman.class, 2L);
     54          session.delete(man);
     55          // 提交事务
     56         tx.commit();
     57          // 释放
     58         session.close();
     59      }
     60  }
     61 

  • 相关阅读:
    【原创】解决向工程中添加Megacore 文件在文件列表中没有出现目标文件的问题
    (笔记)找工作,该怎么进补
    (原创)结构体位域操作
    (原创)TCP/IP学习笔记之IP(网际协议)
    (原创)确认大端模式或小端模式(最直接有效的方法)
    (原创)HDL中的unsigned与signed
    (原创)TCP/IP学习笔记之概述
    (笔记)往一个指定的地址读写一个值
    (笔记)我的EDN博客被评为专家博客啦
    (原创)同步复位与异步复位
  • 原文地址:https://www.cnblogs.com/huguangqin/p/7409876.html
Copyright © 2011-2022 走看看