• Java Web编程的主要组件技术——Hibernate核心组件


    参考书籍:《J2EE开源编程精要15讲》

    Hibernate配置文件

      1) hibernate.cfg.xml

     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 <!-- Generated by MyEclipse Hibernate Tools.                   -->
     6 <hibernate-configuration>
     7 
     8     <session-factory>
     9         <property name="dialect">
    10             org.hibernate.dialect.MySQLDialect
    11         </property>
    12         <property name="connection.url">
    13             jdbc:mysql://localhost:3306/test
    14         </property>
    15         <property name="connection.username">root</property>
    16         <property name="connection.password">root</property>
    17         <property name="connection.driver_class">
    18             com.mysql.jdbc.Driver
    19         </property>
    20         <property name="myeclipse.connection.profile">cq</property>
    21         <mapping resource="hibernateTest/Person.hbm.xml" />
    22 
    23     </session-factory>
    24 
    25 </hibernate-configuration>
    View Code

      hibernate.cfg.xml文件包括一个根元素<hibernate-configuration>,该元素有一个子元素<session-factory>,<session-factory>元素有两个子元素:<property>和<mapping>。

    • <property>元素用来指定数据库链接参数。有一个name属性,用来指定数据库连接参数的名字    
    • <mapping>元素用来指定所要用到的映射文件。有一个resource属性,用来指定所要用到的映射文件的名字及路径

      2) hibernate.properties

      详见:http://blog.csdn.net/dingherry/article/details/6798886

    持久化对象(Persistent Object)

      在Hibernate应用中,一个数据表对应一个持久化对象(PO)。PO实际上就是一个遵循一定规则的普通的JavaBean

     1 package hibernateTest;
     2 
     3 /**
     4  * Person entity. @author MyEclipse Persistence Tools
     5  */
     6 
     7 public class Person implements java.io.Serializable {
     8 
     9     // Fields
    10 
    11     private Integer id;
    12     private String name;
    13     private String sex;
    14     private String address;
    15 
    16     // Constructors
    17 
    18     /** default constructor */
    19     public Person() {
    20     }
    21 
    22     /** full constructor */
    23     public Person(String name, String sex, String address) {
    24         this.name = name;
    25         this.sex = sex;
    26         this.address = address;
    27     }
    28 
    29     // Property accessors
    30 
    31     public Integer getId() {
    32         return this.id;
    33     }
    34 
    35     public void setId(Integer id) {
    36         this.id = id;
    37     }
    38 
    39     public String getName() {
    40         return this.name;
    41     }
    42 
    43     public void setName(String name) {
    44         this.name = name;
    45     }
    46 
    47     public String getSex() {
    48         return this.sex;
    49     }
    50 
    51     public void setSex(String sex) {
    52         this.sex = sex;
    53     }
    54 
    55     public String getAddress() {
    56         return this.address;
    57     }
    58 
    59     public void setAddress(String address) {
    60         this.address = address;
    61     }
    62 
    63 }
    View Code

      该PO对应数据表person。四个字段:ID( int类型 )、Name( varchar类型 )、Sex( char类型 )、Address ( varchar类型 )。每个字段对应一对getter和setter方法

    映射文件 xxx.hbm.xml

      Hibernate映射文件把一个PO与一个数据表映射起来,每个表对应一个映射文件。

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     4 <!-- 
     5     Mapping file autogenerated by MyEclipse Persistence Tools
     6 -->
     7 <hibernate-mapping>
     8     <class name="hibernateTest.Person" table="person" catalog="test">
     9         <id name="id" type="java.lang.Integer">
    10             <column name="ID" />
    11             <generator class="identity" />
    12         </id>
    13         <property name="name" type="java.lang.String">
    14             <column name="Name" length="20" not-null="true" />
    15         </property>
    16         <property name="sex" type="java.lang.String">
    17             <column name="Sex" length="1" not-null="true" />
    18         </property>
    19         <property name="address" type="java.lang.String">
    20             <column name="Address" length="200" not-null="true" />
    21         </property>
    22     </class>
    23 </hibernate-mapping>
    View Code

      该文件将类Person和表person映射起来

    • <class>元素:定义一个持久化类,属性name表示指定持久化类的Java全限定名,table属性表示指定对应的数据表名,catalog属性表示数据库名
    • <id>元素:是<class>的一个子元素。定义了该属性到数据表主键字段的映射,name属性指定PO的标识属性的名字,type属性表示标识类型,column属性指定数据表的主键字段名字
    • <generator>元素:<id>的一个子元素。指定id标识的生成类的名字,class属性指定一个Java类的名字,为该持久化类的实例生成唯一的标识。(详见:http://blog.csdn.net/ye1992/article/details/19632001)
    • property元素:是<class>元素的一个子元素,为类声名一个持久化的属性。name属性指定属性的名字,小写开头;column属性指定对应数据表字段名;length属性指定属性的长度;type属性指定属性的Hibernate类型的名字( Hibernate基础属性 或 Java类 )

    Configuration类

      负责管理Hibernate配置信息。执行Configuration conf=new Configuration().configure()语句时,Hibernate自动在CLASSPATH中搜寻Hibernate配置文件;在Java Web应用中,则在WEB-INF/classes目录下搜寻配置文件。还可以指定配置文件的位置,如:

    File file=new File("C:\Users\Administrator\Desktop\dfd\Hibernate_Proj\src\hibernate.cfg.xml");
    Configuration cfg=new Configuration().configure(file);

    SessionFactory接口

      负责Session实例的创建,可通过Configuration创建SessionFactory

    Configuration cfg=new Configuration().configure();
    SessionFactory sf=cfg.buildSessionFactory();

      SessionFactory线程安全,可以被多线程调用以取得Session

    Session接口

      是应用程序与数据库之间的一个会话,是Hibernate运作中心,相当于JDBC中的Connection。通过SessionFactory创建

    Session session=SessionFactory.openSession();

      通过Session对象装载、保存、创建或查询持久化对象。

      1) 取得持久化对象

        get()方法:

    public Object get(Class entityClass,Serializable id)

        entityClass表明类的类型,id是对象的主键值,如果id是int类型,应通过new Integer(id)方法变成Integer对象。如:取得主键id为"1111"的user对象

    user=(User)session.get(User.class,new Integer(1111));

        get方法首先通过id在Session缓存中查找对象,存在即直接返回;在二级缓存中查找,找到就返回;从数据库中加载

        load()方法:

    user=(User)session.load(User.class,new Integer(1111));

        与get()的区别:立即加载对象且对象存在无区别,不存在get()返回null,load()弹出异常;延迟加载,get()以立即加载方式发送SQL,得到已初始化的对象,load()不发送SQL,返回代理对象,直到该对象被访问才被初始化

      2) 持久化对象保存、更新和删除方法

        save()方法

          将一个PO属性取出放入PreparedStatement语句中,并向数据库中插入记录。调用时,并不立即执行SQL语句,而等到清理完缓存才执行,若在清理缓存前修改了属性,则Hibernate将会发送update语句来持久化操作。调用save()方法将临时对象保存到数据库中,对象的临时状态将变成持久化状态,对象将一直位于Session的缓存中,对它的任何操作在事务提交时都会同步保存到数据库中

        update()方法

          用来更新脱管对象,并不立即发送SQL语句,对对象的更新操作将积累起来,事务提交发送一条SQL语句完成全部更新操作

        saveOrUpdate()方法

          不能对脱管对象使用save(),也不能对临时对象使用udpate(),saveOrUpdate()自行判断对象类型并调用相应的方法

        delete()方法

          删除一个对象(包括持久对象和脱管对象),并不立即发送SQL语句

    Query接口

      可从Session对象生成,如

    Query query=session.createQuery("from User u where u.username like ?")

      主要方法:

    • setXXX()方法:设置HQL中问号或变量的值。(setBinary、setBoolean、setFloat等等)
    • list()方法:返回查询结果,并把结果转变成List对象
    • excuteUpdate()方法:执行更新或删除语句

      setString(int position,String value):设置HQL中的“?”的值,position代表“?”在HQL中的位置,value设置"?"的值。如:

    Query query=session.createQuery("form User u where u.age>? and u.username like ?";
    query.setInteger(0,22);
    query.setString(1,"%Tom%“);

      setString(String paraName,String value):设置HQL中":"后跟变量的值,paraName代表HQL中":"后跟变量,value为该变量的值。如:

    Query query=session.createQuery("from User u where u.age>:minAge and u.username like:userName");
    query.setInteger("minAge",22);
    query.setString("userName","%Tom%");

      list()方法使用示例:

    Query query=session.createQuery("from User u where u.age>? ");
    query.setInteger(0,22);
    List list=query.list();
    for(int i=0;i<list.size();i++){
      user=(User)list.get(i);
      System.out.println(user.getUserName());    
    }

      excuteUpdate()方法使用示例:

    Query q=session.createQuery("delete from User");
    q.executeUpdate();

      一条语句就完成了批量删除操作,但删除后的数据还在缓存中

    Transaction接口

      可调用JTA或JDBC执行事务管理,运行与Session接口相关

    Transaction tx=session.beginTransaction();
    • commit():提交相关联的Session示例
    • rollback():撤销事务操作
    • wasCommitted():检察事务是否提交

    应用示例 简单增删改:http://pan.baidu.com/s/1sjqL7Bn

  • 相关阅读:
    Java设计模式-----装饰模式
    Java并发包中Lock的实现原理
    ThreadLocal,静态变量,实例变量,局部变量的线程安全
    ThreadLocal类详解
    SQL之LEFT JOIN,EIGHT JOIN,INSERT JOIN的区别
    Wireshark 、HTTPWatch、Fiddler的介绍
    TCP/IP、HTTP、Socket的区别
    我希望你并不幸福
    Autoregressive Convolutional Neural Networks for Asynchronous Time Series
    DRL Lecture1:Policy Gradient
  • 原文地址:https://www.cnblogs.com/cqq626/p/4330105.html
Copyright © 2020-2023  润新知