Spring Boot-------JPA——EntityManager构建通用DAO

来源:互联网 发布:java混淆工具下载 编辑:程序博客网 时间:2024/06/10 10:22

 EntityManager 是用来对实体Bean 进行操作的辅助类。他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满足条件的实体Bean。实体Bean 被EntityManager 管理时,EntityManager跟踪他的状态改变,在任何决定更新实体Bean 的时候便会把发生改变的值同步到数据库中。当实体Bean 从EntityManager 分离后,他是不受管理的,EntityManager 无法跟踪他的任何状态改变。EntityManager 的获取前面已经介绍过,可以通过@PersistenceContext 注释由EJB 容器动态注入。

  Entitymanager的核心概念图

          


 

EntityManager构建通用DAO


 

一般的开发都是需要每一个实体类都要构建一个DAO去继承JPA的一些类,我不咋喜欢这样的感觉,我比较喜欢一个项目中简洁不乱,所有偷懒的写了一个四不像的通用DAO

1、首先可以去官网看一下,了解一下entitymanager的一些方法

  • persist() :添加实体Bean
  • flush() :将实体的改变立刻刷新到数据库中
  • merge () :比较麻烦,用好了很不错,配合flush
  • Remove() :删除对象
  • createQuery() :返回Query对象,以执行JPQL语句
  • createNativeQuery() :返回Query对象,以执行SQL语句
  • refresh() :刷新实体Bean,以得到对新对象
  • contains(): 检测实体当前是否被管理中
  • clear() 分离所有当前正在被管理的实体

2、用@PersistenceContext动态注入Entitymanager

先来一个BaseDAO 

复制代码
public interface BaseAppDAO<T,ID extends Serializable> {    /**     * 保存数据对象     * @param entity     * @return     */    boolean save(T entity);    /**     * 根据id查询     * @param id     * @param t     * @return     */    T findByid(T t,Long id);    /**     * 根据表名,字段,参数查询,拼接sql语句     * @param  tablename 表名     * @param filed 字段名     * @param o 字段参数     * @return     */    List<T> findBysql(String tablename,String filed,Object o);    Object findObjiectBysql(String tablename,String filed,Object o);    /**     * 多个字段的查询     * @param tablename 表名     * @param map 将你的字段传入map中     * @return     */    List<T> findByMoreFiled(String tablename,LinkedHashMap<String,Object> map);    /**     * 多字段查询分页     * @param tablename 表名     * @param map 以map存储key,value     * @param start 第几页     * @param pageNumer 一个页面的条数     * @return     */    List<T> findByMoreFiledpages(String tablename, LinkedHashMap<String,Object> map, int start, int pageNumer);    /**     * 一个字段的分页     * @param  tablename 表名     * @param filed 字段名     * @param o 字段参数     * @param start 第几页     * @param pageNumer 一个页面多少条数据     * @return     */    List<T> findpages(String tablename,String filed,Object o,int start,int pageNumer);    /**     * 根据表的id删除数据     * @param  entity     */    boolean delete(T entity);    /**     * 更新对象     * @param e     * @return     */    boolean update(T e);    /**     * 根据传入的map遍历key,value拼接字符串,以id为条件更新     * @param tablename 表名     * @param map 传入参数放入map中     * @return     */    Integer updateMoreFiled(String tablename,LinkedHashMap<String,Object> map);    /**     * 根据条件查询总条数返回object类型     * @param tablename  表名     * @param map 传入参数放入map中     * @return     */    Object findCount(String tablename, LinkedHashMap<String,Object> map);}
复制代码

再写一个实现类BaseDAOimpl,其中注意的是@Transactional事务的注入

复制代码
/** * @author 坚持到底gl * @create 2017-09-26 10:36 * @desc **/@Repositorypublic class BaseAppDAOimpl<T,ID extends Serializable> implements BaseAppDAO<T,ID> {    @PersistenceContext    private EntityManager entityManager;    @Transactional    @Override    public boolean save(T entity){        boolean flag=false;        try {            entityManager.persist(entity);            flag=true;        }catch (Exception e){            System.out.println("---------------保存出错---------------");            throw e;        }        return flag;    }    @Transactional    @Override    public Object findByid(Object o,Long id) {        return entityManager.find(o.getClass(),id);    }    @Transactional    @Override    public List<T> findBysql(String tablename, String filed, Object o ) {        String sql="from "+tablename+" u WHERE u."+filed+"=?";        System.out.println(sql+"--------sql语句-------------");        Query query=entityManager.createQuery(sql);        query.setParameter(1,o);        List<T> list= query.getResultList();        entityManager.close();        return list;    }    @Override    public Object findObjiectBysql(String tablename, String filed, Object o) {        String sql="from "+tablename+" u WHERE u."+filed+"=?";        System.out.println(sql+"--------sql语句-------------");        Query query=entityManager.createQuery(sql);        query.setParameter(1,o);        entityManager.close();        return query.getSingleResult();    }    @Transactional    @Override    public List<T> findByMoreFiled(String tablename,LinkedHashMap<String,Object> map) {        String sql="from "+tablename+" u WHERE ";        Set<String> set=null;        set=map.keySet();        List<String> list=new ArrayList<>(set);        List<Object> filedlist=new ArrayList<>();        for (String filed:list){            sql+="u."+filed+"=? and ";            filedlist.add(filed);        }        sql=sql.substring(0,sql.length()-4);        System.out.println(sql+"--------sql语句-------------");        Query query=entityManager.createQuery(sql);        for (int i=0;i<filedlist.size();i++){            query.setParameter(i+1,map.get(filedlist.get(i)));        }        List<T> listRe= query.getResultList();        entityManager.close();        return listRe;    }    @Transactional    @Override    public List<T> findByMoreFiledpages(String tablename,LinkedHashMap<String,Object> map,int start,int pageNumber) {        String sql="from "+tablename+" u WHERE ";        Set<String> set=null;        set=map.keySet();        List<String> list=new ArrayList<>(set);        List<Object> filedlist=new ArrayList<>();        for (String filed:list){            sql+="u."+filed+"=? and ";            filedlist.add(filed);        }        sql=sql.substring(0,sql.length()-4);        System.out.println(sql+"--------sql语句-------------");        Query query=entityManager.createQuery(sql);        for (int i=0;i<filedlist.size();i++){            query.setParameter(i+1,map.get(filedlist.get(i)));        }        query.setFirstResult((start-1)*pageNumber);        query.setMaxResults(pageNumber);        List<T> listRe= query.getResultList();        entityManager.close();        return listRe;    }    @Transactional    @Override    public List<T> findpages(String tablename, String filed, Object o, int start, int pageNumer) {        String sql="from "+tablename+" u WHERE u."+filed+"=?";        System.out.println(sql+"--------page--sql语句-------------");        List<T> list=new ArrayList<>();        try {            Query query=entityManager.createQuery(sql);            query.setParameter(1,o);            query.setFirstResult((start-1)*pageNumer);            query.setMaxResults(pageNumer);            list= query.getResultList();            entityManager.close();        }catch (Exception e){            System.out.println("------------分页错误---------------");        }        return list;    }    @Transactional    @Override    public boolean update(T entity) {        boolean flag = false;        try {            entityManager.merge(entity);            flag = true;        } catch (Exception e) {            System.out.println("---------------更新出错---------------");        }        return flag;    }    @Transactional    @Override    public Integer updateMoreFiled(String tablename, LinkedHashMap<String, Object> map) {        String sql="UPDATE "+tablename+" AS u SET ";        Set<String> set=null;        set=map.keySet();        List<String> list=new ArrayList<>(set);        for (int i=0;i<list.size()-1;i++){            if (map.get(list.get(i)).getClass().getTypeName()=="java.lang.String"){                System.out.println("-*****"+map.get(list.get(i))+"------------"+list.get(i));                sql+="u."+list.get(i)+"='"+map.get(list.get(i))+"' , ";            }else {                sql+="u."+list.get(i)+"="+map.get(list.get(i))+" , ";            }        }        sql=sql.substring(0,sql.length()-2);        sql+="where u.id=? ";        System.out.println(sql+"--------sql语句-------------");        int resurlt=0;        try {            Query query=entityManager.createQuery(sql);            query.setParameter(1,map.get("id"));            resurlt= query.executeUpdate();        }catch (Exception e){            System.out.println("更新出错-----------------------");            e.printStackTrace();        }        return resurlt;    }    @Transactional    @Override    public boolean delete(T entity) {        boolean flag=false;        try {            entityManager.remove(entityManager.merge(entity));            flag=true;        }catch (Exception e){            System.out.println("---------------删除出错---------------");        }        return flag;    }    @Override    public Object findCount(String tablename, LinkedHashMap<String, Object> map) {        String sql="select count(u) from "+tablename+" u WHERE ";        Set<String> set=null;        set=map.keySet();        List<String> list=new ArrayList<>(set);        List<Object> filedlist=new ArrayList<>();        for (String filed:list){            sql+="u."+filed+"=? and ";            filedlist.add(filed);        }        sql=sql.substring(0,sql.length()-4);        System.out.println(sql+"--------sql语句-------------");        Query query=entityManager.createQuery(sql);        for (int i=0;i<filedlist.size();i++){            query.setParameter(i+1,map.get(filedlist.get(i)));        }        return query.getSingleResult();    }}
复制代码

这一套就可以完成一个项目的差不多增删改查了,需要其他特殊功能的可以自行添加

原创粉丝点击