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緩存中 通常由持久化狀態轉變,數據庫中可能有對應的記錄