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可以自動通過對象找到對應的主鍵內容。