本次程序测试的是hibernate4框架的增加、修改、删除、查询等方法,每种功能都集合了几种简单的方法来进行测试,程序猿可按需获取;
hibernate框架搭建之后,使用它的流程基本是:获取configuration配置文件-->根据配置文件创建sessionFactory-->根据sessionFactory创建session-->根据session开启事务Transaction-->创建实例化对象,然后进行持久化增删改以及查询等操作-->最后关闭事务,关闭session,关闭sessionFactory;
这个流程大概面试的时候也会经常被问到,所以与其去死记硬背这些流程,倒不如从实践中获取真理,本次测试会完整还原整个流程;
实践之后,对流程的印象会更深刻喔^-^;
话不多说,直接上代码:
一、整个测试的框架(简单易懂):
二、测试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测试的项目实例,所以在这里就免得多此一举,就不再上传这次测试的实例,如果确实有需要的话可以留下邮箱,可以单独发送~
五、结束语
实践是检验真理的标准;