zoukankan      html  css  js  c++  java
  • EntityManager 的复杂查询

    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
     **/
    @Repository
    public 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();
        }
    }
    复制代码

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

    原文:https://www.cnblogs.com/zhouguanglin/p/7625655.html

  • 相关阅读:
    MySQL 误操作后数据恢复(update,delete忘加where条件)
    数据预处理流程
    pandas读取大量数据的分块处理
    go语言 nil一些注意的地方
    C语言编程优化运行速度
    go语言常用内置函数
    RSA加密算法
    一致性哈希算法原理
    数据服务的分布式模型
    leetcode链表题
  • 原文地址:https://www.cnblogs.com/gyadmin/p/8599768.html
Copyright © 2011-2022 走看看