zoukankan      html  css  js  c++  java
  • Hibernate入门总结

    一.Hibernate简介

    Hibernate 将 Java 类映射到数据库表中,从 Java 数据类型中映射到 SQL 数据类型中,并把开发人员从 95% 的公共数据持续性编程工作中解放出来。

    二.Hibernate架构

     配置对象

    1.SessionFactory 对象

    配置对象被用于创造一个 SessionFactory 对象,使用提供的配置文件为应用程序依次配置 Hibernate,并允许实例化一个会话对象。SessionFactory 是一个线程安全对象并由应用程序所有的线程所使用。

    SessionFactory 是一个重量级对象所以通常它都是在应用程序启动时创造然后留存为以后使用。每个数据库需要一个 SessionFactory 对象使用一个单独的配置文件。所以如果你使用多种数据库那么你要创造多种 SessionFactory 对象。

    2.Session 对象

    一个会话被用于与数据库的物理连接。Session 对象是轻量级的,并被设计为每次实例化都需要与数据库的交互。持久对象通过 Session 对象保存和检索。

    Session 对象不应该长时间保持开启状态因为它们通常情况下并非线程安全,并且它们应该按照所需创造和销毁。

    3.Transaction 对象

    一个事务代表了与数据库工作的一个单元并且大部分 RDBMS 支持事务功能。在 Hibernate 中事务由底层事务管理器和事务(来自 JDBC 或者 JTA)处理。

    这是一个选择性对象,Hibernate 应用程序可能不选择使用这个接口,而是在自己应用程序代码中管理事务。

    4.Query 对象

    Query 对象使用 SQL 或者 Hibernate 查询语言(HQL)字符串在数据库中来检索数据并创造对象。一个查询的实例被用于连结查询参数,限制由查询返回的结果数量,并最终执行查询。

    5.Criteria 对象

    Criteria 对象被用于创造和执行面向规则查询的对象来检索对象。

    三.Hibernate 映射文件

    1.实体类

    public class Employee {
        private int id;
        private String firstName; 
        private String lastName;   
        private int salary;  
    
        public Employee() {}
        public Employee(String fname, String lname, int salary) {
            this.firstName = fname;
            this.lastName = lname;
            this.salary = salary;
        }
        public int getId() {
            return id;
        }
        public void setId( int id ) {
            this.id = id;
        }
        public String getFirstName() {
            return firstName;
        }
        public void setFirstName( String first_name ) {
            this.firstName = first_name;
        }
        public String getLastName() {
            return lastName;
        }
        public void setLastName( String last_name ) {
            this.lastName = last_name;
        }
        public int getSalary() {
            return salary;
        }
        public void setSalary( int salary ) {
            this.salary = salary;
        }
    }

    2.表结构

    create table EMPLOYEE (
        id INT NOT NULL auto_increment,
        first_name VARCHAR(20) default NULL,
        last_name  VARCHAR(20) default NULL,
        salary     INT  default NULL,
        PRIMARY KEY (id)
    );

    3.映射文件

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD//EN"
     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
    
    <hibernate-mapping>
       <class name="Employee" table="EMPLOYEE">
          <meta attribute="class-description">
             This class contains the employee detail. 
          </meta>
          <id name="id" type="int" column="id">
             <generator class="native"/>
          </id>
          <property name="firstName" column="first_name" type="string"/>
          <property name="lastName" column="last_name" type="string"/>
          <property name="salary" column="salary" type="int"/>
       </class>
    </hibernate-mapping>

    四.Hibernate注释

    Hibernate 注释是无需使用 XML 文件来定义映射的最新方法。你可以额外使用注释或直接代替 XML 映射元数据。

    1.表

    create table EMPLOYEE (
       id INT NOT NULL auto_increment,
       first_name VARCHAR(20) default NULL,
       last_name  VARCHAR(20) default NULL,
       salary     INT  default NULL,
       PRIMARY KEY (id)
    );

    2.实体类

    import javax.persistence.*;
    
    @Entity
    @Table(name = "EMPLOYEE")
    public class Employee {
       @Id @GeneratedValue
       @Column(name = "id")
       private int id;
    
       @Column(name = "first_name")
       private String firstName;
    
       @Column(name = "last_name")
       private String lastName;
    
       @Column(name = "salary")
       private int salary;  
    
       public Employee() {}
       public int getId() {
          return id;
       }
       public void setId( int id ) {
          this.id = id;
       }
       public String getFirstName() {
          return firstName;
       }
       public void setFirstName( String first_name ) {
          this.firstName = first_name;
       }
       public String getLastName() {
          return lastName;
       }
       public void setLastName( String last_name ) {
          this.lastName = last_name;
       }
       public int getSalary() {
          return salary;
       }
       public void setSalary( int salary ) {
          this.salary = salary;
       }
    }

    五.Hibernate 查询语言(HQL)

    1.FROM 语句

    String hql = "FROM Employee";
    Query query = session.createQuery(hql);
    List results = query.list();

    2.AS 语句

    String hql = "FROM Employee AS E";
    Query query = session.createQuery(hql);
    List results = query.list();

    3.SELECT 语句

    String hql = "SELECT E.firstName FROM Employee E";
    Query query = session.createQuery(hql);
    List results = query.list();

    4.WHERE 语句

    String hql = "FROM Employee E WHERE E.id = 10";
    Query query = session.createQuery(hql);
    List results = query.list();

    5.ORDER BY 语句

    String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
    Query query = session.createQuery(hql);
    List results = query.list();

    6.GROUP BY 语句

    String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
                 "GROUP BY E.firstName";
    Query query = session.createQuery(hql);
    List results = query.list();

    7.使用命名参数

    String hql = "FROM Employee E WHERE E.id = :employee_id";
    Query query = session.createQuery(hql);
    query.setParameter("employee_id",10);
    List results = query.list();

    8.UPDATE 语句

    String hql = "UPDATE Employee set salary = :salary "  + 
                 "WHERE id = :employee_id";
    Query query = session.createQuery(hql);
    query.setParameter("salary", 1000);
    query.setParameter("employee_id", 10);
    int result = query.executeUpdate();
    System.out.println("Rows affected: " + result);

    9.DELETE 语句

    String hql = "DELETE FROM Employee "  + 
                 "WHERE id = :employee_id";
    Query query = session.createQuery(hql);
    query.setParameter("employee_id", 10);
    int result = query.executeUpdate();
    System.out.println("Rows affected: " + result);

    10.INSERT 语句

    String hql = "INSERT INTO Employee(firstName, lastName, salary)"  + 
                 "SELECT firstName, lastName, salary FROM old_employee";
    Query query = session.createQuery(hql);
    int result = query.executeUpdate();
    System.out.println("Rows affected: " + result);

    11.聚合方法

    12.使用分页查询

    String hql = "FROM Employee";
    Query query = session.createQuery(hql);
    query.setFirstResult(1);
    query.setMaxResults(10);
    List results = query.list();

    六.Hibernate 标准查询

    1.标准查询

    Criteria cr = session.createCriteria(Employee.class);  
    List results = cr.list();  

    2.对标准的限制

    Criteria cr = session.createCriteria(Employee.class);    
    cr.add(Restrictions.eq("salary", 2000));    
    List results = cr.list();

     3.以下是几个例子

    Criteria cr = session.createCriteria(Employee.class);
    
    // To get records having salary more than 2000
    cr.add(Restrictions.gt("salary", 2000));
    
    // To get records having salary less than 2000
    cr.add(Restrictions.lt("salary", 2000));
    
    // To get records having fistName starting with zara
    cr.add(Restrictions.like("firstName", "zara%"));
    
    // Case sensitive form of the above restriction.
    cr.add(Restrictions.ilike("firstName", "zara%"));
    
    // To get records having salary in between 1000 and 2000
    cr.add(Restrictions.between("salary", 1000, 2000));
    
    // To check if the given property is null
    cr.add(Restrictions.isNull("salary"));
    
    // To check if the given property is not null
    cr.add(Restrictions.isNotNull("salary"));
    
    // To check if the given property is empty
    cr.add(Restrictions.isEmpty("salary"));
    
    // To check if the given property is not empty
    cr.add(Restrictions.isNotEmpty("salary"));

    4.你可以模仿以下示例,使用逻辑表达式创建 AND 或 OR 的条件组合:

    Criteria cr = session.createCriteria(Employee.class);
    
    Criterion salary = Restrictions.gt("salary", 2000);
    Criterion name = Restrictions.ilike("firstNname","zara%");
    
    // To get records matching with OR condistions
    LogicalExpression orExp = Restrictions.or(salary, name);
    cr.add( orExp );
    
    // To get records matching with AND condistions
    LogicalExpression andExp = Restrictions.and(salary, name);
    cr.add( andExp );
    
    List results = cr.list();

    5.分页使用标准

    Criteria cr = session.createCriteria(Employee.class);
    cr.setFirstResult(1);
    cr.setMaxResults(10);
    List results = cr.list();

    6.排序结果

    Criteria cr = session.createCriteria(Employee.class);
    // To get records having salary more than 2000
    cr.add(Restrictions.gt("salary", 2000));
    
    // To sort records in descening order
    crit.addOrder(Order.desc("salary"));
    
    // To sort records in ascending order
    crit.addOrder(Order.asc("salary"));
    
    List results = cr.list();  

    7.预测与聚合

    Criteria cr = session.createCriteria(Employee.class);
    
    // To get total row count.
    cr.setProjection(Projections.rowCount());
    
    // To get average of a property.
    cr.setProjection(Projections.avg("salary"));
    
    // To get distinct count of a property.
    cr.setProjection(Projections.countDistinct("firstName"));
    
    // To get maximum of a property.
    cr.setProjection(Projections.max("salary"));
    
    // To get minimum of a property.
    cr.setProjection(Projections.min("salary"));
    
    // To get sum of a property.
    cr.setProjection(Projections.sum("salary"));  

    七.Hibernate 原生 SQL

    1.标量查询

    String sql = "SELECT first_name, salary FROM EMPLOYEE";
    SQLQuery query = session.createSQLQuery(sql);
    query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
    List results = query.list();

    2.实体查询

    String sql = "SELECT * FROM EMPLOYEE";
    SQLQuery query = session.createSQLQuery(sql);
    query.addEntity(Employee.class);
    List results = query.list(); 

    3.指定 SQL 查询

    String sql = "SELECT * FROM EMPLOYEE WHERE id = :employee_id";
    SQLQuery query = session.createSQLQuery(sql);
    query.addEntity(Employee.class);
    query.setParameter("employee_id", 10);
    List results = query.list();  
  • 相关阅读:
    Flash特效 嘿嘿
    惨,被骗了20年
    “不允许对64位应用程序进行修改”的解决方法 “Changes to 64bit applications are not allowed.”
    清除Sql Server数据库日志
    .Net 序列化(去除默认命名空间,添加编码)
    【Vegas原创】X connection to localhost:11.0 broken (explicit kill or server shutdown)解决方法
    【Vegas原创】通过WMIC命令远程打开远程计算机的远程桌面(Remote Desktop)功能
    【Vegas原创】ORA12638: 身份证明检索失败的解决办法
    【Vegas原创】SQL Server 阻止了对组件 'SQL Mail XPs' 的 过程'sys.xp_sendmail' 的访问的解决方法
    【Vegas原创】获取SQL Server处理语句的时间(毫秒)
  • 原文地址:https://www.cnblogs.com/wuwuyong/p/12600062.html
Copyright © 2011-2022 走看看