`
yejun0099
  • 浏览: 26454 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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应用实例开发

    Hibernate应用实例开发 Hibernate功能介绍

    Struts2、Spring和Hibernate应用实例

    Struts2、Spring和Hibernate是Java开发中三大主流框架,它们各自解决不同的问题,并且可以协同工作,构建出高效、可维护的企业级Web应用程序。在本实例中,我们将深入探讨这三个框架的核心概念、功能以及如何将它们...

    hibernate3应用实例

    hibernate3应用实例hibernate3应用实例hibernate3应用实例hibernate3应用实例

    Struts2、Spring和Hibernate应用实例.doc

    Struts2、Spring 和 Hibernate 应用实例 在本文中,我们将详细介绍 Struts2、Spring 和 Hibernate 三种流行框架的整合应用,并通过实例来展示如何使用这些框架来实现 CRUD 操作。 Struts2 概述 Struts2 是一个...

    Struts211、Spring和Hibernate应用实例.docx

    。。Struts211、Spring和Hibernate应用实例.docx

    Struts211、Spring和Hibernate应用实例.pdf

    。。Struts211、Spring和Hibernate应用实例.pdf

    jsp+tomcat+Struts2+Spring+Hibernate应用实例.rar

    标题中的"jsp+tomcat+Struts2+Spring+Hibernate应用实例"揭示了一个基于Java Web技术的项目构建,其中涉及到的主要技术栈包括JSP、Tomcat服务器、Struts2、Spring和Hibernate。这个实例可能是一个典型的MVC(Model-...

    Hibernate应用案例

    【Hibernate应用案例】深入解析 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本案例将详细讲解如何在实际项目中应用Hibernate框架,包括其核心概念、配置、对象持久...

    Struts2、Spring和Hibernate应用实例.

    现在就将笔者使用Myeclipse工具应用struts2 + spring2 + hibernate3 实现CRUD操作的步骤一一纪录下来,为初学者少走弯路略尽绵薄之力!在本文中,笔者将Struts2.0.6、Spring2.0.6和Hibernate3.1进行整合,希望通过...

    Struts2 Spring和Hibernate应用实例

    ### Struts2、Spring与Hibernate整合应用实例解析 #### 一、引言 在现代软件开发领域,尤其在Java Web应用程序开发中,Struts2、Spring与Hibernate这三大框架的结合,构成了一个强大的开发组合,被称为SSH(Struts...

    Hibernate入门案例源码

    【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...

Global site tag (gtag.js) - Google Analytics