hibernate4框架的增删查改(包含hql)数据等功能方法

本次程序测试的是hibernate4框架的增加、修改、删除、查询等方法,每种功能都集合了几种简单的方法来进行测试,程序猿可按需获取;

hibernate框架搭建之后,使用它的流程基本是:获取configuration配置文件-->根据配置文件创建sessionFactory-->根据sessionFactory创建session-->根据session开启事务Transaction-->创建实例化对象,然后进行持久化增删改以及查询等操作-->最后关闭事务,关闭session,关闭sessionFactory;

这个流程大概面试的时候也会经常被问到,所以与其去死记硬背这些流程,倒不如从实践中获取真理,本次测试会完整还原整个流程;

实践之后,对流程的印象会更深刻喔^-^;

话不多说,直接上代码:

一、整个测试的框架(简单易懂):

hibernate4框架的增删查改(包含hql)数据等功能方法_第1张图片

二、测试main方法类TestHibernate,相关的操作都已经作了详细说明:

package controller;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.hibernate.service.ServiceRegistry;

import entity.TUser;
/**
 * @author xiaohe
 * 测试hibernate(4)的增删查改功能方法;
 * 测试前提:
 *     开发工具eclipseEE(可以根据需求修改成其他开发工具);
 *     搭建好hibernate框架(网上即可查阅很多搭建框架的案例,可以百度一下),本次测试使用hibernate tools自动生成数据表和映射文件;
 *     本次测试使用mysql数据库,数据库表有两个(user和customer),本次测试只运用user,可根据需求更换数据库和数据表;
 *     加入mysql以及hibernate4等相关jar包;
 */
public class TestHibernate {
    public static void main(String[] args){
        // 实例化Configuration,  
        Configuration conf = new Configuration()  
        // 下面方法默认加载hibernate.cfg.xml文件  
                .configure();  
        // 以Configuration创建SessionFactory ,hibernate4版本之后直接使用 conf.buildSessionFactory()是已经过时了的;
        ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
        								.applySettings(conf.getProperties()).build();
        SessionFactory sf = conf.buildSessionFactory(serviceRegistry); 
        
        // 创建Session  
        Session sess = sf.openSession();  
        // 开始事务  
        Transaction tx = sess.beginTransaction();  
        // 创建实例对象,进行持久化操作,下面将使用多种方法进行增、删、查、改测试, 需要测试哪一种方法可去掉注释;
        TUser tuser = new TUser();  
        isadd(tuser,sess);//增
//        isdelete(tuser,sess);//删1
//        isdelete1(tuser,sess);//删2
//        isupdate(tuser,sess);//改1
//        isupdate1(tuser,sess);//改2
//        List list = isquery1(sess);
//        System.out.println("根据年龄查询的姓名:"+list.get(0).getUserName());//查1
//        TUser user=isquery(tuser,sess);
//        System.out.println("根据id查询到的姓名:"+user.getUserName());//查2
//		  List list = isquery2(sess);
//		  System.out.println("对象化查询的姓名:"+list.get(0).getUserName());//查3
        // 提交事务  
        tx.commit();  
        // 关闭Session  
        sess.close();  
        sf.close();  
    }  
    //增加数据
    public static boolean isadd(TUser tuser,Session sess){
        // 添加一条记录,设置用户年龄和姓名 ,如果没设置的话插入数据库默认为null
        tuser.setAge("22");
        tuser.setUserName("22");
        // 保存插入内容  
        sess.save(tuser);  
		return true; 	
    }
    //删除数据方法1
    public static boolean isdelete(TUser tuser,Session sess){
    	tuser.setId((long) 4); //删除数据需指定id才能进行删除,删除id=16的项
    	sess.delete(tuser);
		return true; 	
    }
    //删除数据方法2,使用hql
    public static boolean isdelete1(TUser tuser,Session sess){
    	String hql = "delete TUser u where u.id=?";
    	Query query = sess.createQuery(hql);
    	query.setLong(0, (long)3);
    	boolean issuccess = (query.executeUpdate()>0);
		return issuccess;
    	
    }
    //更新数据方法1
    public static boolean isupdate(TUser tuser,Session sess){
    	tuser = (TUser)sess.get(TUser.class,(long)3);//根据id获取唯一表行
    	  if(tuser != null){
    		  tuser.setUserName("xiaohe");
    		  tuser.setAge("23");
    		  sess.update(tuser);
    	  }	
    	  return true; 
    }
    //更新数据方法2,使用hql
    public static boolean isupdate1(TUser tuser,Session sess){
        String hql = "update TUser u set u.userName=?,u.age=? where u.id=?";  
        Query query = sess.createQuery(hql);  
        query.setString(0, "xiaoxue");  
        query.setString(1, "21");  
        query.setLong(2, (long)2);
        boolean issuccess = (query.executeUpdate() > 0);
    	return issuccess; //执行executeUpdate()方法更新数据库数据
    }
    //查询数据方法1
    public static TUser isquery(TUser tuser,Session sess){
    	TUser user=(TUser)sess.load(TUser.class, (long)2);
		return user;  
    }
    //查询数据方法2,使用hql
    public static List isquery1(Session sess){
    	//注意:此处TUser是类名,而不是数据库的表名,使用数据库表名是查询不到的
    	String hql="from TUser where age='23'";
    	Query query = sess.createQuery(hql);  	
    	//如果需要使用制定的age进行查询,则使用下列方法
//        String hql = "from User u where u.id=?";  
//        Query query = sess.createQuery(hql);
//        query.setLong(0, id); 
		return query.list();  
    }
    //查询方法3,使用对象化Criteria方法查询
    public static List isquery2(Session sess){
    	Criteria cri = sess.createCriteria(TUser.class);
    	cri.add(Restrictions.eq("age", "23"));//添加条件之后会自动执行查询方法,我们所需要做的只是获取数据
//    	cri.add(Restrictions.eq("username", "xiaohe"));//如果需要多个条件可以添加多个语句
    	/*需要说明一下eq等方法释义:
    	eq-->equal,等于
    	allEq --> 参数为Map对象,相当于多个Restrictions.eq的效果
    	gt-->great-than > 大于
    	ge --> great-equal >= 大于等于
    	lt --> less-than, < 小于
    	less-equal <= 小于等于
    	between --> 对应SQL的between子句
    	like --> 对应SQL的LIKE子句
    	...
    	*/
    	List list = cri.list();//自动获取刚刚查询的结果集合
		return list;	
    }
}

三、实体类TUser

package entity;

public class TUser implements java.io.Serializable {

	private Long id;
	private String age;
	private String userName;

	public TUser() {
	}

	public TUser(String age, String userName) {
		this.age = age;
		this.userName = userName;
	}

	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getAge() {
		return this.age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getUserName() {
		return this.userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

}

四、说明:

1. TCustomer的实体类和TUser的实体类格式是一样的,两个实体类对应的表分别为Customer和User,他们的映射关系在TCustomer.hbm.xml和TUser.hbm.xml里面进行配置~

2. hibernate.cfg.xml为连接数据库的配置文件;hibernate.reveng.xml是hibernate对数据库表进行逆向生成POJO类可自动生成的,在生成映射代码的时候需要用到,这些都是在使用hibernate tools搭建的时候可以自动生成的,所以不必担心~

3. 为方便大家搭建框架,附上搭建框架个人认为比较好的一篇文章链接:http://www.cnblogs.com/abllyboy/archive/2010/12/23/1914577.html,希望能对搭建框架不是很懂的亲们有所帮助~

4. 附上本次测试使用到的相关jar包链接:http://download.csdn.net/detail/alan_liuyue/9696324~

5. 因为网上已经有很多hibernate测试的项目实例,所以在这里就免得多此一举,就不再上传这次测试的实例,如果确实有需要的话可以留下邮箱,可以单独发送~


五、结束语

实践是检验真理的标准;


你可能感兴趣的:(hibernate框架)