Hibernate 应知应会

    Hibernate 的关联关系的配置:

  一对一外键约束:

举例子是一个丈夫和妻子:【一个丈夫只能有一位妻子】

表结构:

CREATE TABLE `tbl_hus` (
  `uuid` bigint(10) NOT NULL auto_increment,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY  (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `tbl_wife` (
  `uuid` bigint(10) NOT NULL auto_increment,
  `name` varchar(30) NOT NULL,
  `husUuid` bigint(10) NOT NULL,
  PRIMARY KEY  (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

妻子表中有个外键,是丈夫的 uuid,所以称丈夫类为主方,妻子类为从放。

在 Model 中:

下面是我实现的 Hibernate 的 Dao 层:

        Spring 为整合 Hibernate3 提供了两个工具类,分别是 HibernateTemplate 和 HibernateDaoSupport ,但是 Spring 不推荐使用这两个实现 Dao 层,因为操作复杂 CRUD 不是很灵活,而是推荐使用通过注入 SessionFactory 的方式,用过 getCurrentSession() 获取当前线程的 Session 对象,然后进行持久化。

下面是我在自己练手项目中实现的 dao 模块的一部分:

1 .  Dao层的顶层接口类:

package dao;

import java.io.Serializable;
import java.util.List;

/**
 * Dao层的顶层接口
 * 
 * @author 码上猿梦
 *  http://www.cnblogs.com/daimajun/
 * @param <T>
 */
public interface BaseDao<T> {
    /**
     * 根据类和主键值获取一个实体对象
     * @return
     */
    T get(Class<T> entityClazz, Serializable id);
    
    /**
     * 根据实体对象保存数据
     * @param entity
     * @return
     */
    Serializable save(T entity);
    
    /**
     * 根据实体对象更新数据
     * @param eneity
     */
    void update(T eneity);
    
    /**
     * 根据实体对象删除数据
     * @param entity
     */
    void delete(T entity);
    
    /**
     * 根据实体类型和主键id删除数据
     * @param entityClazz
     * @param id
     */
    void deleteById(Class<T> entityClazz,Serializable id);
    
    /**
     * 根据实体类型获取其所有对象,并封装为List集合
     * @param entityClazz
     * @return
     */
    List<T> findAll(Class<T> entityClazz);
    
    /**
     * 根据实体类获取对象总数
     * @param entityClazz
     * @return
     */
    Long findCount(Class<T> entityClazz);
}

2 . Dao层的空实现类:【用于注入 SessionFactory】

package dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.SessionFactory;

import dao.BaseDao;

/**
 * BaseDao的空实现
 *     用于注入SessionFactory
 * 
 * @author 码上猿梦
 *  http://www.cnblogs.com/daimajun/
 * @param <T>
 */
public class BaseDaoEmptyImpl<T> implements BaseDao<T> {

    /**
     * 会话工厂
     */
    private SessionFactory sessionFactory;
    
    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    
    /**
     * 注入SessionFactory
     * @param sessionFactory
     */
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    public T get(Class<T> entityClazz, Serializable id) {
        return null;
    }

    @Override
    public Serializable save(T entity) {
        return null;
    }

    @Override
    public void update(T eneity) { }

    @Override
    public void delete(T entity) { }

    @Override
    public void deleteById(Class<T> entityClazz, Serializable id) { }

    @Override
    public List<T> findAll(Class<T> entityClazz) {
        return null;
    }

    @Override
    public Long findCount(Class<T> entityClazz) {
        return null;
    }
}

3 . Dao层实现类:

package dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;

/**
 * Dao层的实现类
 * 
 * @author 码上猿梦
 *  http://www.cnblogs.com/daimajun/
 * @param <T>
 */
public class BaseDaoImpl<T> extends BaseDaoEmptyImpl<T> {

    @Override
    public T get(Class<T> entityClazz, Serializable id) {
        return this.getSessionFactory().getCurrentSession().get(entityClazz, id);
    }

    @Override
    public Serializable save(T entity) {
        return getSessionFactory().getCurrentSession().save(entity);
    }

    @Override
    public void update(T eneity) {
        getSessionFactory().getCurrentSession().saveOrUpdate(eneity);
    }

    @Override
    public void delete(T entity) {
        getSessionFactory().getCurrentSession().delete(entity);
    }

    @Override
    public void deleteById(Class<T> entityClazz, Serializable id) {
        this.getSessionFactory().getCurrentSession()
        .createQuery("delete" + entityClazz.getSimpleName() + "en where en.id = ?0")
        .setParameter(0, id)
        .executeUpdate();
    }

    @Override
    public List<T> findAll(Class<T> entityClazz) {
        return find("select * en from" + entityClazz.getSimpleName() + "en");
    }

    /**
     * 
     */
    @Override
    public Long findCount(Class<T> entityClazz) {
        List<T> list = find("select" + entityClazz.getFields()[0].toString() + "from" + entityClazz.getSimpleName() + "en");
        if (null!=list && list.size()==1 ) {
            return (Long)list.get(0);
        }
        return 0L;
    }
    
    /**
     * 根据Hql语句查询
     * @param Hql
     * @return
     */
    @SuppressWarnings("unchecked")
    protected List<T> find(String Hql) {
        List<T> list = getSessionFactory().getCurrentSession().createQuery(Hql).list();
        return list;
    }
    
    /**
     * 根据带参数的Hql语句查询数据
     * @param Hql
     * @param params
     * @return
     */
    @SuppressWarnings("unchecked")
    protected List<T> find(String Hql,Object...params) {
        Query query = getSessionFactory().getCurrentSession().createQuery(Hql);
        for (int i = 0; i < params.length; i++) {
            query.setParameter(i + "", params[i]);
        }
        return query.list();
    }
    
    /**
     * 使用Hql语句,执行分页查询
     * @param hql
     * @param pageNo 当前页码
     * @param pageSize 每页大小
     * @return
     */
    @SuppressWarnings("unchecked")
    protected List<T> findByPage(String hql, int pageNo, int pageSize) {
        Query query = getSessionFactory().getCurrentSession().createQuery(hql);
        query.setFirstResult((pageNo-1) * pageSize).setMaxResults(pageSize);
        return query.list();
    }
    
    /**
     * 使用带参的Hql语句,进行分页查询
     * @param Hql
     * @param pageNo 当前页码
     * @param pageSize 每页大小
     * @param params
     * @return
     */
    @SuppressWarnings("unchecked")
    protected List<T> findByPage(String Hql, int pageNo, int pageSize, Object...params) {
        Query query = getSessionFactory().getCurrentSession().createQuery(Hql);
        for (int i = 0; i < params.length; i++) {
            query.setParameter(i, params[i]);
        }
        query.setFirstResult(pageNo).setMaxResults(pageSize);
        return query.list();
    }
}
代码思路来源于【轻量级JavaEE 企业级应用实战第4版 Struts2 + Spring + Hibernate 整合开发】。
原文地址:https://www.cnblogs.com/daimajun/p/7073909.html