Session接口是负责所有数据基础更新操作与基础查询操作的主要接口,而SharedSessionContract接口主要负责事务或者是数据查询操作的,那么本次的重点只在于Session子接口上。
在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此时出现的是一个更新语句。
也就是说如果操作的时候设置了主键内容,就认为此操作是更新操作,如果没有设置主键,则表示增加操作。
在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查询的支持。
数据的修改操作它提供的是完全的操作修改,修改的操作方法: (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()两个方法。
在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可以自动通过对象找到对应的主键内容。