zoukankan      html  css  js  c++  java
  • 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 整合开发】。
  • 相关阅读:
    想自己创业想好了项目,但是没有资金怎么办?
    如果创业失败负债了,你选择先回去工作还债还是借贷继续创业?
    创业期间,应该怎么样坚持下去?如何从容面对困难?
    为什么在一线上班的员工比坐办公室的人更容易创业?
    四十多岁的男人还适合重新创业吗?
    未来10年什么行业发展比较好?
    假如有三百多万存款,做什么稳健实体生意好?
    2元钱可以创造多大的价值?
    创业初期要找什么样的合作人?
    debug
  • 原文地址:https://www.cnblogs.com/daimajun/p/7073909.html
Copyright © 2011-2022 走看看