[開源項目]Hibernate基本使用

開源項目(1)Hibernate基本使用

Hibernate介紹java

Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了很是輕量級的對象封裝,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。 mysql

官網  http://hibernate.org/ ios

如下爲其原理和基本的結構示意圖程序員

 

一步一步簡單講述其基本應用sql

一、建立java項目,添加hibernate引用數據庫

下載地址:編程

https://sourceforge.net/projects/hibernate/files/hibernate-orm/session

下載的完整版本,直接在lib/required中的jar包導入架構

 

二、導入數據庫鏈接器併發

我使用的是Mysql數據庫,你們能夠在如下下載,而後導入鏈接器

http://dev.mysql.com/downloads/connector/j/

 

三、建立數據表

create table students(
    id int primary key not null,
    name nvarchar(50),
    age int
)

 

四、建立實體類

建議實體類符合JavaBean標準,字段、get、set方法,還有默認構造函數。

package yank.hibernate.sample;

/**
 * 學生信息
 * @author yank
 *
 */
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    
    /**
     * 無參構造函數
     */
    public Student(){
        
    }
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

 

五、配置實體與表的映射關係

非持久化的屬性,不要在這裏聲明。這裏的type並不是java的類型或者sql的類型,而是hibernate定義的映射類型,若是未設置,hibernate會自動給一合適的類型。

最好安裝hibernate的eclipse插件,可能更方便點

http://marketplace.eclipse.org/content/hibernate-tools-helios

<?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 package="yank.hibernate.sample">    
    <class name="Student" table="students">  
        <id name="id" column="id">  
            <generator class="increment" /> <!-- 標識符生成策略 --> 
        </id>  
        <property name="name" type="string" column="name" />  
        <property name="age" type="int" column="age" />  
    </class>    
</hibernate-mapping> 

這裏的類型,應該是Hibernate-Types,這樣能夠實現JAVA類型與數據庫類型的轉換。若是沒有找到匹配類型,Hibernate會自動斷定給一合適類型。

注意:使用最後一列(Registry Key)的值便可。

 

六、建立hibernate的配置文件

這裏就須要配置hibernate如何訪問數據庫,包括鏈接驅動,鏈接地址、用戶名、密碼,鏈接池大小等。而且在這裏將配置映射文件

文件建立在srv根目錄下。

<?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="myeclipse.connection.profile">mysql</property>    
        <property name="connection.url">    
            jdbc:mysql://localhost:3306/test     
        </property>    
        <property name="connection.username">root</property>    
        <property name="connection.password">admin</property>    
        <property name="connection.driver_class">    
            com.mysql.jdbc.Driver     
        </property>    
        <property name="dialect">    
            org.hibernate.dialect.MySQLDialect     
        </property>    
        <property name="show_sql">true</property>    
        
        <!-- 映射資源 --> 
        <mapping resource="yank/hibernate/sample/student.hbm.xml" /> 
    </session-factory>
</hibernate-configuration>

SessionFactory- 一個關聯於特定數據庫全局性的工廠(factory)。若是你要使用多個數據庫,一般應該在多個配置文件中使用多個<session-factory>進行配置

七、從配置文件加載SessionFactory

package yank.hibernate.sample;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * hibernate工具類
 * @author yank
 *
 */
public class HibernateUtils {
    private static final SessionFactory sessionFactory = buildSessionFactory();  
    
    private static SessionFactory buildSessionFactory() {  
        try {  
            // Create the SessionFactory from hibernate.cfg.xml  
            return new Configuration().configure().buildSessionFactory();  
        }  
        catch (Throwable ex) {  
            // Make sure you log the exception, as it might be swallowed  
            System.err.println("Initial SessionFactory creation failed." + ex);  
            throw new ExceptionInInitializerError(ex);  
        }  
    }  
  
    public static SessionFactory getSessionFactory() {  
        return sessionFactory;  
    } 
}

八、基本功能測試,簡單的CRUD能夠實現了

package yank.hibernate.sample;

import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session;

public class StudentManager {
    public static void main(String[] args){
        //新增
        StudentManager stuMgr = new StudentManager();
        stuMgr.createStudent("LiLei", 20);
        
        //查詢
        Student student = stuMgr.findById(1);
        
        //編輯,保存
        student.setAge(21);
        stuMgr.update(student);
        
        //查詢全部
        Student last = null;
        List stuList = stuMgr.findList();
        for(Object item : stuList){
            System.out.println(((Student)item).getName());
            last = (Student)item;
        }
        
        //刪除
        stuMgr.delete(last);        
    }
    /**
     * 新增
     * @param id
     * @param name
     * @param age
     */
    public void createStudent(String name,Integer age){
        Student student = new Student();
        student.setName(name);
        student.setAge(age);
        this.save(student);
    }
    /**
     * 保存
     * @param student
     */
    public void save(Student student){
        Session session = HibernateUtils.getSessionFactory().openSession();
        session.beginTransaction();
        session.save(student);
        session.getTransaction().commit();
        session.close();
    }
    /**
     * 更新
     * @param student
     */
    public void update(Student student){
        Session session = HibernateUtils.getSessionFactory().openSession();
        session.beginTransaction();
        session.update(student);
        session.getTransaction().commit();
        session.close();
    }
    /**
     * 根據id查詢
     * @param stuId
     * @return
     */
    public Student findById(Integer stuId){
        Session session = HibernateUtils.getSessionFactory().openSession();
        Student student = session.get(Student.class, stuId);
        session.close();
        return student;
    }
    /**
     * 查詢集合
     */
    public List findList(){        
        Session session = HibernateUtils.getSessionFactory().openSession();        
        SQLQuery qry = session.createSQLQuery(" select * from Students").addEntity(Student.class);
        List list = qry.list();
        session.close();
        return list;
    }
    /**
     * 刪除
     * @param 學生對象
     */
    public void delete(Student student){
        Session session = HibernateUtils.getSessionFactory().openSession();
        session.beginTransaction();
        session.delete(student);
        session.getTransaction().commit();
        session.close();
    }
}

 

九、其餘:

查詢List時報異常

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to yank.hibernate.sample.Student

代碼以下:

    /**
     * 查詢集合
     */
    public List findList(){        
        Session session = HibernateUtils.getSessionFactory().openSession();
        SQLQuery qry = session.createSQLQuery(" select * from Students");
        List list = qry.list();
        session.close();
        return list;
    }

緣由:

查詢出來的對象不能自動轉爲JavaBean對象 

解決方案:

利用addEntity,增長類型映射。

    /**
     * 查詢集合
     */
    public List findList(){        
        Session session = HibernateUtils.getSessionFactory().openSession();        
        SQLQuery qry = session.createSQLQuery(" select * from Students").addEntity(Student.class);
        List list = qry.list();
        session.close();
        return list;
    }

  

JPA:

JPA全稱Java Persistence API.JPA經過JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中。

Sun引入新的JPA ORM規範出於兩個緣由:其一,簡化現有Java EE和Java SE應用開發工做;其二,Sun但願整合ORM技術,實現天下歸一。

JPA 是 JCP 組織發佈的 Java EE 標準之一,所以任何聲稱符合 JPA 標準的框架都遵循一樣的架構,提供相同的訪問API,這保證了基於JPA開發的企業應用可以通過少許的修改就可以在不一樣的JPA框架下運行。
JPA框架中支持大數據集、事務、併發等容器級事務,這使得 JPA 超越了簡單持久化框架的侷限,在企業應用發揮更大的做用。

Hibernate是在版本3.2後遵循JPA標準的。

相關文章
相關標籤/搜索