標籤:catch 控制台 out system source zab dial odi doctype
Hibernate是一個開源的ORM架構,顧名思義,它的核心思想即ORM(Object Relational Mapping,對象關係映射),可以通過對象來操作資料庫中的資訊,據說開發人員一開始是不太熟悉資料庫SQL語句的,這也造就了hibernate的強大之處,它不強求開發人員熟悉SQL語句也可以操作資料庫,hibernate可以自動產生SQL語句,自動執行。
利用hibernate可以讓開發人員完全使用面想對象思維來操作資料庫,所以接下來的示範不會有一句SQL語句,如果有的話,請當我這句話沒說!
本文使用hibernate實現了簡單的對一個person資料表的基本增刪改查操作。
準備工作
環境:win7+eclipse
工具包:hibernate包,可前往http://hibernate.org/orm/downloads/下載,本例中使用的是4版本;
資料庫連接驅動包,本例中使用的是mysql的
程式結構圖示
pojo層實體類
package demo.pojo;
public class Person {
private Integer id;
private String name;
private String gender;
private Integer age;
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 String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + "]";
}
}
核心設定檔hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<!-- 以下四行分別為:資料庫驅動類、Drivermanager擷取串連的參數URL、使用者名稱、密碼 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1/web?characterEcoding=utf-8</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!-- 設定方言,hibernate會根據資料庫的類型相應產生SQL語句 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 控制台顯示產生的sql語句,預設為false -->
<property name="show_sql">true</property>
<!-- 映射配置源檔案的位置 -->
<mapping resource="demo/pojo/Person.hbm.xml"/>
</session-factory>
</hibernate-configuration>
對應檔Person.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name是實體類全名,table為資料表名 -->
<class name="demo.pojo.Person" table="Person">
<id name="id" column="id">
<!-- 主鍵產生方式,native是讓hibernate自動識別 -->
<generator class="native"></generator>
</id>
<!--
注意點:
0.name值為實體類中屬性名稱,column為資料表中欄位名;
1.當實體類中屬性名稱與對應資料表欄位名相同時,後面的column可以省略,hibernate會自動匹配,例如下面age ;
2.反之當實體類中屬性名稱與對應資料表欄位名不相同時,兩項都要寫上,例如下面gender和sex
-->
<property name="name" column="name"></property>
<property name="gender" column="sex"></property>
<property name="age"></property>
</class>
</hibernate-mapping>
Session工廠類
package demo.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class HibernateSessionFactory {
private static SessionFactory factory;
private static ThreadLocal<Session> thread = new ThreadLocal<Session>();
private static String path = "hibernate.cfg.xml";
private static Configuration config = new Configuration();
static {
config.configure(path);
ServiceRegistry service = new ServiceRegistryBuilder()//定義一個服務註冊機
.applySettings(config.getProperties()).buildServiceRegistry();
factory = config.buildSessionFactory(service);//建立Session工廠類
}
/**
* 從hibernate的session工廠類裡建立一個session
* @return
* */
public static Session getSession() {
Session session = thread.get();
if(session == null || !session.isOpen()) {
session = factory.openSession();
thread.set(session);
}
return session;
}
public static void closeSession() {
Session session = thread.get();
if(session != null && session.isOpen()) {
session.close();
thread.set(null);
}
}
}
DAO層封裝資料各項操作的方法
package demo.dao;
import java.io.Serializable;
import org.hibernate.Session;
import org.hibernate.Transaction;
import demo.pojo.Person;
import demo.util.HibernateSessionFactory;
public class PersonDaoImpl {
//增刪改查,此處以增為例
public boolean add(Person p) {
Session session = HibernateSessionFactory.getSession();//建立Session
Transaction trans = session.beginTransaction();//開啟事務
try {
Serializable id = session.save(p);//添加記錄並擷取主索引值
System.out.println(id+"為擷取的主索引值");//控制台查看主索引值
trans.commit();//提交事務
return true;
} catch (Exception e) {
trans.rollback();//擷取異常,則交易回復
} finally {
HibernateSessionFactory.closeSession();//關閉Session
}
return false;
}
}
測試類別TestPerson
package demo.test;
import org.junit.Test;
import demo.dao.PersonDaoImpl;
import demo.pojo.Person;
public class TestPerson {
@Test
public void testAdd() {
//建立一個人類對象
Person p = new Person();
p.setName("張三");
p.setGender("男");
p.setAge(18);
//建立dao層類對象並調用添加方法
PersonDaoImpl dao = new PersonDaoImpl();
dao.add(p);
}
}
一顆簡單的hibernate栗子