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可以自动通过对象找到对应的主键内容。