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> {@PersistenceContextprivate EntityManager entityManager;@Transactional@Overridepublic boolean save(T entity){boolean flag=false;try {entityManager.persist(entity);flag=true;}catch (Exception e){System.out.println("---------------保存出错---------------");throw e;}return flag;}@Transactional@Overridepublic Object findByid(Object o,Long id) {return entityManager.find(o.getClass(),id);}@Transactional@Overridepublic 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;}@Overridepublic 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@Overridepublic 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@Overridepublic 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@Overridepublic 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@Overridepublic boolean update(T entity) {boolean flag = false;try {entityManager.merge(entity);flag = true;} catch (Exception e) {System.out.println("---------------更新出错---------------");}return flag;}@Transactional@Overridepublic 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@Overridepublic boolean delete(T entity) {boolean flag=false;try {entityManager.remove(entityManager.merge(entity));flag=true;}catch (Exception e){System.out.println("---------------删除出错---------------");}return flag;}@Overridepublic 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

Spring Boot-------JPA——EntityManager构建通用DAO相关推荐

  1. Spring Boot JPA 2.7.2

    icon: edit date: 2022-01-02 category: CategoryA tag: tag A tag B star: true Spring Boot JPA 2.7.2 项目 ...

  2. Spring Boot JPA中关联表的使用

    文章目录 添加依赖 构建Entity 构建Repository 构建初始数据 测试 Spring Boot JPA中关联表的使用 本文中,我们会将会通过一个Book和Category的关联关系,来讲解 ...

  3. Spring Boot JPA的查询语句

    文章目录 准备工作 Containing, Contains, IsContaining 和 Like StartsWith EndsWith 大小写不敏感 Not @Query Spring Boo ...

  4. Spring Boot JPA中java 8 的应用

    文章目录 Optional Stream API CompletableFuture Spring Boot JPA中java 8 的应用 上篇文章中我们讲到了如何在Spring Boot中使用JPA ...

  5. 使用Spring Boot和GraphQL构建安全的API

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. Grap ...

  6. (转)Spring Boot(五):Spring Boot Jpa 的使用

    http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html 在上篇文章Spring Boot(二):Web 综合开发中简单介 ...

  7. Spring Boot+JPA 有查询条件的查询

    本篇介绍使用JPA 的条件查询, 关于JPA基本查询可以参考: Spring Boot+JPA 查询数据方式与代码演示 不安全的查询 在开发时, 为了简便, 习惯会拼接Where子句的查询条件, 查询 ...

  8. Spring Boot Jpa 表名小写转大写

    今天在使用SpringBoot整合Hibernate后创建表,表名为小写,而在linux下,mysql的表名是区分大小写的,因此在我的数据表中,就出现了两个一样的表 act_id_user 和  AC ...

  9. Spring Boot Jpa 配置多个数据源,并读取其中一个表的具体数据

    总体简介: Spring Boot Jpa配置多个数据源(此次两个mysql数据库),访问其中一个库 alime_counsel_assign_log下的assign_data_backflow表,实 ...

最新文章

  1. 设计模式之原型模式(Prototype)摘录
  2. 点击除元素以外的任意地方隐藏元素js
  3. 智慧停车介绍、产业链市场全透析
  4. Internet Explorer 8 使用技巧(2):加速器
  5. centos8共享文件夹挂载_MacOS自动挂载nfs服务器共享目录
  6. 数据中心运维认证中的管理要求
  7. 阿里巴巴开源容器镜像加速技术
  8. C++编程笔记:C++用new与不用new创建对象的区别
  9. [Effective JavaScript 笔记]第23条:永远不要修改arguments对象
  10. bigru参数计算_[数据挖掘]华中科技大学 李黎 周达明:基于CNN-BiGRU模型的操作票自动化校验方法...
  11. jquery 分页插件
  12. 弹幕服务器维护,分布式弹幕服务架构
  13. 线性和EWMA指数加权移动平均模型
  14. 摩尔庄园怎么显示全部服务器,摩尔庄园手游怎么看自己玩的什么服,服务器查看区别方法...
  15. Google map API:查询地理位置和经纬度信息示例
  16. VSCode配置Python教程
  17. 用ipv6校园网访问gg学术
  18. Docker 学习前置,网络IP地址以及交互
  19. 如何活让自己活得充实:其实很简单,把脑子里想的东西,变成行动,就能立刻充实起
  20. mac 安装 protoc

热门文章

  1. kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】
  2. 在linux中emacs安装package.el
  3. vim文本编辑器的使用
  4. NativeXml (2):对象建立
  5. C# 学生信息管理系统 2.0
  6. oracle 删除已备份归档,通过RMAN联机全库备份,包括控制文件,归档日志文件,备份成功后,删除已备份的归档日志。...
  7. Haproxy实现负载均衡及相关配置(添加日志、设定自动刷新时间、控制访问、动静分离、读写分离)
  8. 2017小米面试题(句子反转)
  9. arraylist 初始化_ArrayList - 遍历ArrayList的三种方法
  10. 日历c语言程序,一个完整的日历程序(含有农历)