10 06Hibernate之实现CRUD

本文详细介绍了Hibernate中的CRUD操作,包括数据增加、查询、修改和删除。在数据增加部分,讲解了save()和saveOrUpdate()方法的使用,以及它们在处理主键自动增长时的区别。数据查询部分,展示了如何根据ID进行查询。数据修改部分,演示了update()方法的运用。最后,讨论了删除操作,说明了删除时需要传入待删除对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值