Spring Boot-------JPA——EntityManager构建通用DAO
Posted 坚持到底gl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot-------JPA——EntityManager构建通用DAO相关的知识,希望对你有一定的参考价值。
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(); } }
这一套就可以完成一个项目的差不多增删改查了,需要其他特殊功能的可以自行添加
【版本声明】本文为博主原创文章,转载请注明出处
以上是关于Spring Boot-------JPA——EntityManager构建通用DAO的主要内容,如果未能解决你的问题,请参考以下文章