Hibernate应用实例

package com.aowin.dao;

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

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.aowin.model.User;

public class UserDAOTest {
	private static SessionFactory sessionFactory;
	
	
	//BeforeClass:在所有方法之前执行
	@BeforeClass
	public static void beforeClass(){
		//读取配置
		Configuration config = new Configuration().configure("com/aowin/res/hibernate.cfg.xml");
		//创建SessionFactory对象  Hibernate操作 需要Session对象 Session对象SessionFactory对象创建而来
		//SessionFactory从配置信息中创建
		sessionFactory = config.buildSessionFactory();
	}

	//Test:要求返回值为void
	@Test
	public void saveUser(){
		User user = new User();
		user.setAddress("上海");
		user.setAge(22);
		user.setCreateTime(new Date());
		user.setUsername("张三");
		//如果用openSession  则打开的Sesion需要手动管理(开启和关闭)
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		session.save(user);
		session.getTransaction().commit();
		session.close();
	}
	
	@Test
	public void saveUser2(){
		User user = new User();
		user.setAddress("杭州西湖区");
		user.setAge(23);
		user.setCreateTime(new Date());
		user.setUsername("舒峰");
		//第二种拿到Session的方法
		//getCurrentSession:不是手动管理的,交给Hibernate管理,
		//前提:<property name="current_session_context_class">thread</property>
		Session session  = sessionFactory.getCurrentSession();
		session.save(user);
	}
	
	/**
	 * 根据主键 删除
	 */
	@Test
	public void testDetele1(){
		User user  = new User();
		user.setId(3);
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		//有ID就能delete
		//new的id 数据库中没有记录时 也发sql,并报错
		//new的id 数据库中有记录 就删除了
		session.delete(user);//Hibernate 不建议直接对数据表中的字段进行操作
		session.getTransaction().commit();
	}
	
	//HQL(按名字删除)- 查询
	
	@Test
	public void getUesr() {
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		//get():查询方法之一
		User user = (User)session.get(User.class, 1);
		System.out.println(user.getUsername());
		session.getTransaction().commit();
	}
	
	
	@Test
	public void testSave(){
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		User u = (User)session.get(User.class, 4);//查询纳入session管理
		u.setAddress("杭州");//持久状态在事务提交的时候会和数据库同步
		session.getTransaction().commit();
		
	}
	
	/**
	 * 更新
	 */
	@Test
	public void testUpdate1(){
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		User user = (User)session.get(User.class, 2);
		user.setUsername("舒峰");

		session.update(user);
		session.getTransaction().commit();
		
	}
	
	
	/**
	 * merge:
	 * 没id,往数据库增加 一条记录:发一个insert
	 * 有id,但是数据库中没记录:往数据库增加一条记录. 发一个select 一个insert
	 * 有id,数据库中有对应记录:发一个select  一个update,更新set后的字段,其他字段不变
	 */

	@Test
	public void testUpdate2(){
		User user = new User();
		user.setUsername("张三");
		
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		//merge:合并
		session.merge(user);
		session.getTransaction().commit();
		
	}
	
	
	@Test
	public void testSave2(){
		User user = new User();
		user.setAddress("上海");
		user.setAge(22);
		user.setCreateTime(new Date());
		user.setUsername("张三");

		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		session.save(user);
		user.setUsername("王五");
		session.getTransaction().commit();
	}
	
	
	//HQL语句能够 实现sql的复杂操作
	
	/**
	 * 按名字删除
	 */
	@Test
	public void testDelete(){
		//hql语句 类似SQL语句. 
		//hql操作的是model类 
		//SQL语句操作的是表的字段名
		String hql = "delete from User u where u.username = ? ";
		
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		//返回值表示影响的行数
		int result = session.createQuery(hql).setString(0,"王五").executeUpdate();
		System.out.println(result);
		
		session.getTransaction().commit();
	}
	
	/**
	 * 根据id查找 get
	 */
	@Test
	public void testGetUser1(){
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		//Load:只有在用到的时候才去数据库查询 延迟加载
		User user = (User)session.load(User.class,7);
		
		session.getTransaction().commit();
	}
	
	
	@Test
	public void testGetUser2(){
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		//语句一执行就取数据库加载
		User user = (User)session.get(User.class,7);
		session.getTransaction().commit();
	}
	
	@Test
	public void testGetAllUser(){
		String hql ="from User";
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		List<User> userList = (List<User>)session.createQuery(hql).list();
		for(User user : userList){
			System.out.println(user.getId()+"-"+user.getUsername());
		}
		session.getTransaction().commit();
	}
	
	
	@Test
	public void testSelectByUsername(){
		String hql = " from User u where u.username = ? and u.age= ?";
		
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		List<User> userList = (List<User>)session.createQuery(hql).setString(0,"张三").setInteger(1, 22).list();
		for(User user :userList){
			System.out.println(user.getId()+"-"+user.getAge());
		}
		
		session.getTransaction().commit();
	}
	
	
	@AfterClass
	public static void close(){
		sessionFactory.close();
	}
	

}
 
package com.aowin.dao;

import java.util.Iterator;
import java.util.List;

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

import com.aowin.model.User;
import com.aowin.vo.UserVO;

public class UserDAO {
	private static SessionFactory sessionFactory;

	@BeforeClass
	public static void beforClass() {
		Configuration conf = new Configuration().configure("com/aowin/res/hibernate.cfg.xml");
		sessionFactory = conf.buildSessionFactory();
	}
	
	@AfterClass
	public static void close(){
		sessionFactory.close();
	}

	@Test
	public void testFlush() {
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		User user = (User) session.load(User.class, 16);
		user.setAddress("杭州萧山5");
		// session.flush();//强制将session管理的对象(持久态)同步到数据库
		user.setAddress("杭州西湖12");
	
		session.getTransaction().commit();// 如果对数据库做修改update delete save 都要打开事务
			System.out.println(user.getId());// 提交事务
	}

	/**
	 * Clear方法:清除Session管理的对象(持久态对象以HashMap形式纳入Session管理)
	 */
	@Test
	public void testClear() {
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		User user = (User) session.load(User.class, 1);
		user.setAddress("杭州萧山5");
		session.clear();
		user.setAddress("杭州西湖12");
		session.save(user);
		session.getTransaction().commit();// 如果对数据库做修改update delete save 都要打开事务
											// 提交事务
	}
	
	
	@Test
	public void testSelect() {
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		//String hql = from User u where u.id > ? and u.id < ? 和下面语句等效
		String hql = "from User u where u.id >:a and u.id<:b";
		List<User> list  = session.createQuery(hql).setParameter("a", 2).setParameter("b", 16).list();
		for(User user : list){
			System.out.println(user.getUsername());
		}
		session.getTransaction().commit();
	}
	
	@Test
	public void testSelect2() {
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		Query query = session.createQuery("from User");
		query.setMaxResults(10);//每页10条
		query.setFirstResult(5);//参数5:表示从第六条开始  取10条;
		List<User> list = (List<User>)query.list();
		for(User user:list){
			System.out.println(user.getId());
		}
		session.getTransaction().commit();
	}
	
	
	@Test
	public void testLoad(){
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		User user = (User) session.get(User.class, 1);
		session.getTransaction().commit();
	
	}
	
	
	@Test
	public void testSelect3() {
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		Query query = session.createQuery("select new com.aowin.vo.UserVO( u.username,u.address ) from User u ");
//		List<Object[]> objectList = query.list();
		List<UserVO> userVOList = query.list();
		for(UserVO userVO : userVOList){
			System.out.println(userVO.getAddress());
		}
//		UserVO userVO = null;
//		for(Object[] object : objectList){
//			userVO = new UserVO();
//			userVO.setAddress(object[0]+"");
//			userVO.setUsername(object[1]+"");
//			userVOList.add(userVO);
//		}
		
		session.getTransaction().commit();
	}
	
	/**
	 * 传原生的SQL 不是HQL
	 * 用createSQLQuery创建query对象
	 * Hibernate推荐使用HQL,但是也提供了对SQL的支持
	 */
	@Test
	public void testSelect4() {
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		Query query = session.createSQLQuery(" select * from user ");
		List<Object[]> objectList = query.list();
		for(Object[] object : objectList){
			System.out.println(object[0]);
		}
		
		session.getTransaction().commit();
	}
	
	
	@Test
	public void testSelect5() {
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		Query query = session.createSQLQuery(" select * from user ").addEntity(User.class);
		List<User> objectList = query.list();
		for(User user : objectList){
			System.out.println(user.getUsername());
		}
		
		session.getTransaction().commit();
	}
	
	/**
	 * load:默认延迟加载(lazy="true")
	 * 
	 */
	@Test
	public void testSelect6(){
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		User user = (User)session.load(User.class,1);
		
		session.getTransaction().commit();
	}
	
	
	/**
	 * 大部分的情况下 让lazy保持默认的就可以了
	 */
	@Test
	public void testSelect7(){
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		User user = (User)session.load(User.class,1);
		System.out.println(user.getAddress());
		
		session.getTransaction().commit();
	}
	
	/**
	 *Iterate:发一条hql把所有id取出来
	 *用的时候再根据id取对象 
	 *Iterate会利用缓存(查id的时候不会利用缓存)
	 */
	@Test
	public void testSelect8(){
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		Iterator<User> userIterate = (Iterator<User>)session.createQuery("from User u where u.id>12").iterate();//查询所有的id,不会利用写的缓存,但会利用读的缓存
		
		while(userIterate.hasNext()){
			User user = userIterate.next();//真正的取查询用户,利用读的缓存和写的缓存(session管理的 HashMap)
			System.out.println(user.getAddress());
		}
		
		Iterator<User> userIterate2 = (Iterator<User>)session.createQuery("from User u where u.id>12").iterate();//只发查询id的sql
		
		while(userIterate2.hasNext()){//利用读的缓存和写的缓存
			User user = userIterate2.next();//缓存中存在不去数据库中查询
			user.getAddress();
		}
		
		
		session.getTransaction().commit();
	}
	
	
	/**
	 * session级别的缓存
	 * list:发一条hql 所有的数据取出来
	 * list:不会利用缓存
	 * 区别:list一次性取出来  iterate分布取出来(对数据库压力小)
	 */
	@Test
	public void testSelect9(){
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		List<User>  userList = session.createQuery("from User where id > ? ").setParameter(0,12).list();
		
		for(User user :userList){
			System.out.println(user.getUsername());
		}
		
		
		List<User>  userList2 = session.createQuery("from User where id > ? ").setParameter(0,12).list();
		
		for(User user :userList2){
			System.out.println(user.getUsername());
		}
		
		session.getTransaction().commit();
	}
	
	
	/**
	 * session级别的缓存
	 */
	@Test
	public void testSelect10(){
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		Iterator<User> userIterate = (Iterator<User>)session.createQuery("from User u where u.id>12").iterate();
		while(userIterate.hasNext()){
			User user = userIterate.next();
			System.out.println(user.getAddress());
		}
		
		session.clear();//清空session级别的缓存
		
		Iterator<User> userIterate2 = (Iterator<User>)session.createQuery("from User u where u.id>12").iterate();
		while(userIterate2.hasNext()){
			//具体使用User的时候先取看缓存中是否存在 如果存在则直接从缓存中拿(以HashMap的形式存在缓存中)
			User user = userIterate2.next();
			user.getAddress();
		}
		
		session.getTransaction().commit();
	}
	
	//查询掌握好HQL形式/get/load(区别)/lazy的设置/SQL
	//Criteria(了解)
	//一般情况下hibernate不支持*,count(*)除外.
	
	
	@Test
	public void testSelect11(){
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		String hql = "select * from User where id > ? ";
		session.createQuery(hql).setParameter(0, 12).list();
		session.getTransaction().commit();
	}
	
	
	/**
	 * 返回一条记录可以用uniqueResult
	 * count(*) 返回的是Long类型的
	 */
	@Test
	public void testSelect12(){
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		String hql = "select count(*) from User  ";
	//	Long l  = (Long)session.createQuery(hql).setParameter(0, 12).uniqueResult();
		Query q = session.createQuery(hql);
		Long l =(Long) q.uniqueResult();
		
		System.out.println(l);
		session.getTransaction().commit();
	}
	
	
}
 

你可能感兴趣的:(Hibernate)