这个小项目里用到了Hibernate,用Hibernate的HQL管理项目中的Dao方便了一些,不够项目里没有Spring,所以没有Template,事务处理什么的纯交给Hibernate管理。
这样也好,Hibernate管的事儿都很明确的在Dao里。
一:sessionFactory
由于没有spring,所以没有Template和Aop事务管理,这些东西交给Hibernate自己管理
private static SessionFactory sessionFactory = null;
private Session session = null;//创建Session对象
Transaction tx = null;//创建事务管理对象
//连接数据库
static {
try {
// 加载Hibernate配置文件
Configuration cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
} catch (Exception e) {
二:用泛型统一接口
看了这个Dao才发现之前自己写的东西里重复的东西太多,用泛型复用就好了
拿save举个说明性的例子:
public class ObjectDao<T> {
… …
public boolean saveT(T t) {
Session session = sessionFactory.openSession();//开启Session
try {
tx = session.beginTransaction();//开启事务
session.save(t);//执行数据添加操作
tx.commit();//事务提交
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
session.close();//关闭Session
}
return true;
}
传入泛型T,后边连转换都省了
然后还有个新鲜的:
uniqueResult()只返回唯一一条查询后的结果,
这样把这条唯一的结果强转成泛型T,再返回正好是想要的结果
public T queryFrom(String hql) {
T t = null;//引用实体对象
session = sessionFactory.openSession();//开启Session
tx = session.beginTransaction();//开启事务
try {
Query query = session.createQuery(hql);//利用hql语句进行查询
t = (T) query.uniqueResult();//将查询结果转换为实体对象
} catch (Exception e) {
e.printStackTrace();
}
tx.commit();//事务提交
session.close();//Session关闭
return t;//返回对象
}
三:查询指定条数结果
之前用过的分页是靠JDBC实现的,这个例子的作用就是拿HQL就能实现了,感觉这个后边会和分页的应用结合比较紧密
public List<T> queryList(String hql, int showNumber, int beginNumber) {
session = sessionFactory.openSession();//开启Session
tx = session.beginTransaction();//开启事务
List<T> list = null;
try {
Query query = session.createQuery(hql);//利用hql语句进行查询
query.setMaxResults(showNumber);//设置查询结果的条数
query.setFirstResult(beginNumber);//设置查询的起始位置
list = query.list();//将返回的结果集转换成List集合
} catch (Exception e) {
e.printStackTrace();
}
tx.commit();//事务提交
session.close();//关闭Session
return list;//返回List集合
}