hibernate基本增删改查的应用

使用junit实现CRUD操作

首先准备HibernateUtils

package com.tarena.demo.utils;

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

public class HibernateUtils {
	private static Configuration cfg;
	private static SessionFactory factory;
	static{
		cfg = new Configuration().configure();
		factory = cfg.buildSessionFactory();
	}
	public static  Session getSession(){
		return factory.openSession();
	}
	public static void close(Session session){
		if(session!=null&&session.isOpen()){
			session.close();
		}
	}
}

TestCRUD测试类

package com.tarena.test;

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 com.tarena.demo.po.User;
import com.tarena.demo.utils.HibernateUtils;

public class TestCRUD {
	/**
	 * 保存记录
	 */
	@Test
	public void testSave(){
		User user = new User();
		user.setUserName("诸葛亮");
		user.setUserPassword("123456");
		Configuration cfg = new Configuration().configure();
		SessionFactory factory = cfg.buildSessionFactory();
		Session session = factory.openSession();
		Transaction tr = session.beginTransaction();
		session.save(user);
		tr.commit();
		session.close();
	}
	/**
	 * 执行删除
	 * 对应该对象的记录一定存在,如果不存在
	 * hibernate 会抛出异常
	 */
	@Test
	public void testDelete(){
		User user = new User();
		user.setUid(1);
		Session session = HibernateUtils.getSession();
		session.delete(user);
		session.beginTransaction().commit();
		HibernateUtils.close(session);
	}
	/**
	 * 更新记录
	 */
	@Test
	public void testUpdate(){
		User user = new User();
		user.setUid(2);
		user.setUserName("诸葛亮");
		user.setUserPassword("333333");
		Session session = HibernateUtils.getSession();
		session.update(user);
		session.beginTransaction().commit();
		HibernateUtils.close(session);
	}
	/**
	 * 查询记录
	 * 一条记录,通过id查询
	 * get()方法
	 * 不使用懒加载机制
	 * 当记录不存在,get方法返回null
	 */
	@Test
	public void testGet(){
		Session session = HibernateUtils.getSession();
		User user = (User)session.get(User.class, 2);
		System.out.println("-------------------------");
		//System.out.println(user);
		System.out.println(user.getUserName());
		System.out.println(user.getUserPassword());
		HibernateUtils.close(session);
	}
	/**
	 * 查询记录
	 * 一条记录,通过id查询
	 * load()方法
	 * 
	 * 懒加载:查询对象,当使用该对象才到数据库中执行查询的动作
	 * 如果不使用该对象,不会到数据库中查,会临时使用第三方的代理
	 * 技术,返回一个代理对象
	 * 
	 * 使用懒加载(延迟加载)机制
	 * 如果记录不存在会抛出如下异常
	 * org.hibernate.ObjectNotFoundException: 
	 * No row with the given identifier exists: 
	 * [com.tarena.demo.po.User#3]
	 * 
	 */
	@Test
	public void testLoad(){
		Session session = HibernateUtils.getSession();
		User user = (User)session.load(User.class, 2);
		System.out.println("-------------------------");
		System.out.println(user.getUserName());
		System.out.println(user.getUserPassword());
		HibernateUtils.close(session);
	}
	/**
	 * 查询多条记录
	 * 使用hql语句
	 * hql:Hibernate Query Language
	 * 完全面向对象
	 */
	@Test
	public void testQuery(){
		Session session = HibernateUtils.getSession();
		String hql = "select u from User u";
		Query query = session.createQuery(hql);
		List<User> users = query.list();
		for(User user:users){
			System.out.println(user.getUserName());
		}
		HibernateUtils.close(session);
	}
}






注意:get,load方法的区别

1.testGet()方法结果:

Hibernate:
select
user0_.uid as uid0_0_,
user0_.userName as userName0_0_,
user0_.userPassword as userPass3_0_0_
from
t_user user0_
where
user0_.uid=?
-------------------------
诸葛亮
333333

原因是:get方法不采用懒惰式加载。

2.testLoad()方法结果:

-------------------------
Hibernate:
select
user0_.uid as uid0_0_,
user0_.userName as userName0_0_,
user0_.userPassword as userPass3_0_0_
from
t_user user0_
where
user0_.uid=?
诸葛亮
333333


原因是:load方法采用懒惰式加载方式。

3.当testLoad()方法变为

@Test
	public void testGet(){
		Session session = HibernateUtils.getSession();
		User user = (User)session.get(User.class, 2);
		System.out.println("-------------------------");
		System.out.println(user.getClass().getName());
		//System.out.println(user.getUserName());
		//System.out.println(user.getUserPassword());
		HibernateUtils.close(session);
	}


结果为:

----------------
com.tarena.demo.po.User_$$_javassist_0

原因是:(打印user.getClass().getName()不算是使用user对象,hibernate不会到数据库中去查询)

你可能感兴趣的:(Hibernate)