hibernate的多层优化问题

刚开始接触数据库的时候,连mvc是什么都不到。直到开始学hibernate的时候才开始有了分层的思想。但是,即使有了这最基本的概念,写出来的代码冗余度还是比较高的。

比如说,如果我想要添加一条用户记录,则代码如下

用户类:

package entity;

public class User {

private int user_id;

private String username;

private String password;

public int getUser_id() {
return user_id;
}

public String getUsername() {
return username;
}

public String getPassword() {
return password;
}

public void setUser_id(int user_id) {
this.user_id = user_id;
}

public void setUsername(String username) {
this.username = username;
}

public void setPassword(String password) {
this.password = password;
}

}

dao接口层:

public interface IUserDao {

void save(User user);

User queryUserById(int user_id);

}

dao实现层:

public class UserDaoImpl implements IUserDao {

public void save(User user) {
Session session = null;
Transaction tran = null;
try {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
session.save(user);
tran.commit();
} catch (Exception e) {
tran.rollback();
} finally {
session.close();
}
}

}

这样,一个简单的保存用户的操作就可以完成了。刚开始觉得这样子时没问题的,并且我添加其他类时(比如Product,Order)等也都是这么做。

但是,可以看得出来,这样子时不合理的。很明显嘛,代码冗余度很高,如果是保存一个Product对象,可以想象代码如下:

public class ProductDaoImpl implements IProductDao {

public void save(Product product) {
Session session = null;
Transaction tran = null;
try {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
session.save(product);
tran.commit();
} catch (Exception e) {
tran.rollback();
} finally {
session.close();
}
}

}

比较一下,就是参数变了,把user替换成了product而已。后来,我就想,能不能把这两个方法写成一个方法。既然可以保存user,又可以保存product,那么把参数换成它们的共有父类(没有什么比Object更合适的了)不就可以了吗

于是,代码优化如下:

BaseDao接口:

public interface IBaseDao {

void save(Object object);

}

UserDao接口:

public interface IUserDao {

void save(User user);

}

BaseDao实现类:

public class BaseDaoImpl implements IBaseDao {

public void save(Object object) {
Session session = null;
Transaction tran = null;
try {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
session.save(object);
tran.commit();
} catch (Exception e) {
tran.rollback();
} finally {
session.close();
}
}

}

UserDao实现类:

public class UserDaoImpl extends BaseDaoImpl implements IUserDao {

public void save(User user) {
super.save(user);
}

}

这样,对数据库操作的方法直接写一个就好了,统一放在BaseDao里面。当想要保存product时直接调用BaseDao里面的save方法,将Object参数用Product具体对象替换即可。

删除和修改时一样的道理。

那么,接下来就只有查询了。查询相对来说会比较麻烦一点。

我先以查询单个对象为例,根据Id查询一条记录,返回一个结果。

查询有几个问题分别是:1,参数是不同类型的;2,参数的个数是未知的;3,返回结果的类型是未知的。

因为返回结果的类型未知,所以要查询的对象也不知道,所以只能把查询语句作为参数传进来,因为参数的不同类型,所以不用调用query.setInteger, query.setString等方法了。在这里,有两种方法,一种是将参数列表用一个Map传进来,Map中的参数列表必须是简单对象才行,调用query.setParameter方法。另一种是将参数用一个实体类封装传进来,将实体作为参数可以调用query.setProperty方法。至于返回结果的类型,我想大家估计是想到用Object接收。这也可以,但我个人感觉不好,我建议大家用范型来接收。

以下是部分代码:

BaseDao接口:

public interface IBaseDao {

void save(Object object);

void delete(Object object);

void update(Object object);

/**
* 查询结果返回一个List集合
* @param params Map 参数列表
* @return T 返回结果时将T用List接收
*/
public <T> T queryForList(String hql, Map<String, Object> params);

/**
* 查询结果返回一个List集合
* @param params Map 参数列表
* @return T 返回结果时将T用List接收
*/
public <T> T queryForList(String hql, Object paramBean);

/**
* 查询结果返回单个对象
* @param hql
* @return T 返回结果时将T用实体类接收
*/
public <T> T queryForObject(String hql, Map<String, Object> params);

}

BaseDao实现类:

package dao.impl;

import java.util.Map;
import java.util.Map.Entry;

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

import util.HibernateSessionFactory;
import dao.IBaseDao;

public class BaseDaoImpl implements IBaseDao {

public void save(Object object) {
Session session = null;
Transaction tran = null;
try {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
session.save(object);
tran.commit();
} catch (Exception e) {
tran.rollback();
} finally {
session.close();
}
}

public void delete(Object object) {
Session session = null;
Transaction tran = null;
try {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
session.delete(object);
tran.commit();
} catch (Exception e) {
tran.rollback();
} finally {
session.close();
}
}

public void update(Object object) {
Session session = null;
Transaction tran = null;
try {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
session.update(object);
tran.commit();
} catch (Exception e) {
tran.rollback();
} finally {
session.close();
}
}

/**
* 参数名必须与对象属性名一致
*
* @param params
* Map 参数列表
* @return List
*/
@SuppressWarnings("unchecked")
public <T> T queryForList(String hql, Map<String, Object> params) {
Session session = null;
Transaction tran = null;
Query query = null;
T result = null;
try {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
query = session.createQuery(hql);
if (params != null) {
for (Entry<String, Object> entry : params.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
}
result = (T) query.list();
tran.commit();
} catch (Exception e) {
tran.rollback();
} finally {
session.close();
}
return (T) result;
}

/**
* 参数名必须与对象属性名一致
*
* @param paramBean
* 参数对象
*/
@SuppressWarnings("unchecked")
public <T> T queryForList(String hql, Object paramBean) {
Session session = null;
Transaction tran = null;
Query query = null;
T result = null;
try {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
query = session.createQuery(hql);
query.setProperties(paramBean);
result = (T) query.list();
tran.commit();
} catch (Exception e) {
tran.rollback();
} finally {
session.close();
}
return (T) result;
}

/**
* 参数名必须与对象属性名一致
*
* @param params
* 查询结果返回单个对象
* @return T 返回一个实体类对象
*/
@SuppressWarnings("unchecked")
public <T> T queryForObject(String hql, Map<String, Object> params) {
Session session = null;
Transaction tran = null;
Query query = null;
T result = null;
try {
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
query = session.createQuery(hql);
for (Entry<String, Object> entry : params.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
result = (T) query.uniqueResult();
tran.commit();
} catch (Exception e) {
tran.rollback();
} finally {
session.close();
}
return (T) result;
}

}

OrderDao接口:

public interface IOrderDao {

void save(Order order);

void delete(Order order);

void update(Order order);

Order queryOrderById(int order_id);

List<Order> queryOrderByUser(User user);

}

OrderDao实现类:

public class OrderDaoImpl extends BaseDaoImpl implements IOrderDao {

public void save(Order order) {
super.save(order);
}

public void delete(Order order) {
super.delete(order);
}

public void update(Order order) {
super.update(order);
}

/**
* 根据id查询<br>
* 将Map作为参数传输载体
* @param order_id
*/
public Order queryOrderById(int order_id) {
String hql = "from Order order where order.order_id = :order_id";
Map<String, Object> params = new HashMap<String, Object>(1);
params.put("order_id", order_id);
return super.queryForObject(hql, params);
}

/**
* 根据用户查询所拥有订单<br>
* 将实体作为参数传输载体
*/
public List<Order> queryOrderByUser(User user) {
String hql = "from Order order where order.user.user_id = :user_id";
return super.queryForList(hql, user);
}

}

时间: 2024-08-27 16:57:04

hibernate的多层优化问题的相关文章

hibernate之性能优化

hibernate是建立在JDBC基础上的框架,但他有很多JDBC所无法比拟的性能优化技术.下面介绍几种优化策略. 1.使用dynamic-insert与dynamic-update 在class标签中使用该属性,可以设置hibernate动态的生成SQL语句,而不是在hibernate启动时就生成预设的SQL语句. 当其设置为true时,hibernate会根据实际需求设置新增或更新的字段,而不是所有的字段. <class name="com.hibernate.book" t

Hibernate的性能优化问题

本文是根据Hibernate帮助文档,以及一些书籍及项目经验整理而成,只提供要点和思路,具体做法可以留言探讨,或是找一些更详细更有针对性的资料. 初用Hibernate的人也许都遇到过性能问题,实现同一功能,用Hibernate与用Jdbc性能相差十几倍很正常,如果不及早调整,很可能影响整个项目的进度. 大体上,对于Hibernate性能调优的主要考虑点如下: ? 数据库设计调整 ? HQL优化 ? API的正确使用(如根据不同的业务类型选用不同的集合及查询API) ? 主配置参数(日志,查询缓

Hibernate批处理操作优化 (批量插入、更新与删除)

问题描述 我开发的网站加了个新功能:需要在线上处理表数据的批量合并和更新,昨天下午发布上线,执行该功能后,服务器的load突然增高,变化曲线异常,SA教育了我一番,让我尽快处理,将CPU负载降低. 工作所需,我经常要写些程序批量处理数据,每次执行几十万数据处理的时候,我机子的CPU都会飙高,而且数据处理速度会越来越慢.比如第一个1W条要5分钟,第二个1W条就要10分钟,要干其他事情的时候机子也卡的不行,只能等着处理完数据. 其实我一直认为是数据量太大,从来不认为是程序问题,所以一直没怎么关注过.

【java】itoo项目实战之hibernate 懒载入优化性能

在做itoo 3.0 的时候,考评系统想要上线,就開始导入数据了,仅仅导入学生2万条数据,可是导入的速度特别的慢.这个慢的原因是由于导入的时候进行了过多的IO操作.可是导入成功之后,查询学生的速度更加慢.由于底层用了hibernate的hql语句进行查询的,学习过hibernate的人都知道,假设hibernate不设置懒载入的话,仅仅有是有关联的数据都会一次性所有都查询出来,我试了试.查询2万条数据,最深的级联查询是有5层,然后发出来的语句是460条,时间大概是10s.然后就考虑使用lazy进

Hibernate查询以及优化策略04

一. HQL查询 1. HQL(hibernate query language)单表查询 1.1 准备项目 创建项目: hinernate-03-query 引入jar,同前一个项目 复制实体(订单,客户),映射,配置,工具类. 1.2 HQL单表基本查询 1 /** 2 * 演示HQL的查询(单表查询) 3 * 1)全表查询 4 * 2)别名查询 5 * 3)条件查询 6 * 4)具名查询 7 * 5)分页查询 8 * 6)查询排序 9 * 7)聚合查询 10 * 8)投影查询 11 */

hibernate基本配置优化

前面已经说过hibernate的基本配置了,现在对之前的基本配置进行代码优化: 写一个读取配置工具 1 package tool; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 //configuration的工具 7 public final class HibernateUtil { 8 private s

【java】itoo项目实战之hibernate 批量保存优化

在itoo中.基本上每一个系统都有一个导入功能,大量的数据填写进入excel模板中.然后使用导入功能导入的数据库中,这样能够大大的提高工作效率. 那么导入就涉及到了批量保存数据库的问题了. 那么通常情况下,在一个Session对象的缓存中数量有限的持久化对象,等到Session对象处理事务完成,还要关闭Session对象,从而及时释放session的缓存占用的内存.在批量保存1万条数据,假设一次性把须要保存的1万条数据载入到内存职工,当运行事务提交的时候,就会清理缓存,hibernate运行1万

Hibernate ORM框架——续第一章:Hibernate的增删改查(第一个hibernate代码的优化)

一:.项目结构 二.代码 1)HibernateUtil package util; import org.hibernate.SessionFactory; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

Hibernate 优化技术之抓取策略(Fetching strategies)

一.前言 转载请标明出处:http://blog.csdn.net/wlwlwlwl015/article/details/42705585 使用hibernate一年多了,一直觉得他是一个很好用的持久层框架,在处理含有多个复杂的关联关系的数据表时,hibernate提供的各种关联映射可以让我们用少量的代码快速.便捷的去维护各种外键关系,当然他的核心还是允许我们以"面向对象"的方式去操作数据表,因为我们的Java语言就是面向对象的,所以我们使用ORM的持久层框架应该更容易理解和上手,他