Hibernate实现增删改查以及和JDBC的关系

当我们在学习hibernate必然会学习到增删查改,下面的是自己在学习过程涉及到的一些案例,所以张贴出来分享,也方便初学者学习。

hibernate与jdbc的关系,以及它们的【适合】的场合
    jdbc:
    1)如果项目中以面向关系的操作为主,可以使用jdbc
    2)如果项目以少jar包运行,即轻便运行,可以使用jdbc
    3)如果项目要求速度相对较快,可以使用jdbc
    4)如果要将结果自动封装无要求的话,可以使用jdbc
    5)如果项目要求省内存,可以使用jdbc
    6)如果项目要求多查数据库,可以使用jdbc


    hibernate:    
    1)如果项目中以面向对象的操作为主,可以使用hibernate
    2)如果项目以多jar包运行,即重量运行,可以使用hibernate
    3)如果项目要求速度相对一般,可以使用hibernate
    4)如果要将结果自动封装有要求的话,可以hibernate
    5)如果项目要求不省内存,可以使用jdbc
    6)如果项目要求少查数据库,可以使用hibernate

c.u.r.d方法使用的细节
       (A)session.save()
   >>对象变成了持久化状态,位置session缓存中,有OID,可与数据库交互
   >>根据映射文件的主健生成策略,由hibernate自动为PO对象分配id属性值,程序员需提交set和get方法
   >>计划生成一个完成SQL语句
   >>此时,并没有与数据库交互,只有事务提交后,才与数据库交互
       (B)update()
    >>持久状态对象和游离状态对象操作update()方法,变成持久状态对象
    >>save() + update() = saveOrUpload(),即该方法包话save()和update()二种功能
    >>当update()方法关联一个游离对象时,如果这时Session缓存中已经存在相同OID的持久化对象, 会抛出异常
               结论:session中的PO对象,必须有唯一的OID值,决不能相同
    >>当update()方法关联一个游离对象时,如果在数据库中不存在相应的记录,会抛出异常.
               结论:session中的PO对象,一定要与表中记录一一对应
    >>session一级缓存中的持久化对象一定一定要与表中记录一一对应,不能多,也能少  
       (C)get()和load()的区别
   get是立即查找:
   get()如果找到了,返回:非NULL值
   get()如果没到了,返回:NULL值


   load()是延迟查找:
   load()如果找到了,返回:非NULL值
   load()如果没到了,返回:非NULL值
   get的非NULL值是:与数据库交互后,真真正正的实在值,真值
   load的非NULL值是:没与数据库交互,是一个代理对象,假值
    此时,别信id属性值,
    只有当你访问一个非id属性值时,才与数据库进行交互
    所以,load方法比get方法,较晚查询数据库
   项目中,一定要注意load()和get()的区别,灵活运用
    get():如果项目中,要立即查询表,使用get方法,因为get要查数据库,
    load():如果项目中,只是要用引用变量,并不用非id属性值,此时可以使用load(),因为load()暂不查数据库
    (D)delete()
   >>临时状态对象,持久状态对象,游离状态对象都可调用delete方法
   >>删除状态的对象不能返回,只能等待GC回收
   >>临时状态对象调用delete是可以删除对应记录的,但很危险

先准备写一个工具类HibernateUtils:

package example.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
	private static  SessionFactory sessionFactory;
	private static ThreadLocal<Session> threadLocal;
	static{
		//创建configure配置文件hibernate.properties
		Configuration cfg=new Configuration();
		//加载映射文件hibernate.cfg.xml
		cfg.configure();
		//创建sessionFactory工厂对象
		sessionFactory=cfg.buildSessionFactory();
		threadLocal=new ThreadLocal<Session>();
	}
	
	//获取session对象
	public static Session getSession(){
		Session session=threadLocal.get();
		if(session==null){
			session=sessionFactory.openSession();
			threadLocal.set(session);
		}
		return session;
	}
	//关闭的session对象必须是上面已经获取的session对象
	public static void closeSession(){
		//获取当前线程session对象
		Session session =threadLocal.get();
		if(session!=null){
			session.close();
			//将线程与session对象分离
			threadLocal.remove();
		}
	}
}
接下来熟悉增删查改:

package example.dao;

import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import example.domain.Person;
import example.utils.HibernateUtils;

public class PersonDao4 {

	/**
	 * 增加一个对象
	 */
	@Test
	public void addPerson(){
		Person person=new Person(113, "小美", "女", new Date());
		Session session=null;
		Transaction ts=null;
		try{
			//创建session对象
			//session= sessionFactory.openSession();
			session=HibernateUtils.getSession();
			//开启事务
			ts= session.getTransaction();
			//开始事务
			ts.begin();
			//保存对象到数据库
			session.save(person);
			ts.commit();
		}catch (Exception e) {
			// TODO: handle exception
			ts.rollback();
			e.printStackTrace();
		}finally{
			//session.close();
			HibernateUtils.closeSession();
		}
	}
	/**
	 * 根据id查询person
	 */
	
	@Test
	public void findPersonById(){//查询可以不用那个事务
		Session session=HibernateUtils.getSession();
		Transaction ts= session.getTransaction();
		try{
			ts.begin();
			Person person= (Person) session.get(Person.class, 1);
			System.out.println(person.getName()+","+person.getGender()+","+person.getBirthday());
			ts.commit();
		}catch (Exception e) {
			// TODO: handle exception
			ts.rollback();
			e.printStackTrace();
		}finally{
			//session.close();
			HibernateUtils.closeSession();
		}
	}
	/**
	 * 更新person
	 */
	@Test
	public void updatePerson(){//更新必须要事务
		Session session=HibernateUtils.getSession();
		Transaction ts= session.getTransaction();
		try{
			ts.begin();
			Person person= (Person) session.get(Person.class, 1);
			System.out.println(person.getName()+","+person.getGender()+","+person.getBirthday());
			person.setName("小钱");
			session.update(person);
			ts.commit();
		}catch (Exception e) {
			// TODO: handle exception
			ts.rollback();
			e.printStackTrace();
		}finally{
			//session.close();
			HibernateUtils.closeSession();
		}
	}
	/**
	 * 根据id删除person
	 */
	@Test
	public void deletePersonById(){//
		Session session=HibernateUtils.getSession();
		Transaction ts= session.getTransaction();
		try{
			ts.begin();
			Person person= (Person) session.get(Person.class, 1);
			System.out.println(person.getName()+","+person.getGender()+","+person.getBirthday());
			session.delete(person);
			ts.commit();
		}catch (Exception e) {
			// TODO: handle exception
			ts.rollback();
			e.printStackTrace();
		}finally{
			//session.close();
			HibernateUtils.closeSession();
		}
	}
	/**
	 * 批量增加person
	 */
	@Test
	public void addPersonAll(){//批量增加
		Session session=HibernateUtils.getSession();
		Transaction ts= session.getTransaction();
		try{
			ts.begin();
			for(int i=0;i<=101;i++){
				Person person= new Person(i+5, "小肖", "男", new Date());
				session.save(person);
				if(i%25==0){
					ts.commit();
					session.clear();//清空一级缓存
					ts.begin();
				}
			}
			//System.out.println(person.getName()+","+person.getGender()+","+person.getBirthday());
			ts.commit();
		}catch (Exception e) {
			// TODO: handle exception
			ts.rollback();
			e.printStackTrace();
		}finally{
			//session.close();
			HibernateUtils.closeSession();
		}
	}
	/**
	 * //批量查找
	 */
	@Test
	public void findAllPerson(){
		Session session=HibernateUtils.getSession();
		Transaction ts= session.getTransaction();
		try{
			ts.begin();
			 //使用hql语句查询
			String hql="from Person";//这里的person是类名不是表名
			Query query= session.createQuery(hql);//基于hql创建查询对象
			//执行查询,封装到list集合中
			List<Person> list= query.list();
			for(Person p:list){
				System.out.println(p.getName()+","+p.getGender()+","+p.getBirthday());
			}
			ts.commit();
		}catch (Exception e) {
			// TODO: handle exception
			ts.rollback();
			e.printStackTrace();
		}finally{
			//session.close();
			HibernateUtils.closeSession();
		}
	}
	/**
	 * 批量更新
	 */
	@Test
	public void updateAllPerson(){//
		Session session=HibernateUtils.getSession();
		Transaction ts= session.getTransaction();
		try{
			ts.begin();
			 //使用hql语句更新
			String hql="update Person set gender='男'";//这里的person是类名不是表名,gender是属性名
			Query query= session.createQuery(hql);//基于hql创建查询对象
			int res=query.executeUpdate();
			System.out.println("受影响的行数:"+res);
			ts.commit();
		}catch (Exception e) {
			// TODO: handle exception
			ts.rollback();
			e.printStackTrace();
		}finally{
			//session.close();
			HibernateUtils.closeSession();
		}
	}
	/**
	 * //批量删除
	 */
	@Test
	public void deletePerson(){
		Session session=HibernateUtils.getSession();
		Transaction ts= session.getTransaction();
		try{
			ts.begin();
			 //使用hql语句更新
			String hql="delete from Person";
			Query query= session.createQuery(hql);//基于hql创建查询对象
			int res=query.executeUpdate();
			System.out.println("受影响的行数:"+res);
			ts.commit();
		}catch (Exception e) {
			// TODO: handle exception
			ts.rollback();
			e.printStackTrace();
		}finally{
			//session.close();
			HibernateUtils.closeSession();
		}
	}
	/**
	 * 根据name查找
	 */
	@Test
	public void findPersonByName(){
		Session session=HibernateUtils.getSession();
		Transaction ts= session.getTransaction();
		String name="小美";
		try{
			ts.begin();
			 //使用hql语句查询
			String hql="from Person p where p.name=?";
			Query query= session.createQuery(hql);//基于hql创建查询对象
			query.setString(0, name);//注意在hibernate的占位符是从0开始
			Person p= (Person) query.uniqueResult();
			if(p!=null){
				System.out.println(p.getName()+","+p.getGender()+","+p.getBirthday());
			}
			ts.commit();
		}catch (Exception e) {
			// TODO: handle exception
			ts.rollback();
			e.printStackTrace();
		}finally{
			//session.close();
			HibernateUtils.closeSession();
		}
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值