hibernate工具類
GeneralDao.java
import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List;import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Criteria; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Projections; import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class GeneralDao<T extends Domain> extends HibernateDaoSupport implements Serializable {
private static final long serialVersionUID = 3986291569067541566L; private static final Log log = LogFactory.getLog(GeneralDao.class); private Class<T> claz; private List<Field> tableFields; @SuppressWarnings("unchecked") public GeneralDao() { super(); Type type = this.getClass().getGenericSuperclass(); Type[] params = ((ParameterizedType) type).getActualTypeArguments(); claz = (Class<T>) params[0]; tableFields = HQLUtils.getTableFields(claz); } /** * obj 增加 * * @param obj * @return */ public Long save(T obj) { return Long.valueOf(getHibernateTemplate().save(obj).toString()); } /** * obj 更新 * * @param obj */ public void update(T obj) { getHibernateTemplate().update(obj); } /** * 更新obj不為null的屬性(根據ID更新) * * @param obj */ public void updateNotNullField(T obj) { if (obj != null && obj.getId() != null && obj.getId() > 0) { T dbObj = get(obj.getId()); for (Field field : tableFields) { try { Object fieldValue = field.get(obj); if (fieldValue != null) { field.set(dbObj, fieldValue); } } catch (Exception e) { log.error( claz.getName() + "." + field.getName() + "屬性取值錯誤", e); } } getHibernateTemplate().update(dbObj); } } /** * 根據ID查詢obj * * @param id * @return */ public T get(Long id) { return getHibernateTemplate().get(claz, id); } /** * 根據ID刪除 * * @param id */ public void deleteById(Long id) { T obj = get(id); getHibernateTemplate().delete(obj); } /** * 刪除對象 * * @param obj */ public void delete(T obj) { getHibernateTemplate().delete(obj); } /** * 查詢所有記錄 * * @return */ @SuppressWarnings("unchecked") public List<T> getAll() { return getHibernateTemplate().findByCriteria(getDetachedCriteria()); } /** * 查詢記錄總數 * * @return */ public Long getCount() { return getCount(getDetachedCriteria()); } /** * 查詢與obj中非空項相等的記錄條數 * * @param obj * @return */ public Long getCountEqNotNullField(T obj) { return getCount(getDetachedCriteriaEqNotNullField(obj)); } /** * 查詢與obj中非空項相等的記錄 * * @param obj * @param begin * @param count * @param order * @return */ public List<T> getListEqNotNullField(T obj, Integer begin, Integer count, OrderEnum order) { return getList(getDetachedCriteriaEqNotNullField(obj), begin, count, order); } /** * 使用Statement.execute執行SQL * * @param sql * @return * @throws SQLException */ protected Boolean runSQL(String sql) throws SQLException { Statement st = super.getSession().connection().createStatement(); return st.execute(sql); } /** * 使用Statement.executeQuery執行SQL * * @param sql * @return * @throws SQLException */ protected ResultSet runQuerySQL(String sql) throws SQLException { Statement st = super.getSession().connection().createStatement(); return st.executeQuery(sql); } /** * 使用Statement.executeUpdate執行SQL * * @param sql * @return * @throws SQLException */ protected Integer runUpdateSQL(String sql) throws SQLException { Statement st = super.getSession().connection().createStatement(); return st.executeUpdate(sql); } /** * 獲得空查詢條件對象 * * @return */ protected DetachedCriteria getDetachedCriteria() { return getDetachedCriteriaEqNotNullField(null); } /** * 獲得查詢條件對象,并對其填充obj的非null項等值查詢條件 * * @param obj * @return */ protected DetachedCriteria getDetachedCriteriaEqNotNullField(T obj) { DetachedCriteria dc = DetachedCriteria.forClass(claz); if (obj != null) { for (Field field : tableFields) { try { Object fieldValue = field.get(obj); if (fieldValue != null) { HQLUtils.addEq(dc, field.getName(), fieldValue); } } catch (Exception e) { log.error( claz.getName() + "." + field.getName() + "屬性取值錯誤", e); } } } return dc; } /** * 根據條件獲得集合 * * @param dc * @param begin * @param count * @param order * @return */ @SuppressWarnings("unchecked") protected List<T> getList(DetachedCriteria dc, Integer begin, Integer count, OrderEnum order) { dc = (dc == null ? getDetachedCriteria() : dc); if (order != null) { dc.addOrder(order.getValue()); } if (begin != null && count != null) { return getHibernateTemplate().findByCriteria(dc, begin, count); } return getHibernateTemplate().findByCriteria(dc); } /** * 根據條件獲得記錄總數 * * @param dc * @return */ protected Long getCount(DetachedCriteria dc) { Criteria criteria = dc.getExecutableCriteria(this.getSession()); criteria.setProjection(Projections.rowCount()); Object results = criteria.uniqueResult(); return Long.valueOf(results.toString()); }
}</pre>
HQLUtils.java
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.List;import javax.persistence.Column;
import org.apache.commons.lang.StringUtils; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Restrictions;
public class HQLUtils {
/** > 操作 */ public final static String HQL_SIGN_GT = ">"; /** < 操作 */ public final static String HQL_SIGN_LT = "<"; /** = 操作 */ public final static String HQL_SIGN_EQ = "="; /** >= 操作 */ public final static String HQL_SIGN_GE = ">="; /** <= 操作 */ public final static String HQL_SIGN_LE = "<="; /** != 操作 */ public final static String HQL_SIGN_NE = "!="; /** between 操作 */ public final static String HQL_SIGN_BETWEEN = "between"; /** 為 null 操作 */ public final static String HQL_SIGN_NULL = "null"; /** 不為 null 操作 */ public final static String HQL_SIGN_NO_NULL = "notNull"; /** in 操作 */ public final static String HQL_SIGN_IN = "in"; /** like全匹配, 如%val% */ public final static String HQL_LIKE_ANYWHERE = "%val%"; /** like右匹配, 如val% */ public final static String HQL_LIKE_RIGHT = "val%"; /** like左匹配, 如%val */ public final static String HQL_LIKE_LEFT = "%val"; /** 拼接 純SQL語句 操作 */ public final static String HQL_ADD_SQL = "sql"; /** * 大于號拼接;key>value * * @param dc * @param key * @param value */ public static void addGt(DetachedCriteria dc, String key, Object value) { addSign(dc, HQL_SIGN_GT, key, value); } /** * 小于號拼接;key<value * * @param dc * @param key * @param value */ public static void addLt(DetachedCriteria dc, String key, Object value) { addSign(dc, HQL_SIGN_LT, key, value); } /** * 等于號拼接;key=value * * @param dc * @param key * @param value */ public static void addEq(DetachedCriteria dc, String key, Object value) { addSign(dc, HQL_SIGN_EQ, key, value); } /** * 大于等于號拼接;key>=value * * @param dc * @param key * @param value */ public static void addGe(DetachedCriteria dc, String key, Object value) { addSign(dc, HQL_SIGN_GE, key, value); } /** * 小于等于號拼接;key<=value * * @param dc * @param key * @param value */ public static void addLe(DetachedCriteria dc, String key, Object value) { addSign(dc, HQL_SIGN_LE, key, value); } /** * 全like拼接; key like %value% * * @param dc * @param key * @param value */ public static void addAnywhere(DetachedCriteria dc, String key, Object value) { addSign(dc, HQL_LIKE_ANYWHERE, key, value); } /** * 右like拼接; key like value% * * @param dc * @param key * @param value */ public static void addRight(DetachedCriteria dc, String key, Object value) { addSign(dc, HQL_LIKE_RIGHT, key, value); } /** * 左like拼接; key like %value * * @param dc * @param key * @param value */ public static void addLeft(DetachedCriteria dc, String key, Object value) { addSign(dc, HQL_LIKE_LEFT, key, value); } /** * 不等于號拼接; key != value * * @param dc * @param key * @param value */ public static void addNe(DetachedCriteria dc, String key, Object value) { addSign(dc, HQL_SIGN_NE, key, value); } /** * 區間拼接; key between value1 and value2 * * @param dc * @param key * @param value */ public static void addBetween(DetachedCriteria dc, String key, Object value1, Object value2) { addSign(dc, HQL_SIGN_BETWEEN, key, value1, value2); } /** * null值拼接;key is null * * @param dc * @param key */ public static void addNull(DetachedCriteria dc, String key) { addSign(dc, HQL_SIGN_NULL, key); } /** * null值拼接;key is not null * * @param dc * @param key */ public static void addNotNull(DetachedCriteria dc, String key) { addSign(dc, HQL_SIGN_NO_NULL, key); } /** * in 拼接;key in value1 * * @param dc * @param key */ public static void addIn(DetachedCriteria dc, String key, Object value) { addSign(dc, HQL_SIGN_IN, key, value); } /** * sql 拼接;原dc的語句后接上key * * @param dc * @param key */ public static void addSQL(DetachedCriteria dc, String key) { addSign(dc, HQL_ADD_SQL, key); } /** * 根據符號拼接條件 * * @param dc * @param sign * 符號 * @param key * @param value */ @SuppressWarnings("rawtypes") public static void addSign(DetachedCriteria dc, String sign, String key, Object... value) { if (dc == null || StringUtils.isBlank(sign) || StringUtils.isBlank(key)) { return; } if (HQL_SIGN_EQ.equals(sign)) { dc.add(Restrictions.eq(key, value[0])); } else if (HQL_SIGN_GT.equals(sign)) { dc.add(Restrictions.gt(key, value[0])); } else if (HQL_SIGN_LT.equals(sign)) { dc.add(Restrictions.lt(key, value[0])); } else if (HQL_SIGN_GE.equals(sign)) { dc.add(Restrictions.ge(key, value[0])); } else if (HQL_SIGN_LE.equals(sign)) { dc.add(Restrictions.le(key, value[0])); } else if (HQL_LIKE_ANYWHERE.equals(sign)) { dc.add(Restrictions.like(key, String.valueOf(value[0]), MatchMode.ANYWHERE)); } else if (HQL_LIKE_RIGHT.equals(sign)) { dc.add(Restrictions.like(key, String.valueOf(value[0]), MatchMode.START)); } else if (HQL_LIKE_LEFT.equals(sign)) { dc.add(Restrictions.like(key, String.valueOf(value[0]), MatchMode.END)); } else if (HQL_SIGN_NE.equals(sign)) { dc.add(Restrictions.ne(key, value[0])); } else if (HQL_SIGN_BETWEEN.equals(sign)) { dc.add(Restrictions.between(key, value[0], value[1])); } else if (HQL_SIGN_NULL.equals(sign)) { dc.add(Restrictions.isNull(key)); } else if (HQL_SIGN_NO_NULL.equals(sign)) { dc.add(Restrictions.isNotNull(key)); } else if (HQL_SIGN_IN.equals(sign)) { if (value[0] instanceof Collection) { dc.add(Restrictions.in(key, (Collection) value[0])); } else { dc.add(Restrictions.in(key, value)); } } else if (HQL_ADD_SQL.equals(sign)) { dc.add(Restrictions.sqlRestriction(key)); } } /** * 獲得與表有對應關系的類屬性集合 * * @param <T> * @param claz * @return */ public static <T> List<Field> getTableFields(Class<T> claz) { List<Field> list = new ArrayList<Field>(); Field[] fields = claz.getDeclaredFields(); for (Field field : fields) { Column c = field.getAnnotation(Column.class); if (c != null && StringUtils.isNotBlank(c.name())) { list.add(field); } } return list; }
}</pre></div>
OrderEnum.java
import org.hibernate.criterion.Order; public enum OrderEnum { /** * ID倒序 */ IdDesc(Order.desc("id")), /** * ID正序 */ IdAsc(Order.asc("id")); private Order value; private OrderEnum(Order value) { this.value = value; } public Order getValue() { return value; } }Domain.java
import java.io.Serializable; public interface Domain extends Serializable { Long getId(); void setId(Long id); }
好吧,上面的這4個文件放項目里呢,但怎么用呢?看下面: OrderDetailDao.java文件: public class OrderDetailDao extends GeneralDao<OrderDetail> { private static final long serialVersionUID = -5007246085129055012L; } OrderDetail.java文件: import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; import org.hibernate.annotations.GenericGenerator; /** * 訂單明細 */ @Entity @Table(name = "T_BIZ_ORDER_DETAIL") @org.hibernate.annotations.Entity(mutable = true, dynamicInsert = true, dynamicUpdate = true) @org.hibernate.annotations.Proxy(lazy = true) @org.hibernate.annotations.Table(appliesTo = "T_BIZ_ORDER_DETAIL") public class OrderDetail implements Domain { private static final long serialVersionUID = -7113529240537274966L; @Id @GeneratedValue(generator = "identity") @GenericGenerator(name = "identity", strategy = "identity") @Column(name = "id", nullable = false, length = 19) Long id; // 主鍵ID @Column(name = "status", length = 50) String status; // 1待審核,2審核通過,3審核失敗 @Column(name = "exportStatus", length = 50) String exportStatus; @Column(name = "orderType", length = 50) String orderType; @Transient String statusTxt; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getExportStatus() { return exportStatus; } public void setExportStatus(String exportStatus) { this.exportStatus = exportStatus; } public String getOrderType() { return orderType; } public void setOrderType(String orderType) { this.orderType = orderType; } public String getStatusTxt() { return statusTxt; } public void setStatusTxt(String statusTxt) { this.statusTxt = statusTxt; } }本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!