10 06Hibernate之實現CRUD

Session接口是負責所有數據基礎更新操作與基礎查詢操作的主要接口,而SharedSessionContract接口主要負責事務或者是數據查詢操作的,那麼本次的重點只在於Session子接口上。

1 數據增加

在Hibernate裏面針對於數據增加操作提供了兩個方法:
(1)數據保存:public Serializable save(Object object)
|————返回的是這個保存的數據ID;
(2)數據更新或保存:public void saveOrUpdate(Object object)
在使用傳統JDBC開發時候有一點特別不好用,那麼就是如果表中的主鍵字段爲自動增長,要想取得增長後的ID則需要根據每個數據庫的不同進行查詢,但是如果有了Hibernate,它可以幫我們自動返回增長後的ID數據,同時這個數據也會自動的保存到POJO類裏面。

-- 刪除數據表
DROP TABLE IF EXISTS news;
-- 創建數據表
CREATE TABLE news(
	nid INT AUTO_INCREMENT,
	ntitle VARCHAR(50) NOT NULL,
	nvisits INT DEFAULT 0,
	nitem VARCHAR(50),
	CONSTRAINT pk_nid PRIMARY KEY(nid)
);

範例:實現增加

package org.lks.test;

import org.lks.dbc.HibernateSessionFactory;
import org.lks.pojo.News;

public class TestNewsInsert {

	public static void main(String[] args) {
		News vo = new News();
		vo.setNtitle("lks love hhy");
		vo.setNitem("哎吖");
		vo.setNvisits(20);
		Integer nid = (Integer) HibernateSessionFactory.getSession().save(vo);
		HibernateSessionFactory.getSession().beginTransaction().commit();
		System.out.println(nid);
		System.out.println(vo.getNid());
		HibernateSessionFactory.closeSession();
	}
}

一旦調用了save()方法,返回的一定是當前的ID數據,同時發現在數據保存完成之後,當前增長後的ID會自動填充到對應的屬性中。

但是saveOrUpdate()方法就不這麼好用,因爲對於此方法的操作有一個小小的問題,就是它沒有返回結果。
範例:使用saveOrUpdate()方法操作
(1)增加一條新的數據

package org.lks.test;

import org.lks.dbc.HibernateSessionFactory;
import org.lks.pojo.News;

public class TestNewsInsert {

	public static void main(String[] args) {
		News vo = new News();
		vo.setNtitle("hhy big fool");
		vo.setNitem("笨蛋");
		vo.setNvisits(20);
		HibernateSessionFactory.getSession().saveOrUpdate(vo);
		HibernateSessionFactory.getSession().beginTransaction().commit();
		System.out.println(vo.getNid());
		HibernateSessionFactory.closeSession();
	}
}

Hibernate: 
    insert 
    into
        hedb.news
        (ntitle, nvisits, nitem) 
    values
        (?, ?, ?)
2

(2)如果要想進行修改一定需要有nid,那麼下面設置好nid。

package org.lks.test;

import org.lks.dbc.HibernateSessionFactory;
import org.lks.pojo.News;

public class TestNewsInsert {

	public static void main(String[] args) {
		News vo = new News();
		vo.setNid(1);
		vo.setNtitle("hhy big fool");
		vo.setNitem("笨蛋");
		vo.setNvisits(200);
		HibernateSessionFactory.getSession().saveOrUpdate(vo);
		HibernateSessionFactory.getSession().beginTransaction().commit();
		System.out.println(vo.getNid());
		HibernateSessionFactory.closeSession();
	}
}

Hibernate: 
    update
        hedb.news 
    set
        ntitle=?,
        nvisits=?,
        nitem=? 
    where
        nid=?
1

此時出現的是一個更新語句。

也就是說如果操作的時候設置了主鍵內容,就認爲此操作是更新操作,如果沒有設置主鍵,則表示增加操作。

2 數據查詢操作

在Session接口裏面定義的數據查詢只是進行ID的查詢操作,方法:
(1)public <T> T load(Class<T> theClass, Serializable id),參數作用:
|————Class<T> theClass:設置你要查詢的數據類型(類.class);
|————Serializable id:要查詢的ID內容。
在整個Hibernate裏面把所有的ID類型都使用了Serializable來表示,而所有要操作的類型都使用了Class類來表示。
範例:根據id查詢

package org.lks.test;

import org.lks.dbc.HibernateSessionFactory;
import org.lks.pojo.News;

public class TestNewsFindById {

	public static void main(String[] args) {
		News vo = HibernateSessionFactory.getSession().load(News.class, 1);
		//HibernateSessionFactory.getSession().beginTransaction().commit();
		System.out.println(vo);
		HibernateSessionFactory.closeSession();
	}
}

Hibernate: 
    select
        news0_.nid as nid1_0_0_,
        news0_.ntitle as ntitle2_0_0_,
        news0_.nvisits as nvisits3_0_0_,
        news0_.nitem as nitem4_0_0_ 
    from
        hedb.news news0_ 
    where
        news0_.nid=?
News [nid=1, ntitle=hhy big fool, nvisits=200, nitem=笨蛋]

查詢操作Session只提供了根據ID查詢的支持。

3 數據修改

數據的修改操作它提供的是完全的操作修改,修改的操作方法:
(1)修改方法:`public void update(Object object);
|————修改的時候要接收要修改的對象內容,但是修改後沒有返回值。
範例:實現數據修改

package org.lks.test;

import org.lks.dbc.HibernateSessionFactory;
import org.lks.pojo.News;

public class TestNewsUpdate {

	public static void main(String[] args) {
		News vo = new News();
		vo.setNid(1);
		vo.setNtitle("hhy big fool");
		vo.setNitem("big笨蛋");
		vo.setNvisits(2000);
		HibernateSessionFactory.getSession().update(vo);
		HibernateSessionFactory.getSession().beginTransaction().commit();
		System.out.println(vo.getNid());
		HibernateSessionFactory.closeSession();
	}
}

Hibernate: 
    update
        hedb.news 
    set
        ntitle=?,
        nvisits=?,
        nitem=? 
    where
        nid=?

此操作的設計與自己實現的區別不大。在之前講解過的saveOrUpdate()方法也是如此操作的,只不過如果真的是增加或修改肯定使用的還是save()和update()兩個方法。

4 數據刪除操作

在Session接口裏面提供有刪除操作方法:public void delete(Object object),如果要想刪除則必須接收一個對象。
範例:刪除數據

package org.lks.test;

import org.lks.dbc.HibernateSessionFactory;
import org.lks.pojo.News;

public class TestNewsDelete {

	public static void main(String[] args) {
		News vo = new News();
		vo.setNid(2);
		HibernateSessionFactory.getSession().delete(vo);
		HibernateSessionFactory.getSession().beginTransaction().commit();
		HibernateSessionFactory.closeSession();
	}
}

Hibernate: 
    delete 
    from
        hedb.news 
    where
        nid=?

刪除的時候設置的是一個對象,而且Hibernate可以自動通過對象找到對應的主鍵內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章