hibernate4的優(yōu)勢:
對(duì)跨數(shù)據(jù)庫熙掺、事務(wù)封裝匪补、ORM映射佑钾、延遲加載等細(xì)節(jié)技術(shù)提供了完善的解決方案西疤,同時(shí)也對(duì)一些在程序開發(fā)中容易忽略的問題進(jìn)行了良好的封裝和規(guī)劃。
- 通過使用ORM(Object-Relational Mapping)映射休溶,以Bean的形式操作數(shù)據(jù)庫中的記錄
- 強(qiáng)大的一級(jí)代赁、二級(jí)緩存機(jī)制結(jié)合數(shù)據(jù)庫連接池POOL,使CURD的操作效率得到很大提升
- 可以將系統(tǒng)中大量的SQL語句放入XML中進(jìn)行統(tǒng)一管理兽掰,方便項(xiàng)目的總體設(shè)計(jì)及維護(hù)修改
- 項(xiàng)目融入Hibernate后芭碍,可以更加地面向OOP編程,以面向?qū)ο蟮姆绞剿伎汲绦虻慕Y(jié)構(gòu)框架
可以點(diǎn)擊鏈接下載hibernate最新版: hibernate官網(wǎng)
持久化孽尽、持久層窖壕、ORM
持久化就是把數(shù)據(jù)保存在可掉電的存儲(chǔ)介質(zhì)上。持久層的設(shè)計(jì)目標(biāo)是為整個(gè)項(xiàng)目提供一個(gè)銜接高低層、統(tǒng)一瞻讽、安全和并發(fā)的數(shù)據(jù)持久機(jī)制狐蜕,完成對(duì)各種數(shù)據(jù)庫進(jìn)行持久化的編程工作,并為系統(tǒng)業(yè)務(wù)邏輯層提供服務(wù)卸夕。數(shù)據(jù)持久層提供了數(shù)據(jù)訪問的方法层释,不需要程序員手動(dòng)寫程序去訪問數(shù)據(jù)持久層,專注于業(yè)務(wù)邏輯的開發(fā)快集。并且能在不同的項(xiàng)目中重用映射框架贡羔,大大簡化了數(shù)據(jù)增、刪个初、改乖寒、查等功能的開發(fā)。而ORM的概念是數(shù)據(jù)持久層的一種子實(shí)現(xiàn)院溺,它通過映射的機(jī)制楣嘁,把數(shù)據(jù)庫中的一條記錄當(dāng)成一個(gè)java的一個(gè)class(Bean)處理。在CURD的處理上真正實(shí)現(xiàn)了面向?qū)ο箝_發(fā)珍逸,大大縮短了后期軟件的維護(hù)周期逐虚。
Hibernate實(shí)戰(zhàn)小程序
假設(shè)數(shù)據(jù)庫中有一個(gè)用戶表,有如下幾個(gè)字段:ID,name,sex,address,school,email
我們需要這樣一個(gè)實(shí)體類:
class MyBean implements Serializable{
private String id;
private String name;
private String sex;
private String address;
private String school;
private String email;
public MyBean(){}
//...省略getter谆膳、setter方法
}
需要注意的是:實(shí)體類必須要繼承java.io.serializable方法叭爱,而且需要有個(gè)參數(shù)為空的構(gòu)造方法。
實(shí)戰(zhàn)小程序的起點(diǎn):
本文使用的IDEA構(gòu)建Java程序漱病,然后使用Hibernate的方式操控Mysql數(shù)據(jù)庫
首先新建一個(gè)表买雾,下面是我所建表的結(jié)構(gòu),表名為userinfo
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | NO | | NULL | |
| sex | char(4) | NO | | NULL | |
| address | varchar(100) | YES | | NULL | |
| school | varchar(100) | YES | | NULL | |
| email | varchar(50) | YES | | NULL | |
+---------+--------------+------+-----+---------+----------------+
創(chuàng)建與數(shù)據(jù)庫表表項(xiàng)對(duì)應(yīng)的Bean杨帽,也就是類
import java.io.Serializable;
/**
* Created by Sherlock on 2/28/2017.
*/
public class UserBean implements Serializable{
/*ID,name,sex,address,school,email*/
private int user_id;
private String user_name;
private String sex;
private String address;
private String school;
private String email;
public UserBean(){
}
public void setUser_id(int id){
this.user_id = id;
}
public void setUser_name(String name){
this.user_name = name;
}
public void setSex(String sex){
this.sex = sex;
}
public void setAddress(String address){
this.address = address;
}
public void setSchool(String school){
this.school = school;
}
public void setEmail(String email){
this.email = email;
}
public int getUser_id(){
return this.user_id;
}
public String getUser_name(){
return this.user_name;
}
public String getSex(){
return this.sex;
}
public String getAddress(){
return this.address;
}
public String getSchool(){
return this.school;
}
public String getEmail(){
return this.email;
}
}
配置數(shù)據(jù)庫信息漓穿,注意數(shù)據(jù)庫連接數(shù)據(jù)的正確性,也就是hibernate.cfg.xml文件
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property
name="hibernate.connection.username">root</property>
<property
name="hibernate.connection.password">sa</property>
<property
name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property
name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_stu?useSSL=true</property>
<property
name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="hibernate.hbm.xml"/>
</session-factory>
</hibernate-configuration>
然后配置相應(yīng)的hibernate.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>
<class name="com.blaze.hibernate_stu.beans.UserBean" table="userinfo">
<id name="user_id" type="java.lang.Integer">
<column name="id"/>
</id>
<property name="user_name" type="java.lang.String">
<column name="name"/>
</property>
<property name="sex" type="java.lang.String">
<column name="sex"/>
</property>
<property name="address" type="java.lang.String">
<column name="address"/>
</property>
<property name="school" type="java.lang.String">
<column name="school"/>
</property>
<property name="email" type="java.lang.String">
<column name="email"/>
</property>
</class>
<!--ID,name,sex,address,school,email-->
</hibernate-mapping>
再然后通過一個(gè)類來生成Configuration對(duì)象注盈,并且構(gòu)建出SessionFactory對(duì)象最后得到Session晃危。我們通過Transaction事務(wù)對(duì)象來完成進(jìn)行事務(wù)操作,注意使用Session對(duì)象來進(jìn)行save操作当凡,使用Transaction對(duì)象來提交事務(wù)山害。
import com.blaze.hibernate_stu.beans.UserBean;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
/**
* Created by Sherlock on 2/28/2017.
*/
public class GetSession {
private Configuration configuration = null;
private SessionFactory sessionFactory = null;
private Session session = null;
private Transaction transaction = null;
private SessionFactory getSessionFactory(){
configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
return sessionFactory;
}
public Session backSession(){
return getSessionFactory().openSession();
}
public void saveUserInfo(UserBean user){
backSession();
try{
session = backSession();
//開啟事務(wù)
transaction = session.beginTransaction();
//存儲(chǔ)數(shù)據(jù)
session.save(user);
//提交事務(wù)
transaction.commit();
}catch(Exception e){
transaction.rollback();
e.printStackTrace();
}finally{
if(session != null){
session.close();
}
}
}
}
一定要注意的是纠俭,如果在添加過程中出現(xiàn)異常沿量,我們必須通過Transaction對(duì)象對(duì)上面操作進(jìn)行滾回,所以rollback的操作是很必要的冤荆。而且要在finally中添加關(guān)閉Session對(duì)象的程序段朴则,以保證可用資源的正常回收,避免資源的浪費(fèi)乌妒。
一個(gè)Main類來啟動(dòng)上面的程序
import com.blaze.hibernate_stu.beans.UserBean;
import com.blaze.hibernate_stu.factory_class.GetSession;
/**
* Created by Sherlock on 2/28/2017.
*/
public class Main {
public static void main(String[] args){
UserBean user = new UserBean();
user.setUser_name("Sherlock");
user.setAddress("address");
user.setEmail("sherlockblaze@gmail.com");
user.setSex("男");
user.setSchool("jilin University");
new GetSession().saveUserInfo(user);
}
}