hibernate学习笔记4---HQL、通用方法的抽取实现

一、通用方法的抽取实现
由于hibernate中对增删改查的一切操作都是面向对象的,所以将增删改查抽取成通用方法,以满足不同的表的增删改查操作,简化jdbc代码。
具体例子如下:
package cn.itcast.hibernate;

import java.io.Serializable;

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

/*
 * 想让初始化创建只执行一次
 * 方式1:单例模式
 * 方式2: 静态语句块等
 * 
 * 由于只想让初始化执行一次,不想让其他类继承所以此类用final修饰,不想被其他类初始化所以默认构造用private修饰,由于在静态语句块中所以加static
 * 
 * 
 */
public final class HIbernateUtil {


	private static SessionFactory sessionfactory;
	private HIbernateUtil(){
		
	}
	 /**
  	  * 细节1:Configuration:是一个配置类
  	  * Configuration的对象会找hibernate.cfg.xml,完成hibernate的初始化
  	  *
  	  * 细节2:hibernate的配置文件有两种hibernate.cfg.xml和hibernate.properties
  	  * 两种存在一种即可,当然如果都存在的话,hibernate.cfg.xml中的配置信息会覆盖hibernate.properties的配置信息
  	  * 
  	  * 细节3:初始化工作只尽量只初始化一次,耗时
  	  */	
	static {
		Configuration cfg = new Configuration();
		cfg.configure();
		//cfg.configure("filename"); 可以通过filename来指定配置文件的位置和配置文件名(如果不在默认classpath的位置下)
		//所用的src下的文件都会经行编译,最后字节码文件在classpath下,bin是classpath下的一部分
		sessionfactory = cfg.buildSessionFactory();
	}
	/*
	 * 创建出对象,通过getter方法方便外接使用
	 * 
	 */
	public static SessionFactory getSessionfactory() {
		return sessionfactory;
	}
	
	/**
	 * 此session包为org.hibernate.Session;
	 * @return
	 * 定义方法返回session,session你可以理解为jdbc的数据库连接
	 */
	public static Session getSession(){
		return sessionfactory.openSession();
	}
	/**
	 * 通用保存方法
	 * @param entity
	 */
	public static  void add(Object entity){
		
		Session s = null;
		Transaction tx = null;
		try {
			s=HIbernateUtil.getSession();
			tx = s.beginTransaction();
			s.save(entity);
			tx.commit();
		} finally {
			if(s!=null){
				s.close();
			}
		}
	}
	
	/**
	 * 通用更新方法
	 * @param entity
	 */
	public static  void update(Object entity){
		
		Session s = null;
		Transaction tx = null;
		try {
			s=HIbernateUtil.getSession();
			tx = s.beginTransaction();
			s.update(entity);
			tx.commit();
		} finally {
			if(s!=null){
				s.close();
			}
		}
	}
	
	/**
	 * 通用删除方法
	 * @param entity
	 */
	public static  void delete(Object entity){
		
		Session s = null;
		Transaction tx = null;
		try {
			s=HIbernateUtil.getSession();
			tx = s.beginTransaction();
			s.delete(entity);
			tx.commit();
		} finally {
			if(s!=null){
				s.close();
			}
		}
	}
	
	/**
	 * 通用根据ID查询方法
	 * @param entity
	 */
	public static  Object get(Class clazz,Serializable id){
		
		Session s = null;
		
		try {
			s=HIbernateUtil.getSession();
			Object obj = s.get(clazz, id);
			return obj;
		} finally {
			if(s!=null){
				s.close();
			}
		}
	}
}

二、HQL(Hibernate Query Language)
面向对象的查询语句,与sql不同,HQL中的对象名是区分大小写的(除了java类和属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且支持多态;
HQL主要通过Query来操作,QUery的创建方式:
Query q = session.createQuery(hql);
from Person
from User user where user.name = :name
from User user where user.name = :name and user.birthday <:birthday
 
 
sql查的是表,HQL查的是对象!
hibernate一切都是从对象出发,hql就是按照对象来查而不是表
package cn.itcast.hibernate;

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

import org.hibernate.Query;
import org.hibernate.Session;

import cn.itcast.hibernate.domain.User;

public class QueryTest {

	
	/**
	 * 使用HQL根据name查询方法
	 * @param entity
	 */
	public static void Query(String name){
		
		Session s = null;
		try {
			s=HIbernateUtil.getSession();
			//HQL:
			//这里的from后面跟的不是表名,而是对象名(类名)
			String hql = "from User as user where user.name=?"; //from Object 支持多态度
			Query query = s.createQuery(hql);
			query.setString(0, name);
			List list=query.list(); //executQuery(); 
			for(User user:list){
				System.out.print(user.getName());
			}
			
			//如果确定数据最多只有一条,可以使用一下的方法简化代码
			User u= (User)query.uniqueResult();
			System.out.print("只有一条数据"+u.getName());
		} finally {
			if(s!=null){
				s.close();
			}
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		User user = new User();
		user.setName("name");
		user.setBirthday(new Date());
		HIbernateUtil.add(user);
		Query(user.getName());

	}

	
}

String hql = "from Users as users where users.name = ?";切记用对象不要用表名

注意这句 users是Users的别名,

User是类名,不能直接使用User.name(不能通过类来访问,就好像你不能通过类名去访问实例变量一样。
通常会用别名的方式解决,比如
from Users as users where users.name = ?(别名就好像是test类的一个对象,通过对象就可以访问实例变量)

当然,仅对一个类进行操作,也可以不借助于别名:
from Users where name = 'sdf'

 

还可以用query.uniqueResult();用来返回单一的查询结果,务必确保查询结果唯一。


 
扩展链接:
HQL语法介绍:
http://www.cnblogs.com/bobomail/archive/2005/09/20/240352.html
http://www.cnblogs.com/rockniu/archive/2009/10/26/1590254.html
HQL多表链接:
http://www.blogjava.net/zoninge/archive/2009/10/21/251892.html
http://www.cnblogs.com/cyjch/archive/2012/03/14/2395340.html
 

你可能感兴趣的:(Hibernate)