在学习Hibernate时,发现增删改查代码重复太多,归结成工具类,可以提高编码效率。
主要是增删该查功能,因此分为两大类型方法(增删改一类,查询一类),而方法又需要Session对象操作,因此,需要打开Session对象和关闭Session对象的方法。(其中增删改方法需要标识类型,因此又需创建枚举)。具体如下代码:
/**
*创建枚举
*/
/**
*
* @Package:名称: HqlUtil
* @Description:描述:创建枚举用来标识增删改的具体方法
*
*/
public enum HqlUtil {
upd, // 标识为修改方法
del, // 标识为删除方法
add; // 标识为新增方法
}
/**
*工具类
*/
import java.util.*;
import org.hibernate.*;
import org.hibernate.cfg.*;
/**
*
* @Package:名称: TravelUtil
* @Description:类描述:工具类主要封装增删该查的方法
* @date:建时间: 2015-5-16
*/
public class TravelUtil {
/**
* 打开session 返回值类型为Session
*/
public Session opneSession() {
return new Configuration().configure().buildSessionFactory()
.openSession();
}
/**
* 需要传入打开的Session
* 关闭session 返回值类型为void
*/
public void closeSession(Session sess) {
if (sess != null) {
sess.close();
}
}
/**
* 增删改调用该方法
*
* @param object
* :需要操作的inverse=false的对象
* @param inverse
* =false(主动方)由主动方维护关联关系
* @param Enum control
* 这是枚举,修改就是Control.upd,删除Control.del,
* 新增Control.add;
* @调用举例 new TravelUtil().ControlHql(object, Control.add);
*/
public int ControlHql(Object object, Enum control) {
Session session = opneSession();
Transaction tx = session.beginTransaction();
int flg = -1;
try {
if(control.equals(HqlUtil.upd)){
session.update(object);
} else if (control.equals(HqlUtil.del)) {
session.delete(object);
} else if (control.equals(HqlUtil.add)) {
session.save(object);
}
flg = 1;
tx.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
flg = -1;
tx.rollback();
} finally {
this.closeSession(session);
}
return flg;
}
/**
* 查询方法返回List<Object>集合
*
* @param object
* 为setProperties分装的条件
* @param hql为查询语句
* @return list<Object>集合
*/
public List<Object> getReadList(String hql, Object object) {
Session session = opneSession();
Query query = session.createQuery(hql).setProperties(object);
List<Object> list = query.list();
this.closeSession(session);
return list;
}
/**
*
* @Title: getReadList
* @Description: 方法重载,实现分页
* @param @param nowPage
* @param @param pageSize
* @param @return
* @return List<Object>
* @throws
*/
public List<Object> getReadList(Object object,String hql,int nowPage, int pageSize) {
Session session=this.opneSession();
Query query = session.createQuery(hql).setProperties(object);
query.setFirstResult(nowPage);
query.setMaxResults(pageSize);
List<Object> obje=query.list();
return obje;
}
/**
* @Title: getCont
* @Description:得到查询sql条数
* @param @param hql
* @param @return
* @return int
* @throws
*/
public int getCount(String hql){
if(hql.indexOf("count")<=0){
System.out.println("语句不符合查询总条数的语法");
return -1;
};
Session session=this.opneSession();
Query query=session.createQuery(hql);
Long li=(Long)query.uniqueResult();
int flg=Integer.parseInt(li.toString());
System.out.println(flg);
this.closeSession(session);
return flg;
}
}
/**
*
* @Title: main
* @Description: 工具类调用示例
* @param @param args
* @return void
* @throws
*/
public class Tests{
public static void main(String[] args) {
//调用---------------------得到总条数方法
//1.调用方法得到总条数
int flg=new TravelUtil().getCount("select count(*) from Userinfo");
//2.测试得到的总条数
System.out.println(flg);
System.out.println("这是调用--分页--查询方法得到所有数据,只举了用户名");
//调用----------------------分页查询
//1.调用方法getReadList
List<Object> object= new TravelUtil().getReadList(new Object(),"from Userinfo",1, 15);
//2.得到数据并便利
for (Object object2 : object) {
//拆箱
Userinfo userinfo=(Userinfo)object2;
//得到用户名
System.out.println(userinfo.getUsname());
}
System.out.println("这是调用查询方法得到所有数据,只举了用户名");
//调用---------------------查询得到所有数据
List<Object> object3= new TravelUtil().getReadList("from Userinfo",new Object());
for (Object object2 : object3) {
//拆箱
Userinfo userinfo=(Userinfo)object2;
//得到用户名和用户
System.out.println(userinfo.getUsname());
}
System.out.println("------调用增删改成方法,只举例用户表-------");
//调用增删改查方法
//1.创建对象 保存新增数据
Userinfo uid=new Userinfo();
//给属性赋值
uid.setUsname("张三");
uid.setUspass("1faf3aff");
//2.调用封装好的controlHql方法执行新增(add)并保持结果
int flgAdd= new TravelUtil().ControlHql(uid, HqlUtil.add);
//3.根据结果判断是否执行成功!
System.out.println(flgAdd>0?"新增成功!":"新增失败!");
}
}