Hibernate框架鏈接數據庫

Hibernate的優勢:java

一、Hibernate對JDBC訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。 mysql

二、Hibernate是一個基於jdbc的主流持久化框架,是一個優秀的orm實現,它很大程度的簡化了dao層編碼工做。 算法

三、Hibernate使用java的反射機制,而不是字節碼加強程序類實現透明性 sql

四、Hibernate的性能很是好,由於它是一個輕量級框架。映射的靈 活性很出色。它支持不少關係型數據庫,從一對一到多對多的各類複雜關係。數據庫

五、Hibernate使數據庫的操做徹底面向對象。而不是從前的面向關係進行操做。緩存

classpath下的hibernate.cfg.xmlsession

<?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="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernatedb</property>
        <property name="connection.username">root</property>
        <property name="connection.password">bdqn</property>
        <!-- 數據庫方言 -->
        <property name="dialect">
            org.hibernate.dialect.MySQL5Dialect
        </property>
        <!-- update  沒有表自動創建表
            validate  驗證表結構,若有改動,更新表結構
            create   每次運行都建立
            create-drop  每次建立,運行完銷燬
         -->
        <property name="hbm2ddl.auto">update</property>
        <!-- 顯示sql -->
        <property name="show_sql">true</property>
        <!-- 格式化sql語句 -->
        <property name="format_sql">true</property>
        <!-- 添加映射文件 -->
        <mapping resource="cn/bdqn/domain/Person.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

例:新建一個Person類(cn.bdqn.domain.Person.java)app

package cn.bdqn.domain;

public class Person {
    private Integer pid;
    private String pname;
    private Integer age;
    private String location;
    public Person() {
    }
    
    public Person(String pname, Integer age, String location) {
        this.pname = pname;
        this.age = age;
        this.location = location;
    }
    public Integer getPid() {
        return pid;
    }
    public void setPid(Integer pid) {
        this.pid = pid;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
    @Override
    public String toString() {
        return "Person [pid=" + pid + ", pname=" + pname + ", age=" + age
                + ", location=" + location + "]";
    }
}

cn.bdqn.domain.Person.hbm.xml框架

<?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>
    <!-- table 表名    -->
    <class name="cn.bdqn.domain.Person" table="person">
        <!-- 主鍵-->
        <id name="pid" column="pid" type="integer" length="11">
            <!-- 主鍵生成機制 
            Increment   每次增量爲1
            identity  須要數據庫支持自動增加
            Sequence  Oracle數據庫
            uuid     主鍵是string類型  128位的UUID算法來生成標識符
            assigned  手動設置主鍵 -->
            <generator class="identity"></generator>
        </id>
        <!--通常屬性 -->
        <property name="pname" type="string" length="50"></property>
        <property name="age" type="integer" length="20"></property>
        <property name="location" type="string"></property>
    </class>
</hibernate-mapping>

cn.bdqn.test.hbTest.javadom

package cn.bdqn.test;

import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Before;
import org.junit.Test;

import cn.bdqn.domain.Person;

public class hbTest {
    private SessionFactory factory;
    @Before
    public void getSessionFactory(){
        //1.加載配置文件 
        Configuration config = new Configuration();
        config.configure(); //默認加載classpath下的hibernate.cfg.xml
        //2.獲取sessionFactory
        factory = config.buildSessionFactory();
    }
    @Test
    public void test1(){
        //System.out.println(factory);
        //添加一條數據
        //3.獲取session
        Session session = factory.openSession();
        //4.開啓事務
        Transaction ts = session.beginTransaction();
        Person p1 = new Person("小王", 12, "天津市");
        session.save(p1); //臨時狀態 變爲持久狀態
        //session.clear(); //持久狀態變爲遊離狀態
        ts.commit();
        session.close();
    }
    //查詢
    @Test
    public void testFind(){
        //1.獲取session
        Session session = factory.openSession();
        Person per = (Person)session.get(Person.class, 2);//持久狀態
        System.out.println(per);
        session.close();
    }
    //刪除
    @Test
    public void testDelete(){
        //1.獲取session
        Session session = factory.openSession();
        Transaction ts = session.beginTransaction();
        Person p = new Person(); 
        p.setPid(1);
        session.delete(p);
        ts.commit();
        session.close();
    }
    //更新
    @Test
    public void testUpdate(){
        //1.獲取session
        Session session = factory.openSession();
        Transaction ts = session.beginTransaction();
        Person p = new Person();
        p.setPid(2);
        p.setAge(48);
        p.setLocation("北京市");
        p.setPname("老張");
        session.update(p);
        ts.commit();
        session.close();
    }
    //查詢全部
    @Test
    public void testFindPersons(){
        Session session = factory.openSession();
        List<Person> plist = session.createQuery("from Person").list();
        System.out.println(plist);
        session.close();
    }    
}

hibernate中對象的狀態

1.瞬時狀態(臨時狀態)

不處於 Session 的緩存中,在數據庫中沒有對應的記錄

2.持久狀態

調用save(),get(),load(),update(),saveOrUpdate() 將java對象的狀態變成持久化狀態

3.遊離狀態

clear(),close(),evict(); 不在session緩存中 通常由持久化狀態轉變,數據庫中可能有對應的記錄

相關文章
相關標籤/搜索