Hibernate第二课 单表的简单增删改查

接上回,上回的代码做了一个小调整,Student表的ID的类型给为varChar

Student类中的id类型改为String,映射文件的ID部分的修改未

  <id column="Id" name="id" type="string">
   <generator class="uuid"/>
  </id>

UUID是 一种随机生成随机序列的机制,可以作为ID,不会重复

好了 ,不废话 贴代码

Hibernate01.java

package com.test;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.entity.Student;

public class Hibernate02 {
	public static SessionFactory sessionFactory;
	static {
		try {
			//有可能产生异常,使用try语句
			Configuration cfg=new Configuration().configure();
			//应用程序或资源的配置文件。无法继承此类。
			sessionFactory= cfg.buildSessionFactory();
			//Hibernate的核心接口之一 SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充//当数据存储源的代理,并负责创建Session对象。	
		} catch (HibernateException e) {
			e.printStackTrace();
		}
		
	}
	public static void main(String[] args) {

			Student s1 = new Student();
			s1.setName("yushu");
			s1.setAge(10L);
			//s1.setId("8");
			
			Hibernate02  h2 = new Hibernate02();
			
			//h2.saveStudent(s1);
			
			//h2.deleteStudent("2");
			
			//h2.findAllStudent();
			
			//h2.updateStudent(s1);
			
			//h2.loadAndUodate("4");
			
	}
	
	//保存对象的方法
	public void saveStudent(Student s){
		Session session = sessionFactory.openSession();
		Transaction ts =null;
		try {
			ts =  session.beginTransaction();
			//以上代码所有方法都一样,得到session,开启事务,以后不在赘述
			session.save(s);//保存最简单,直接调用sava()方法就行了
			//问题一:当ID被设置了,ID会保存到数据库吗?
			//以下代码,提交事务,关闭session
			ts.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			ts.rollback();
		}finally{
			session.close();
		}
	}
	
	public void deleteStudent(String id){
		Session session = sessionFactory.openSession();
		Transaction ts =null;
		try {
			ts =  session.beginTransaction();
			//方案一:
			Student ss = new Student();
			ss.setId(id);
			session.delete(ss);
			//方案二:session.delete((Student)session.load(Student.class, id));
			/**
			 * 问题二:删除对象的方法,上面的代码有问题,在删除时,还得查询到这个对象,执行效率是不是太低了,有什么方法可以优化没?
			 * 方案一比方案二较好,但是还是新建了一个内存空间,还有没有更好的方法?
			 */
			ts.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			ts.rollback();
		}finally{
			session.close();
		}
	}
	
	@SuppressWarnings("unchecked")
	public void findAllStudent(){
		Session session = sessionFactory.openSession();
		Transaction ts =null;
		try {
			ts =  session.beginTransaction();
			//这就是传说中的HQL真正学好还真得花一阵功夫
			Query query = session.createQuery("from Student order by id desc");
			//Query 对象的list方法,可以得到对象列表
			List<Student> students = query.list();
			for(Student s :students){
				System.out.print(s.getId()+" ");
				System.out.print(s.getName()+" ");
				System.out.print(s.getAge()+" ");
				System.out.println();
			}
			ts.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			ts.rollback();
		}finally{
			session.close();
		}
	}
	
	public void updateStudent(Student student){
		Session session = sessionFactory.openSession();
		Transaction ts =null;
		try {
			ts =  session.beginTransaction();
			student.setName("jiji");
			//这个方法当ID为空的时候进行插入操作,ID不为空的时候进行修改操作,如果ID不为空,数据库
			//又不存在会是什么效果呢?
			//org.hibernate.StaleStateException异常
			session.saveOrUpdate(student);
			ts.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			ts.rollback();
		}finally{
			session.close();
		}
	}
	
	public void loadAndUodate(String id){
		Session session = sessionFactory.openSession();
		Transaction ts =null;
		try {
			ts =  session.beginTransaction();
			Student student = (Student) session.load(Student.class, id);
			student.setName("yika");
			//load过来的对象,是个“干净的对象”,是对于脏数据而言的
			//当这个纯的对象变为脏对象时,当事务提交时Hibernate会自动检测对象并保存
			//ts.commit();这句写不写效果一样
		} catch (HibernateException e) {
			e.printStackTrace();
			ts.rollback();
		}finally{
			session.close();
		}
	}
		
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值