hibernate通过session实现增删改查操作实例解析

 更新时间:2017年12月11日 15:38:52   作者:一勺言  
这篇文章主要介绍了hibernate通过session实现增删改查操作实例解析,具有一定借鉴价值,需要的朋友可以参考下。

今天学习了一下如何通过hibernate来实现对数据库的增删改查,下面来简单介绍一下:

首先创建个Student类:

package com.hibernate.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity 
@Table(name = "_Teacher") 
public class Teacher {
	private int id;
	private String name;
	private int age;
	private String birthPlace;
	@Id 
	@GeneratedValue 
	@Column(name = "_id") 
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@Column(name = "_name") 
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Column(name = "_age") 
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Column(name = "_birthPlace") 
	public String getBirthPlace() {
		return birthPlace;
	}
	public void setBirthPlace(String birthPlace) {
		this.birthPlace = birthPlace;
	}
}

然后创建个JUnit Test Case类型的TeacherTest:

先讲讲session.save()方法,也就是增:

package com.hibernate.model;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class TeacherTest {
	public static SessionFactory sf = null;
	@BeforeClass 
	  public static void beforeClass(){
		try{
			sf = new AnnotationConfiguration().configure().buildSessionFactory();
			//此处最好要获取一下异常,因为annotation有一个bug有时出现有时不出现
		}
		catch(Exception e){
			e.printStackTrace();
		}
		finally{
		}
	}
	@Test 
	  public void testSave() {
		//增 
		Teacher t = new Teacher();
		t.setAge(23);
		t.setName("moluo");
		t.setBirthPlace("huangshan");
		Session session = sf.getCurrentSession();
		session.beginTransaction();
		session.save(t);
		session.getTransaction().commit();
	}
	@AfterClass 
	  public static void afterClass(){
		sf.close();
	}
}

亮结果:

再讲讲session.delete()方法,也就是删:

@Test 
  public void testDelete() {
	//删 
	Teacher t = new Teacher();
	t.setId(2);
	Session session = sf.getCurrentSession();
	session.beginTransaction();
	session.delete(t);
	session.getTransaction().commit();
}

亮结果:

接着再来session.get(),也就是查:

@Test 
  public void testGet() {//get     
    Session session = sf.getCurrentSession(); 
    session.beginTransaction(); 
    Teacher t = (Teacher)session.get(Teacher.class, 1); 
    System.out.println("姓名为:"+t.getName()); 
    session.getTransaction().commit(); 
  } 

亮结果:

Hibernate: select teacher0_._id as column1_1_0_, teacher0_._age as column2_1_0_, teacher0_._birthPlace as column3_1_0_, teacher0_._name as column4_1_0_ from _Teacher teacher0_ where teacher0_._id=? 
姓名为:moluo 

再来另一种查询方式:session.load():

@Test 
  public void testLoad() {//load  
    Session session = sf.getCurrentSession(); 
    session.beginTransaction(); 
    Teacher t = (Teacher)session.load(Teacher.class, 1); 
    System.out.println("姓名为:"+t.getName()); 
    session.getTransaction().commit(); 
  } 

亮结果:

Hibernate: select teacher0_._id as column1_1_0_, teacher0_._age as column2_1_0_, teacher0_._birthPlace as column3_1_0_, teacher0_._name as column4_1_0_ from _Teacher teacher0_ where teacher0_._id=? 
姓名为:moluo 

这里解释一下这俩查询之间的区别:首先当要查询的对象不存在的时候,返回的信息是不同的。get方式会返回:java.lang.NullPointerException

load方式会返回:org.hibernate.ObjectNotFoundException:Norowwiththegivenidentifierexists

其次,load返回的是代理对象,等真正用到的时候才会发出SQL语句;另外get是直接从数据库里加载数据,不存在延迟。

最后再讲讲最常用的更新方式,通过HQL语句来更新:

@Test 
  public void testUpdate() {//更新  
    Session session = sf.getCurrentSession(); 
    session.beginTransaction(); 
    String url = "update Teacher t set t.birthPlace = 'anhui' where id = 1"; 
    //注意这里的Teacher必须是对象名字,而不是表名,t是对象的别名 
    Query q = session.createQuery(url); 
    //这里导入的包是:import org.hibernate.Query; 
    q.executeUpdate(); 
    session.getTransaction().commit(); 
  } 

亮结果:

通过更新,把摩罗我的籍贯从黄山更新成安徽了....

其实本身有session.update()这个更新方法的,但只是这个更新方法如果你每次只更新一部分列的话,这种更新方式也会把所有列都更新一遍,效率不是太高,所以就不怎么提倡使用,当然也有弥补方式,比如如果使用的是xml的话,可以在配置文件中某个不想被更新的列的property标签里设置update="false";另外也可以在配置文件的class后面设置动态更新:dynamic-update="true";当然如果使用的是Annotation,可以在不想更新的列上设置@column(update="false");其实这些都不灵活,使用HQL才是最好的,所以这里就只贴出HQL更新的代码。

总结

以上就是本文关于hibernate通过session实现增删改查操作实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅本站:

快速了解Hibernate中的Session

hibernate属性级别注解实例代码

Hibernate使用hbm.xml配置映射关系解析

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • Maven在Windows中的配置以及IDE中的项目创建实例

    Maven在Windows中的配置以及IDE中的项目创建实例

    下面小编就为大家带来一篇Maven在Windows中的配置以及IDE中的项目创建实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Java使用ObjectMapper的简单示例

    Java使用ObjectMapper的简单示例

    这篇文章主要介绍了Java使用ObjectMapper的简单示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java学习DongTai被动型IAST工具部署过程

    java学习DongTai被动型IAST工具部署过程

    被动型IAST被认为是DevSecOps测试阶段实现自动化安全测试的最佳工具,而就在前几天,洞态IAST正式开源了,这对于甲方构建安全工具链来说,绝对是一个大利好
    2021-10-10
  • 关于Linux服务器配置java环境遇到的问题小结

    关于Linux服务器配置java环境遇到的问题小结

    这篇文章主要介绍了关于Linux服务器配置java环境遇到的问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • java实现多线程交替打印两个数

    java实现多线程交替打印两个数

    这篇文章主要为大家详细介绍了java实现多线程交替打印两个数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • java、python、JavaScript以及jquery循环语句的区别

    java、python、JavaScript以及jquery循环语句的区别

    本篇文章主要介绍java、python、JavaScript以及jquery的循环语句的区别,这里整理了它们循环语句语法跟示例,以便大家阅读,更好的区分它们的不同
    2016-07-07
  • Javaweb基础入门requse原理与使用

    Javaweb基础入门requse原理与使用

    Request对象的作用是与客户端交互,收集客户端的Form、Cookies、超链接,或者收集服务器端的环境变量,接下来本篇将详细讲述
    2021-11-11
  • Java Annotation Overview详解

    Java Annotation Overview详解

    这篇文章主要介绍了Java Annotation Overview,需要的朋友可以参考下
    2014-02-02
  • 学习Java HashMap,看这篇就够了

    学习Java HashMap,看这篇就够了

    这篇文章主要介绍了Java HashMap的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java爬虫范例之使用Htmlunit爬取学校教务网课程表信息

    Java爬虫范例之使用Htmlunit爬取学校教务网课程表信息

    htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。今天我们用这款分析工具来爬取学校教务网课程表信息
    2021-11-11

最新评论