zoukankan      html  css  js  c++  java
  • Hibernate之实体类设计基本步骤

    1、先设计一个基类BaseBean

    (1)@MappedSuperclass表示实体类父类

    (2)也可以加上版本列字段version,但是注意,在save对象时如果version的值有改动,将执行insert操作而不是update,即使id是原来的id

    package com.life.hibernate.bean;
    
    import java.util.Date;
    
    import javax.persistence.Column;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.MappedSuperclass;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    @MappedSuperclass
    public class BaseBean {
    
        /**
         * 自增长主键
         */
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer id;
    
        /**
         * 删除位
         */
        @Column(nullable = false,columnDefinition="BOOLEAN default false")
        private boolean deleted;
        /**
         * 创建时间戳,默认当前时间,不可修改,不为空
         * 注意,表示CURRENT_TIMESTAMP的字段一张表只能有一个
         */
        @Column(updatable = false, nullable = false, columnDefinition = "timestamp default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
        @Temporal(TemporalType.TIMESTAMP)
        private Date dateCreated;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public boolean isDeleted() {
            return deleted;
        }
    
        public void setDeleted(boolean deleted) {
            this.deleted = deleted;
        }
    
        public Date getDateCreated() {
            return dateCreated;
        }
    
        public void setDateCreated(Date dateCreated) {
            this.dateCreated = dateCreated;
        }
    
    }

    2、通用Dao层设计

    package com.life.dao;
    
    import java.util.List;
    import java.util.Map;
    
    import org.hibernate.Query;
    
    public interface IDao<T> {
    
        /**
         * 根据id查找实体
         * 
         * @param clazz
         * @param id
         * @return
         */
        public T find(Class<T> clazz, int id);
    
        public void create(T t);
    
        public void save(T t);
    
        public void delete(T t);
    
        /**
         * 查询某页实体
         * @param hql 查询语句
         * @param firstResult 从第几条开始,注意索引从0开始
         * @param maxResults 最多返回的数据条数
         * @param map 参数键值对
         * @return
         */
        public List<T> list(String hql, int firstResult, int maxResults,
                Map<String, Object> map);
    
        public Query createQuery(String hql, Map<String, Object> map);
    
        /**
         * 查询实体
         * @param hql
         * @param map
         * @return
         */
        public List<T> list(String hql, Map<String, Object> map);
    
        /**
         * 获取记录总数
         * @param hql
         * @param map
         * @return
         */
        public int getTotalCount(String hql, Map<String, Object> map);
        
    }

    3、实现Dao层接口

    (1)getSession() throws CannotCreateTransactionException,当连接不上数据库时会抛出异常,可以在struts.xml配置异常页面

    package com.life.dao.impl;
    
    import java.util.Collection;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.springframework.transaction.CannotCreateTransactionException;
    
    import com.life.dao.IDao;
    
    public class DaoImpl<T> implements IDao<T> {
        private SessionFactory sessionFactory;
    
        @Override
        public T find(Class<T> clazz, int id) {
            // TODO Auto-generated method stub
            return (T) getSession().get(clazz, id);
        }
    
        @Override
        public void create(T t) {
            // TODO Auto-generated method stub
            getSession().persist(t);
        }
    
        @Override
        public void save(T t) {
            // TODO Auto-generated method stub
            getSession().saveOrUpdate(t);
    
        }
    
        @Override
        public void delete(T t) {
            // TODO Auto-generated method stub
            getSession().delete(t);
        }
    
        @Override
        public List<T> list(String hql, Map<String, Object> map) {
            // TODO Auto-generated method stub
            Query query = createQuery(hql, map);
            List<T> list = query.list();
            return list;
        }
    
        @Override
        public int getTotalCount(String hql, Map<String, Object> map) {
            // TODO Auto-generated method stub
            Query query = createQuery(hql, map);
            Object obj = query.uniqueResult();
            return ((Long) obj).intValue();
        }
    
        @Override
        public List<T> list(String hql, int firstResult, int maxResults,
                Map<String, Object> map) {
            // TODO Auto-generated method stub
            Query query = createQuery(hql, map);
    
            List<T> list = query.setFirstResult(firstResult)
                    .setMaxResults(maxResults).list();
            System.out.println("起始:"+firstResult);
            System.out.println("最大值:"+maxResults);
            System.out.println("实际值:"+list.size());
    
            return list;
        }
        
    
        public Session getSession() throws CannotCreateTransactionException{
            return sessionFactory.getCurrentSession();
        }
    
        public SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
    
        @Override
        public Query createQuery(String hql, Map<String, Object> map) {
            Query query = getSession().createQuery(hql);
            // TODO Auto-generated method stub
            if (map != null) {  
                Set<String> keySet = map.keySet();  
                for (String string : keySet) {  
                    Object obj = map.get(string);  
                    //这里考虑传入的参数是什么类型,不同类型使用的方法不同  
                    if(obj instanceof Collection<?>){  
                        query.setParameterList(string, (Collection<?>)obj);  
                    }else if(obj instanceof Object[]){  
                        query.setParameterList(string, (Object[])obj);  
                    }else{  
                        query.setParameter(string, obj);  
                    }  
                }  
            }  
            return query;  
        }
    
    }

     4、service层接口

    IService.class

    package com.life.service;
    
    import java.util.List;
    import java.util.Map;
    
    /**
     * 这个父接口不能作为bean在applicationContext.xml中,因为serviceImpl是虚函数
     * 
     * @author JL Service接口,基本方法
     */
    public interface IService<T> {
    
        /**
         * 根据id和对象类查找实体
         */
        public T find(Class<T> clazz, int id);
    
        /**
         * 创建实体
         */
        public void create(T t);
    
        /**
         * 保存实体
         */
        public void save(T t);
    
        /**
         * 删除实体
         */
        public void delete(T t);
    
        /**
         * 分页实体
         */
        public List<T> list(String hql, int firstResult, int maxResults,
                Map<String, Object> map);
    
        public int getTotalCount(String hql, Map<String, Object> map);
    
        List<T> list(String hql, Map<String, Object> map);
    
        List<T> listPage(String hql, int page, int maxResults,
                Map<String, Object> map);
    }

    service层接口实现IServiceImpl.class

    package com.life.service.impl;
    
    import java.util.List;
    import java.util.Map;
    
    import com.life.dao.IDao;
    import com.life.service.IService;
    
    /**
     * 由于各个实体类的create()方法有不同的业务逻辑(例如创建用户前需要检查账号是否已经存在),所以把类定义成abstract
     * 把create()方法定义成abstract,由具体的Service单独实现
     * @author JL
     */
    public abstract class ServiceImpl<T> implements IService<T>{
    
        /**
         * 通过spring的IoC注射进来
         */
        protected IDao<T> dao; 
        
        public IDao<T> getDao() {
            return dao;
        }
    
        public void setDao(IDao<T> dao) {
            this.dao = dao;
        }
    
        @Override
        public T find(Class<T> clazz, int id) {
            // TODO Auto-generated method stub
            return dao.find(clazz, id);
        }
        
        @Override
        public void create(T t){
            dao.create(t);
        }; 
        
        @Override
        public void save(T t) {
            // TODO Auto-generated method stub
            dao.save(t);
        }
    
        @Override
        public void delete(T t) {
            // TODO Auto-generated method stub
            
            dao.delete(t);
        }
    
        @Override
        public List<T> list(String hql, Map<String, Object> map) {
            // TODO Auto-generated method stub
            return dao.list(hql, map);
        }
        
        @Override
        public int getTotalCount(String hql, Map<String, Object> map) {
            // TODO Auto-generated method stub
            return dao.getTotalCount(hql, map);
        }
    
        @Override
        public List<T> list(String hql, int firstResult, int maxResults,
                Map<String, Object> map) {
            // TODO Auto-generated method stub
            return dao.list(hql, firstResult, maxResults, map);
        }
    
        @Override
        public List<T> listPage(String hql, int page, int maxResults,
                Map<String, Object> map) {
            // TODO Auto-generated method stub
            return dao.list(hql, maxResults*(page-1), maxResults, map);
    
        }
    }

    Done

  • 相关阅读:
    Python笔记(六)- 模型及Django站点管理
    Python笔记(五)--Django中使用模板
    Java中对象的复制
    Echarts堆积柱状图排序问题
    java基础
    java中的重载与重写
    struts2中配置文件的调用顺序
    struts2的工作原理
    拦截器和过滤器的区别
    Struts2中访问web元素的四种方式
  • 原文地址:https://www.cnblogs.com/xingyyy/p/3904860.html
Copyright © 2011-2022 走看看