初識Hiberante框架和第一個案例

今天想回顧一下一個月前學的hibernate框架,也讓我瞭解了持久層的概念(訪問數據庫).java

1、ORM概念

首先提的是ORM概念,O表示Object,mysql

R表示Relation(關係),關係型數據庫,如mysql,oracle等,M表示mapping,ORM連起來對象關係映射.sql

Hibernate 實現了ORM,解決了兩個問題:一是存儲:把對象的數據直接保存到數據庫中,二是獲取,直接從數據庫中拿到一個對象,中間必須經過映射這個概念數據庫

2、Hibernate HelloWorld案例

搭建一個Hibernate環境,開發步驟:session

1. 下載源碼oracle

         版本:hibernate-distribution-3.6.0.Finalapp

2. 引入jar文件框架

         hibernate3.jar核心  +  required 必須引入的(6個) +  jpa 目錄  + 數據庫驅動包ide

以下圖:sqlserver

 

3. 寫對象以及對象的映射

         Employee.java            對象

         Employee.hbm.xml        對象的映射 (映射文件)

4. src/hibernate.cfg.xml  主配置文件

         -à 數據庫鏈接配置

         -à 加載所用的映射(*.hbm.xml)

5. App.java  測試

Employee.java對象

package cn.itcast.a_hello;

import java.util.Date;

public class Employee {
    
    private int empId;
    private String empName;
    public int getEmpId() {
        return empId;
    }
    public void setEmpId(int empId) {
        this.empId = empId;
    }
    public String getEmpName() {
        return empName;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }
    public Date getEmpDate() {
        return empDate;
    }
    public void setEmpDate(Date empDate) {
        this.empDate = empDate;
    }
    private Date empDate;
    public Employee() {
        // TODO Auto-generated constructor stub
    }
    @Override
    public String toString() {
        return "Employee [empId=" + empId + ", empName=" + empName
                + ", empDate=" + empDate + "]";
    }

}

Employee.hbm.xml配置文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM
  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  
<hibernate-mapping package="cn.itcast.a_hello">
    <class name="Employee" table="employee">
        <!-- 主鍵映射值 -->
          <id name="empId" column="id">
          <generator class="native">
          </generator>
          </id>
          
          <!-- 非主鍵映射 -->
          <property name="empName" column="empName"></property>
          <property name="empDate" column="empDate"></property>
    </class>
</hibernate-mapping>

hibernate.cfg.xml主配置文件

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory name="foo">
        
        <!-- 數據庫鏈接配置 -->
        <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
        <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;DatabaseName=Employee</property>
        <property name="hibernate.connection.username">sa</property>
        <property name="hibernate.connection.password">XXXXXX</property>
        <property name="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
        <!-- 2.其它配置設置 -->
        <!-- 2.1設置運行時是否顯示執行的sql語句 -->
        <property name="show_sql">true</property>
        
        <!-- 2.2設置運行的sql語句格式化 -->
        <property name="hibernate.format_sql">true</property>
        
        <!-- 2.3設置是否建立表
            1.create不存在表直接建立,存在則先刪除表再建立表
            2.update若是存在就不會建立表,若是不存在則建立
            3.create-drop createSessionFactory()時建立表
                    sf.close()刪除表
         -->
        <property name="hibernate.hbm2ddl.auto">create</property>
        <!-- 加載全部映射 
        <mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>-->
    </session-factory>
</hibernate-configuration>

最後的效果:

最後看到數據庫多了一條記錄

 

3、Hibeanate的API

 

|-- Configuration       配置管理類對象

         config.configure();    加載主配置文件的方法(hibernate.cfg.xml)

                                                        默認加載src/hibernate.cfg.xml

         config.configure(「cn/config/hibernate.cfg.xml」);   加載指定路徑下指定名稱的主配置文件

         config.buildSessionFactory();   建立session的工廠對象

 

|-- SessionFactory     session的工廠(或者說表明了這個hibernate.cfg.xml配置文件)

         sf.openSession();   建立一個sesison對象

         sf.getCurrentSession();  建立session或取出session對象

 

|--Session       session對象維護了一個鏈接(Connection), 表明了與數據庫鏈接的會話。

                               Hibernate最重要的對象: 只用使用hibernate與數據庫操做,都用到這個對象

                   session.beginTransaction(); 開啓一個事務; hibernate要求全部的與數據庫的操做必須有事務的環境,不然報錯!

 

更新:

         session.save(obj);   保存一個對象

         session.update(emp);  更新一個對象

         session.saveOrUpdate(emp);  保存或者更新的方法:

                                                                 à沒有設置主鍵,執行保存;

à有設置主鍵,執行更新操做;

à若是設置主鍵不存在報錯!

 配置SessfionFactory

    private static SessionFactory sf;
    
    //加載配置文件,只執行一次
    static{
        /**
         * 建立SessionFactory對象,指定了class對象後就
         * 能夠不用在主配置文件中指定<mapping resource=""/>
         */
        
        sf = new Configuration()
        .configure()
        .addClass(Employee.class)//(測試)會自動加載Employee.hbm.xml文件,必須和該類在同一包下
        .buildSessionFactory();
        
    }

測試保存:

@Test
    public void testSave() throws Exception{
        // TODO Auto-generated method stub
        //對象
        Employee emp = new Employee();
        emp.setEmpName("張三");
        emp.setEmpDate(new Date());
        
    
        
    
        Session session = sf.openSession();
        
        //開啓事務alt+shift+l快速生成左邊的變量,但鼠標要放在放在方法後面
         Transaction tx = session.beginTransaction();
        //保存到數據庫
        session.save(emp);
//         session.createQuery("from cn.itcast.c_hbm_config.Employee").list();
        //提交事務
        tx.commit();
        session.close();
        
    }

測試更新

@Test
    public void testUpdate()
    {
        //對象
        Employee emp = new Employee();
        emp.setEmpName("李四2");
        emp.setEmpId(4);
        
        //1.建立session
        Session session = sf.openSession();
        
        //2.開啓事務
        Transaction tx = session.beginTransaction();
        //3.執行更新操做,必須設置主鍵
        //session.update(emp);
        
        //根據主鍵獲得對應的對象
        Employee employee = (Employee) session.get(Employee.class, 5);
        System.out.println(employee);
        
        //save或者update,當設置主鍵時,執行更新操做,當沒有設置主鍵時執行插入操做
        session.saveOrUpdate(emp);
        tx.commit();
        session.close();
    }

 

4、三種方式查詢

1、主鍵查詢:

         session.get(Employee.class, 1);    主鍵查詢

session.load(Employee.class, 1);   主鍵查詢 (支持懶加載)

 例如:

    @Test
    public void testGet()
    {
        Session session = sf.openSession();
        //2.開啓事務
        Transaction tx = session.beginTransaction();
        Employee emp = (Employee) session.get(Employee.class,5);
        System.out.println(emp);
        tx.commit();
        session.close();
    }

 

 

2、HQL查詢:

         HQL查詢與SQL查詢區別:

                   SQL: (結構化查詢語句)查詢的是表以及字段;  不區分大小寫。

                   HQL: hibernate  query  language 即hibernate提供的面向對象的查詢語言

                            查詢的是對象以及對象的屬性。

                            區分大小寫。優勢跨平臺

//HQL查詢
    @Test
    public void testSQL()
    {
        //1.建立session
        Session session = sf.openSession();
        //2.開啓事務
        Transaction tx = session.beginTransaction();
        Query q = session.createQuery("from Employee where id= 2 or id=5");
    
        List<Employee> list = q.list();
        System.out.println(list);
        tx.commit();
        session.close();

    }

 

3、Criteria查詢:

          徹底面向對象的查詢。

 

    @Test
        public void testCRQ()
        {
            //1.建立session
            Session session = sf.openSession();
            //2.開啓事務
            Transaction tx = session.beginTransaction();
            Criteria crita = session.createCriteria(Employee.class);
            //查詢條件
            crita.add(Restrictions.eq("id", 8));
            List<Employee> list = crita.list();
            System.out.println(list);
            tx.commit();
            session.close();

        }

 

4、本地SQL查詢:

         複雜的查詢,就要使用原生態的sql查詢,也能夠,就是本地sql查詢的支持!

         (缺點: 不能跨數據庫平臺!)

 //本地SQL查詢
    @Test
    public void testSQL()
    {
        //1.建立session
        Session session = sf.openSession();
        //2.開啓事務
        Transaction tx = session.beginTransaction();
        SQLQuery se = session.createSQLQuery("select * from employee");
        //查詢條件
    
        List<Employee> list = se.list();
        System.out.println(list);
        tx.commit();
        session.close();
    
    }

Hibernate 實現分頁查詢

//HQL實現分頁查詢
    @Test
    public void testFenYe()
    {
        //1.建立session
        Session session = sf.openSession();
        //2.開啓事務
        Transaction tx = session.beginTransaction();
        Query query = session.createQuery("from Employee");
        //設置分頁參數.起始從零開始
        query.setFirstResult(0);//查詢的起始記錄
        query.setMaxResults(4);//查詢的記錄數
        List<Employee> list = query.list();
        System.out.println(list);
        tx.commit();
        session.close();
    
    }

 

 值得注意的問題:

 

共性問題1:

         ClassNotFoundException…., 缺乏jar文件!

問題2:

         若是程序執行程序,hibernate也有生成sql語句,但數據沒有結果影響。

         問題通常是事務忘記提交…….

遇到問題,必定看錯誤提示!

相關文章
相關標籤/搜索