ORM框架Hibernate (一) 對DAO封裝和抽象

  1. 說明
    1. 前面已經給你們介紹了Struts這個框架,Struts是對Web項目的表示層進行了封裝,而Hibernate是對Web項目中DAO層進行封裝,也便是.NET中咱們經常使用到的D層封裝,即對訪問數據庫的一層進行的封裝。
    1. D層中儘管咱們引入了一個SQLHlper類,在執行CRUD操做中的一些共同的部分抽象出來了,可是遠遠不夠的還要進行更深層次的封裝,Hibernate這個框架封裝的比較完全,使用了這個框架後。
      1. 不用咱們本身寫SQL語句
      1. 甚至連表都不用本身創建
    1. 使用了Hibernate能夠不用本身建表,咱們只關心實體,關心面向對象的部分,而不用關心關係型數據庫。
      1. 它對面向對象與關係型模式之間解耦了,在必定程度上讓咱們只關心面向對象部分。
      1. 體現了OOAOODOOP的編程思想
    1. Hibernate是面向對象的程序設計語言和關係數據庫之間的橋樑,Hibernate容許程序開發者採用面向對象的方式來操做關係數據庫。
  1. 特色
    1. 優勢
      1. 輕量級
        1. 是相對於重量級而言,不依賴於容器,易於配置
          1. 好比Struts是一個重量級,它須要容器支持Tomcat
        1. 沒有侵略性API,支持透明持久化
          1. 即在寫持久化層時,不用實現或繼承任何Hibernate的類,對其它類的依賴性小,咱們知道Struts,在使用ActionFormAction等類時,必須實現或者繼承是Struts父類才能夠,Hibernate不用繼承。
            1. POJO
              1. POJO是Plain Old Java Objects的縮寫,即簡單的Java對象,不但任任何角色對象。
              1. 其中有一些屬性及其getter setter方法的類,沒有業務邏輯,有時能夠做爲 VO(value -object)或 dto(Data Transform Object)來使用。
              1. 用來表示普通的Java對象,不是JavaBean, EntityBean 或者 SessionBean。POJO不擔當任何特殊的角色,也不實現任何特殊的Java框架的接口如,EJB, JDBC等等。
        1. 獨立性好
          1. 易於測試,它不像Struts那樣即便測試一個小小几行代碼的Java類,也須要啓動很大的TomcatJboss等,通常啓動還要等半天的功夫,在Hibernate中在類中加入Main方法就能夠進行測試,很方便。
      1. 它沒有侵入性和測試很是簡單 這是它流行的一個緣由。
    1. 缺點
      1. 優勢和缺點是相對的,正式因爲它的優勢也成爲了它的缺點,由於它封裝性好,這樣對數據庫若是進行一些特殊操做很差實現。
      1. 大量的更新或者統計查詢操做會不方便。
  1. 環境搭建
    1. Hibernate不單單支持Web程序,Java項目等也支持,這一點要比Struts應用範圍廣,畢竟它屬於輕量級,擴展性能好。
    1. 搭建框架同Struts相似,只需把Hibernate包引入便可,多了一個實體配置文件,是這裏不細說,看一下搭建好的截圖。
      1. 搭建好截圖
        1. 文件
  1. 創建實體和簡單操做
    1. 創建一個實體類,看一下它是如何不用建表而本身對應數據庫的,以User表爲例:
      1. User
        1. import java.util.Date;
          
          public class User {
          	
          	private String id;
          	private String name;
          	private String password;
          	private Date createTime;
          	private Date expireTime;
          	public String getId() {
          		return id;
          	}
          	public void setId(String id) {
          		this.id = id;
          	}
          	public String getName() {
          		return name;
          	}
          	public void setName(String name) {
          		this.name = name;
          	}
          	public String getPassword() {
          		return password;
          	}
          	public void setPassword(String password) {
          		this.password = password;
          	}
          	public Date getCreateTime() {
          		return createTime;
          	}
          	public void setCreateTime(Date createTime) {
          		this.createTime = createTime;
          	}
          	public Date getExpireTime() {
          		return expireTime;
          	}
          	public void setExpireTime(Date expireTime) {
          		this.expireTime = expireTime;
          	}
          	
          }

      1. User.hbm.xml映射文件
        1. <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC 
          	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
          <hibernate-mapping >
          	<class name="com.bjpowernode.hibernate.User">
          		<id name="id">
          			<generator class="uuid"></generator>
          		</id>
          		<property name="name"></property>
          		<property name="password"></property>
          		<property name="createTime"></property>
          		<property name="expireTime"></property>
          	</class>
          
          </hibernate-mapping>

        1. 該文件是用於實體對數據庫表的映射,能夠自定義表名或者字段名
      1. Hibernate.cfg.xml系統配置
        1. <!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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
          		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
          		<property name="hibernate.connection.username">root</property>
          		<property name="hibernate.connection.password">123456</property>
          		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
          		<property name="hibernate.show_sql">true</property>
          		<property name="hibernate.format_sql">true</property>
          		
          		
          		<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
          	</session-factory>
          </hibernate-configuration>

        1. 這屬於系統級別文件,指明表映射文件,以及數據庫配置信息。
      1. MySql 效果
    1. 如何不用寫SQL語句,像表裏插入數據?
      1. Test
        1. import java.util.Date;
          
          import org.hibernate.Session;
          import org.hibernate.SessionFactory;
          import org.hibernate.cfg.Configuration;
          
          public class Test {
          
          	/**
          	 * @param args
          	 */
          	public static void main(String[] args) {
          		//讀取hibernate.hbm.xml文件
          		Configuration cfg=new Configuration().configure();
          		//創建SessionFactory至關於數據庫的一個鏡像
          		SessionFactory factory=cfg.buildSessionFactory();
          		//取得Session
          		Session session=null;
          		try {
          			session=factory.openSession();
          			//開啓事務
          			session.beginTransaction();
          			User user=new User();
          			user.setName("李龍生");
          			user.setPassword("123456");
          			user.setCreateTime(new Date());
          			user.setExpireTime(new Date());
          			
          			//保存User對象
          			session.save(user);
          			//提交事務
          			session.getTransaction().commit();
          			
          			
          		} catch (Exception e) {
          			e.printStackTrace();
          			//回滾事務
          			session.getTransaction().rollback();
          			
          			
          		}finally{
          			//關閉Session
          			if (session!=null) {
          				if (session.isOpen()) {
          					session.close();
          				}
          			}	
          			
          		}
          		
          	}
          
          }

        1. 這裏面涉及到了SessionFatory/Session等對象,專用於操做數據庫。
      1. 從下面能夠看到,執行後,數據庫中多了一條數據
  1. 從對數據庫的操做能夠看出,省去了不少代碼的編寫,方便了咱們也提升了開發效率,框架帶來的好處不少,建議你們多多使用。
相關文章
相關標籤/搜索