设为首页 加入收藏

TOP

Spring Boot-------JPA——EntityManager构建通用DAO(一)
2017-10-13 10:36:08 】 浏览:3809
Tags: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+"--
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇java类加载详解 下一篇idea的快捷键

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目